PythonとRubyについては多くの議論がありますが、機能Xが言語Yを吸い込む理由、または言語YがXを持たないと主張する理由をすべて振り返るので、私はすべてそれらが完全に役に立たないと感じています。私はPythonを好む理由も正確に知っていますが、それも主観的であり、開発において私と同じ趣味を持っていない可能性があるため、誰もが選択するのに役立ちません。
したがって、違いを客観的にリストするのは興味深いので、「Python」のラムダは最悪です。代わりに、RubyのラムダがPythonのできないことを説明してください。主観はありません。サンプルコードは良いです!
1つの答えにいくつかの違いがないようにしてください。そして、あなたが正しいと知っているものに投票し、あなたが間違っていると知っているものに投票してください(または主観的です)。また、構文の違いは興味深いものではありません。 PythonはRubyが角かっこと終わりで行うのと同じようにインデントを使用し、@はPythonではselfと呼ばれます。
更新:これはコミュニティWikiになっているため、ここに大きな違いを追加できます。
Rubyのクラス本体にはクラス参照があります
Rubyでは、クラス本体にすでにクラス(自己)への参照があります。 Pythonでは、クラスの構築が完了するまでクラスへの参照はありません。
例:
class Kaka puts self end
この場合の自己はクラスであり、このコードは「Kaka」を出力します。クラス名を出力したり、Pythonのクラス定義本体からクラスにアクセスしたりする方法はありません(外部メソッド定義)。
すべてのクラスはRubyで変更可能です
これにより、コアクラスの拡張機能を開発できます。これがrails拡張機能の例です。
class String def start_with?(other)head = self [0、other.length] head == other end end
Python(""がなかったと想像してください。 startwith
メソッド):
def start_with(s、prefix):return s [:len(prefix)] == prefix
You (文字列だけでなく)任意のシーケンスで使用できます。これを使用するには、明示的にインポートする必要があります。たとえば、 from some_module import start_with
です。
RubyにはPerlのようなスクリプト機能があります
Rubyには、ファーストクラスのregexps、$変数、awk / perl行ごとの入力ループなどの機能があり、テキストファイルを変更したり、他のプログラムのグルーコードとして機能したりする小さなシェルスクリプトを作成するのに適しています。
Rubyにはファーストクラスの継続があります
callccステートメントに感謝します。 Pythonでは、さまざまな手法で継続を作成できますが、言語に組み込まれたサポートはありません。
Rubyにはブロックがあります
「do」ステートメントを使用すると、マルチを作成できます。 Rubyの無名関数を行します。これはdoの前のメソッドに引数として渡され、そこから呼び出されます。 Pythonでは、代わりにメソッドを渡すかジェネレーターを使用してこれを行います。
Ruby:
amethod {| here | many = lines + of + code going(here)}
Python(RubyブロックはPythonのさまざまな構成に対応します):
with amethod()asここで:# `amethod()はコンテキストマネージャーですmany = lines + of + code going(here)
または
for here in amethod() :# `amethod()`は反復可能なmany = lines + of + code going(here)
または
def function(here):many = lines + of + code going(here)amethod(function)#`function`はコールバックです
興味深いことに、ブロックを呼び出すためのRubyの便利なステートメントは「yield」と呼ばれます。 Pythonでジェネレーターを作成します。
ルビー:
def themethod yield 5 end themethod do | foo | puts foo end
Python:
def themethod():themethod()のfooに対してyield 5:print foo
原則は異なりますが、結果は非常に似ています。
Rubyは機能的なスタイル(パイプのような)プログラミングをより簡単にサポートします
myList.map(& :description).reject(&:empty?)。join( "")
Python:
description =(f.description()for f in mylist) "" .join(filter(len、descriptions))
Pythonにはジェネレーターが組み込まれています(上記のように、Rubyブロックのように使用されます)
Pythonは、その言語のジェネレーターをサポートしています。 Ruby 1.8では、継続を使用してブロックからジェネレーターを作成するジェネレーターモジュールを使用できます。または、block / proc / lambdaを使用することもできます!さらに、Ruby 1.9では、ファイバーはジェネレーターであり、ジェネレーターとして使用できます。Enumeratorクラスは、組み込みのジェネレーターです 4
docs.python。 orgには次のジェネレーターの例があります。
def reverse(data):for index in range(len(data)-1、-1、-1):yield data [index]
これを上記のブロック例と比較してください。
Pythonには柔軟な名前空間処理があります
Rubyでは、 require
、そのファイルで定義されたすべてのものは、最終的にグローバル名前空間になります。これにより、名前空間が汚染されます。その解決策はRubysモジュールです。ただし、モジュールを使用して名前空間を作成する場合は、その名前空間を使用して、含まれているクラスにアクセスする必要があります。
Pythonでは、ファイルはモジュールであり、含まれている名前をでインポートできます。モジュールのインポート*
から、必要に応じて名前空間を汚染します。ただし、を使用して選択した名前だけをモジュールからインポートすることもできます。別の名前
をインポートするか、単にモジュールをインポート
してからthemodule.aname
。名前空間にさらに多くのレベルが必要な場合は、モジュールと __init__。py
ファイルを含むディレクトリであるパッケージを作成できます。
Pythonにはdocstrings
Docstringsがありますモジュール、関数、およびメソッドにアタッチされ、実行時にイントロスペクトできる文字列です。これは、ヘルプコマンドや自動ドキュメントなどの作成に役立ちます。
def frobnicate(bar): "" "frobnicateはバーを取得し、それをフロブニケートします>>> bar = Bar( )>>> bar.is_frobnicated()False>>> frobnicate(bar)>>> bar.is_frobnicated()True "" "
Ruby 「同等のものはjavadocsに似ており、メソッド内ではなくメソッドの上にあります。1.9を使用して、実行時にファイルから取得できます。 "s Method#source_location 使用例
Pythonには多重継承があります
Rubyにはありません(「意図的に」-を参照) Rubyのウェブサイト
Pythonにはリスト/辞書内包表記があります
Python:
res = [x * x for x in range(1、10)]
ルビー:
res =(0..9).map {| x | x * x}
Python:
>>> (range(10)内のxのx * x)<ジェネレータオブジェクト< genexpr> 0xb7c1ccd4>で>>> list(_)[0、1、4、9、16、25、36、49、64、81]
ルビー:
p = proc {| x | x * x}(0..9).map(& p)
Python 2.7+ :
&gt ;>> {x:str(y * y)for x、y in {1:2、3:4} .items()} {1: "4"、3: "16"}
ルビー:
>>ハッシュ[{1=> 2、3 => 4} .map {| x、y | [x、(y * y).to_s]}] => {1 => "4"、3 => "16"}
Pythonにはデコレータがあります
デコレータに似たものをRubyで作成することもでき、また、Pythonほど必要ではないと主張することもできます。
構文の違い
Rubyでは、すべてのスコープを閉じるために「end」または「}」が必要ですが、Pythonではホワイトスペースのみを使用します。最近、Rubyでホワイトスペースのみのインデントを許可する試みがありました http://github.com / michaeledgar / seamless