RubyにはPythonにはない、そしてその逆は何があるのですか?


263

PythonとRubyの議論はたくさんありますが、機能Xが言語Yを吸う理由、または言語YにXがないのに実際にはそうだと主張している理由がすべて逆転するため、私はそれらすべてがまったく役に立たないと思います。また、なぜPythonを好むのかについても正確に理解していますが、これは主観的なものであり、開発の趣味が私とは異なる可能性があるため、誰もが選択する助けにはなりません。

したがって、違いを客観的にリストすることは興味深いことです。したがって、「Pythonのラムダは最悪」ではありません。代わりに、PythonができないことをRubyのラムダができることを説明してください。主観なし。サンプルコードは良いです!

1つの回答にいくつかの違いがないようにしてください。そして、あなたが知っているものは正しいものに投票し、あなたが知っているものは間違っている(または主観的である)ものに投票してください。また、構文の違いは興味深いものではありません。Pythonはインデントを使用して、Rubyが角かっこで終了するのと同じように動作し、@はPythonではselfと呼ばれます。

更新:これはコミュニティWikiになりましたので、ここで大きな違いを追加できます。

Rubyのクラス本体にはクラス参照があります

Rubyでは、クラス本体にすでにクラス(自己)への参照があります。Pythonでは、クラスの構築が完了するまで、クラスへの参照はありません。

例:

class Kaka
  puts self
end

この場合のselfはクラスであり、このコードは「カカ」を出力します。クラス名を出力したり、他の方法でPythonのクラス定義本体(メソッド定義の外部)からクラスにアクセスしたりする方法はありません。

Rubyではすべてのクラスが変更可能です

これにより、コアクラスの拡張機能を開発できます。以下は、レール拡張の例です。

class String
  def starts_with?(other)
    head = self[0, other.length]
    head == other
  end
end

Python(''.startswithメソッドがなかったと想像してください):

def starts_with(s, prefix):
    return s[:len(prefix)] == prefix

(文字列だけでなく)任意のシーケンスで使用できます。これを使用するには、明示的にインポートする必要があります(例:)from some_module import starts_with

RubyにはPerlのようなスクリプト機能があります

Rubyには、ファーストクラスの正規表現、$変数、awk / perlの行ごとの入力ループ、その他の機能があり、テキストファイルを変更したり、他のプログラムのグルーコードとして機能する小さなシェルスクリプトを作成するのに適しています。

Rubyはファーストクラスの継続を持っています

callccステートメントに感謝します。Pythonでは、さまざまな手法で継続を作成できますが、言語に組み込まれたサポートはありません。

Rubyにはブロックがあります

「do」ステートメントを使用すると、Rubyで複数行の無名関数を作成できます。この関数は、引数としてdoの前のメソッドに渡され、そこから呼び出されます。Pythonでは、代わりにメソッドを渡すか、ジェネレータを使用してこれを行います。

ルビー:

amethod { |here|
    many=lines+of+code
    goes(here)
}

Python(RubyブロックはPythonのさまざまな構成に対応しています):

with amethod() as here: # `amethod() is a context manager
    many=lines+of+code
    goes(here)

または

for here in amethod(): # `amethod()` is an iterable
    many=lines+of+code
    goes(here)

または

def function(here):
    many=lines+of+code
    goes(here)

amethod(function)     # `function` is a callback

興味深いことに、ブロックを呼び出すためのRubyの便利なステートメントは「yield」と呼ばれ、Pythonではジェネレーターを作成します。

ルビー:

def themethod
    yield 5
end

themethod do |foo|
    puts foo
end

Python:

def themethod():
    yield 5

for foo in themethod():
    print foo

原則は異なりますが、結果は驚くほど似ています。

Rubyは関数型(パイプのような)プログラミングをより簡単にサポートします

myList.map(&:description).reject(&:empty?).join("\n")

Python:

descriptions = (f.description() for f in mylist)
"\n".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、そのファイルで定義されたすべてのものが最終的にグローバルネームスペースになります。これは名前空間の汚染を引き起こします。その解決策はRubyモジュールです。ただし、モジュールで名前空間を作成する場合は、その名前空間を使用して、含まれているクラスにアクセスする必要があります。

Pythonでは、ファイルはモジュールであり、含まれている名前をfrom themodule import *でインポートして、必要に応じて名前空間を汚染することができます。ただし、を使用して選択した名前だけをインポートしfrom themodule import aname, anotherたりimport themodule、を使用して名前にアクセスしたりすることもできますthemodule.aname。名前空間のレベルを増やしたい場合は、モジュールと__init__.pyファイルを含むディレクトリであるパッケージを使用できます。

Pythonにはドキュメント文字列があります

docstringは、モジュール、関数、メソッドにアタッチされ、実行時にイントロスペクトできる文字列です。これは、helpコマンドや自動ドキュメンテーションなどの作成に役立ちます。

def frobnicate(bar):
    """frobnicate takes a bar and frobnicates it

       >>> bar = Bar()
       >>> bar.is_frobnicated()
       False
       >>> frobnicate(bar)
       >>> bar.is_frobnicated()
       True
    """

Rubyに相当するものはjavadocsに似ており、メソッド内ではなくメソッドの上にあります。これらは、1.9のMethod#source_locationの使用例を使用して、実行時にファイルから取得できます。

Pythonには多重継承があります

Rubyはそうではありません(「意図的」-RubyのWebサイトを参照してください。Rubyでの実行方法についてはこちらを参照してください)モジュールの概念を一種の抽象クラスとして再利用します。

Pythonにはリスト/辞書内包表記があります

Python:

res = [x*x for x in range(1, 10)]

ルビー:

res = (0..9).map { |x| x * x }

Python:

>>> (x*x for x in range(10))
<generator object <genexpr> at 0xb7c1ccd4>
>>> list(_)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

ルビー:

p = proc { |x| x * x }
(0..9).map(&p)

Python 2.7以降

>>> {x:str(y*y) for x,y in {1:2, 3:4}.items()}
{1: '4', 3: '16'}

ルビー:

>> Hash[{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


2
多重継承に関しては、「Rubyはしない」とだけ言っても不誠実です。Rubyでmodules / "mixin inheritance"を使用して実行できない、多重継承を使用してPythonで実行できることは何も考えられません。(単純にモジュールを含めること多重継承であるということさえ議論の余地があります。)
Logan Capaldo '11 / 07/21

2
あなたが同じことを他の方法で行うことができるということは、成り立たない議論です。ここですべてを他の方法で行うことができます。また、モジュールはクラスではないため、多重継承ではありません。Pythonの多重継承とRubyモジュールを使用した場合のコード例を寄稿していただけます。
Lennart Regebro 2009

3
モジュールはクラスではありませんが、クラスはモジュールです。%ruby -e 'p Class <Module' true
Logan Capaldo

8
-1残念ながら、この質問は目標を達成できず、主張されている違いのほとんどはまったく違いではなく、誤った情報がたくさんあります!
バイアス

2
モジュールのインクルードは、概念だけでなく、Rubyインタープリターでの実際の実装でも、実際には多重継承です。Rubyモジュールが含まれている場合、スーパークラスと同じ方法で継承チェーンに注入されます。メソッドの解像度は同じです。Rubyでは、複数のモジュールインクルードは多重継承です。多重継承が意味論的に「同じではない」としてこれに異議を唱えたい人は誰でも、ただ教訓的です。効果が同じで簡単に達成できる場合、何かが「同じもの」ではないことの意味は何ですか?違いのない区別。
Dave Sims、

回答:


34

Rubyにはブロックの概念があります。ブロックの概念は、コードのセクションを中心とした構文上の砂糖です。これらは、クロージャーを作成し、ブロックを使用する場合と使用しない場合がある別のメソッドに渡す方法です。ブロックは、yieldステートメントを通じて後で呼び出すことができます。

たとえば、上のeachメソッドの簡単な定義はArray次のようになります。

class Array
  def each
    for i in self  
      yield(i)     # If a block has been passed, control will be passed here.
    end  
  end  
end  

次に、これを次のように呼び出すことができます。

# Add five to each element.
[1, 2, 3, 4].each{ |e| puts e + 5 }
> [6, 7, 8, 9]

Pythonには匿名の関数/クロージャー/ラムダがありますが、便利な構文上の砂糖が不足しているため、ブロックはありません。ただし、アドホックな方法で取得するには、少なくとも1つの方法があります。たとえば、こちらをご覧ください


6
@Lennart:あなたの例がひどいものになっているだけでなく、構文的にも間違っています。

2
@unbeknow:A、そうです。しかし、それが印刷物の代わりに機能であったなら、それはうまくいったでしょう。Python 3ではこれは機能します:[print(e + 5)for e in [1,2,3,4]]そして恐ろしいことになると、上のルビコードは恐ろしいと思うので、それは明らかに主観的であり、したがってこの質問の一部。@ジョン私はそれが同等であると言っているのではなく、あなたの例との違いが何であるかは明らかではないと言っています。@Bastien、いいえ、しかしあなたが同じようなことをすることができるということは、それらが同じであることを意味しません。他の方法がある場合でも、ここでの違いをリストする必要があります。
Lennart Regebro 2009

22
私はPythonプログラマーです。Rubyブロックにはブロックがないため、Pythonを使用するよりも簡潔で美しいものを作成する方法の例をご覧ください。あなたの例は次のように書くことができます:[1、2、3、4]のi:print(i + 5)。ブロックは使用していませんが、簡潔で美しいだけでなく、各ルビの例も使用しています。
Manuel Ceron、

10
@ Manuel、procsは、ファンクターを重要でないデータ構造(ツリー、グラフ...)にアタッチするのに役立ちます。これは、「forループ」することができず、横方向に特別なイテレーターを必要とします。匿名プロシージャであるブロックを使用すると、ファンクターを1つの式(定義してから実装する)で実装できます。これにより、コーディングプロセスが大幅に高速化され、意図が明確になります。たとえば、グラフのデータ構造を作成している場合、1つの「各」イテレータを定義してから、Enumerableをミックスインすると、数十のイテレータ(sort、all?、any?、grep)にすぐにアクセスできます。今、あなたはブロックを呼び出します...
バイアス

4
@RommeDeSerieux、それは言語での名前が必要だからです!さらに、それは関数ではなく関数オブジェクトです。Rubyドキュメントを見てみましょう。「Procオブジェクトはローカル変数のセットにバインドされたコードのブロックです」ので、匿名のProcは単なるブロックであり、単なる関数ではありません。
バイアス

28

Pythonの例

関数はPythonの第一級の変数です。関数を宣言してオブジェクトとして渡し、上書きすることができます:

def func(): print "hello"
def another_func(f): f()
another_func(func)

def func2(): print "goodbye"
func = func2

これは、最新のスクリプト言語の基本的な機能です。JavaScriptとLuaもこれを行います。Rubyは関数をこのように扱いません。関数に名前を付けると呼び出されます。

もちろん、Rubyでこれらのことを行う方法はいくつかありますが、それらは一流の操作ではありません。たとえば、Proc.newで関数をラップして変数として扱うことができますが、関数ではなくなります。「call」メソッドを持つオブジェクトです。

Rubyの関数は一流のオブジェクトではありません

Ruby関数は一流のオブジェクトではありません。関数を渡すには、関数をオブジェクトにラップする必要があります。結果のオブジェクトを関数のように扱うことはできません。関数をファーストクラスの方法で割り当てることはできません。代わりに、コンテナオブジェクトの関数を呼び出して変更する必要があります。

def func; p "Hello" end
def another_func(f); method(f)[] end
another_func(:func)      # => "Hello"

def func2; print "Goodbye!"
self.class.send(:define_method, :func, method(:func2))
func                     # => "Goodbye!"

method(:func).owner      # => Object
func                     # => "Goodbye!"
self.func                # => "Goodbye!"    

8
あなたはひどく混乱しています。ファーストクラスのオブジェクトはx = y、を呼び出すのではなく、割り当てによって割り当てられますself.class.send(:define_method, :func, method(:func2))。あなたの「反例」は、Rubyの関数がいかにファーストクラスではないかを示しています。同意できない場合は、自由に回答を投稿してください。私の混乱に固執しないでください。
Glenn Maynard、

7
def ... endrubyで定義されているものは関数ではありません。それらはメソッドです(あなたがそれらを定義した方法Kernel)。メソッドは(メソッドを使用して#method)アンバインドすることができ、それがオブジェクトになります。rubyが関数に最も近いものはProcインスタンスであり、これもオブジェクトであり、受け渡しや呼び出しが可能です。ProcJohn Feminellaが回答で説明しているよう、メソッドに単一のコールバックを渡すための特別な構文もあります
ランピオン

4
@Glenn:私はあなたが言っていることを理解しますが、Rubyの関数を再定義しているという主張を誤解します-メソッドは別の意味論的概念です。定義ゲームをプレイする場合、最も重要なコードは関数ではなくプロシージャです。私は難しいことをしようとしているのではなく、定義と正確さが重要だと思っているだけです。私はUnboundMethodtho を操作することがPITAであり得ることに同意します。
ランピオン

5
@Glenn:見る人の目には美しさがあります。それにもかかわらず、メソッドは定義を満たすことによってファーストクラスのオブジェクトです(この場合、私はWikipediaの定義を参照しています)。たぶん、あなたはファーストクラスの他の定義を持っていますか?ファーストクラスにぶつかるには、プラチナフリークエントフライヤーカードが必要ですか?
バイアス

4
@Glenn SO FAQセクションをチェックしてください。「他の人が私のものを編集できますか?!」-これはコミュニティWikiです。
バイアス

26

結局のところ、すべての回答はある程度主観的であり、これまでに投稿された回答は、他の言語では実行できない機能を同等に(類似していないとしても)指すことができないことを証明しています。 、両方の言語が非常に簡潔で表現力があるためです。

Pythonの構文が好きです。ただし、Rubyの真の美しさを見つけるには、構文よりも少し深く掘る必要があります。Rubyの一貫性には禅のような美しさがあります。これを完全に説明できる簡単な例はありませんが、私がここで意味を説明するためだけにここで考えてみます。

この文字列の単語を逆にします。

sentence = "backwards is sentence This"

あなたがそれをどのように行うかについて考えるとき、あなたは次のことをするでしょう:

  1. 文を単語に分割する
  2. 言葉を逆にする
  3. 単語を文字列に再結合する

Rubyでは、次のようにします。

sentence.split.reverse.join ' '

正確に考えると、同じシーケンスで、1つのメソッドが次々と呼び出されます。

Pythonでは、次のようになります。

" ".join(reversed(sentence.split()))

理解するのは難しいことではありませんが、まったく同じフローではありません。主題(文章)は真ん中に埋められています。操作は、関数とオブジェクトメソッドの混合です。これはささいな例ですが、Rubyを実際に操作して理解すると、特に重要なタスクについて、さまざまな例が見つかります。


1
同意する。Rubyを書いていると自然に流れるように見えるので、「zenlike」はいい言葉です。
Tin Man

18

Pythonには「私たちはすべてここにいる大人」という考え方があります。したがって、Rubyには定数のようなものがあり、Pythonにはないことがわかります(ただし、Rubyの定数は警告を出すだけです)。Pythonの考え方では、定数を作成したい場合は、変数名をすべて大文字にして、変更しないでください。

たとえば、Ruby:

>> PI = 3.14
=> 3.14
>> PI += 1
(irb):2: warning: already initialized constant PI
=> 4.14

Python:

>>> PI = 3.14
>>> PI += 1
>>> PI
4.1400000000000006

19
これは、少なくともpython 2. *では、「True、False = False、True」を実行できたことを思い出させます。Python3.0で正しく修正されたと思います...これは、あなたがすべきことです。防ぐことができます。
トム

11
個人的には、その言語で記述されたすべてのコードに一貫性を持たせるため、その言語によって実施される厳格なガイドラインが好きです。それあなたにガイドラインに従うことを強制し、あなたのコードを読んでいる開発者は一目で何が何であるかを知ることができます。ほとんどのPythonプログラマーは同じ一般的な「スタイル」を使用しますが、Rubyでは不可能であるかなり大きな不整合がいくつかありました。
サーシャチェディゴフ2009

8
@bias-なぜあなたが私に反対票を投じているのかわかりません。この答えは、Pythonのやり方に賛成または反対ではありません。それは単なる事実の表明です。
Jason Baker、

13
@ジェイソン「私たちはすべてここに大人です」は事実の声明ですか?私は機能を取り巻く意見なので、反対票と呼びたいと思います。
バイアス

7
@bias-「私たちはここではすべて大人です」と言うことは、わずかではありませんでした。これは非公式のPythonのモットーです。ここで最もよく説明されていると思います:mail.python.org/pipermail/tutor/2003-October/025932.html
Evan Porter

18

Pythonのモジュールから特定の関数のみをインポートできます。Rubyでは、メソッドのリスト全体をインポートします。Rubyでそれらを「インポート解除」することはできますが、それがすべてではありません。

編集:

このRubyモジュールを見てみましょう:


module Whatever
  def method1
  end

  def method2
  end
end

コードに含める場合:


include Whatever

method1method2の両方がネームスペースに追加されていることがわかります。インポートのみできませんmethod1。両方をインポートするか、まったくインポートしません。Pythonでは、選択したメソッドのみをインポートできます。これに名前が付いている場合、選択的インポートと呼ばれる可能性がありますか?


2
ああ、そうです!Pythonは名前空間が好きです。Rubyではそうではありませんか?あなたはimport bla; bla.foo()Rubyを使っていませんか?
Lennart Regebro 2009

2
内部にあるすべての関数ではなく、関数aのみをインポートできます。たとえば、3つの非静的関数を宣言するRubyモジュールを含めると、それらすべてが名前空間に含まれます。Pythonでは、モジュールインポート*から記述する必要があります。
ジオ

6
それは多くの名前空間の混乱につながりませんか?
Lennart Regebro、2009

1
そうだと思います。それがRubyモジュールで嫌いなことです。
Geoの

8
Rubyには、Pythonと同じ意味のモジュールシステムはありません。requireは基本的に、テキストのインクルードとして機能し、重複したインクルードのチェックが組み込まれています。モジュールを名前空間として(ab)使用できますがmodule、実際には少し誤解があります。モジュールは基本的にnewallocateメソッドではなくクラスです。これらは、ライブラリをパーティション分割するメカニズムとしてではなく、クラス/オブジェクトごとにコードを共有する方法として、またはプログラム間でコードを共有する方法として最適に機能します。
ローガンカパルド2009

16

Rubyのウェブサイトから

Pythonと同様、Rubyで...

  • インタラクティブプロンプト(irbと呼ばれます)があります。
  • コマンドラインでドキュメントを読むことができます(pydocの代わりにriコマンドを使用)。
  • 特別な行終了文字はありません(通常の改行を除く)。
  • 文字列リテラルは、Pythonの三重引用符付き文字列のように複数行にまたがることができます。
  • 大括弧はリスト用で、中括弧は辞書用です(Rubyでは「ハッシュ」と呼ばれます)。
  • 配列は同じように機能します(追加すると1つの長い配列になりますが、次のように構成します a3 = [ a1, a2 ]と配列の配列になります)。
  • オブジェクトは強く動的に型付けされます。
  • すべてがオブジェクトであり、変数はオブジェクトへの参照にすぎません。
  • キーワードは少し異なりますが、例外はほぼ同じように機能します。
  • 組み込みのdocツールがあります(Rubyはrdocと呼ばれます)。

Pythonとは異なり、Rubyでは...

  • 文字列は変更可能です。
  • 定数(値を変更しない変数)を作成できます。
  • 大文字と小文字の規則がいくつかあります(例:クラス名は大文字で始まり、変数は小文字で始まります)。
  • リストコンテナー(配列)の種類は1つだけで、変更可能です。
  • 二重引用符で囲まれた文字列は、エスケープシーケンス(\ tなど)と特別な「式置換」構文を許可します(これにより、Ruby式の結果を他の文字列に直接追加できます。 。一重引用符で囲まれた文字列は、Pythonのr「生の文字列」に似ています。
  • 「新しいスタイル」と「古いスタイル」のクラスはありません。たった一種類。
  • 属性に直接アクセスすることはありません。Rubyでは、すべてのメソッド呼び出しです。
  • メソッド呼び出しの括弧は通常オプションです。
  • Pythonの代わりに、アクセスを強制するためにパブリック、プライベート、および保護されています。 _voluntary_ underscore __convention__
  • 多重継承の代わりに「ミックスイン」が使用されます。
  • 組み込みクラスのメソッドを追加または変更できます。どちらの言語でも、いつでもクラスを開いて変更することができますが、Pythonは組み込みの変更を防止します— Rubyではできません。
  • TrueとFalseの代わりにTrueとFalseがあります(Noneの代わりにnil)。
  • 真偽をテストすると、偽とnilのみが偽の値に評価されます。それ以外はすべて真です(0、0.0、 ""、[]を含む)。
  • それはelifではなくelsifです。
  • インポートではなく必須です。それ以外は、使い方は同じです。
  • ドキュメントの生成には、(その下のdocstringではなく)上の行の通常スタイルのコメントが使用されます。
  • 覚えておくべき多くのショートカットがありますが、すぐに覚えることができます。Rubyを楽しく、生産的にする傾向があります。

2
「インポートの代わりに必要です。それ以外は使用方法は同じです。」完全に不正確であるようです。
グレンジャミン

Rubyにはめったに使用されないSetもありますが、それらは組み込まれています。つまり、stuff_in_backpack = Set.new;と言えます。stuff_in_backpack << "コンピュータ"; stuff_in_backpack << "靴"; #とセットは順序を保証することなくすべての値を保持します。
zachaysan 2011

12

RubyがPythonよりも優れているのは、そのスクリプト言語機能です。このコンテキストでのスクリプト言語は、シェルスクリプトおよび一般的なテキスト操作で「グルーコード」に使用されることを意味します。

これらは主にPerlと共有されています。ファーストクラスの組み込み正規表現、$-変数、Perl(-a、-e)などの便利なコマンドラインオプション

簡潔でありながら高度な構文と合わせて、この種のタスクに最適です。

私にとってのPythonは、動的に型付けされたビジネス言語であり、非常に学習しやすく、構文も優れています。Rubyほどクールではありませんが、きちんとしています。PythonがRubyに対して私に持っているのは、他のライブラリの膨大な数のバインディングです。Qtおよびその他のGUIライブラリへのバインディング、多くのゲームサポートライブラリおよびandおよび。Rubyははるかに少ない。たとえばデータベースへの使用頻度の高いバインディングは高品質ですが、同じライブラリでRubyバインディングも存在する場合でも、ニッチライブラリはPythonでより適切にサポートされていることがわかりました。

したがって、どちらの言語にも用途があり、どちらを使用するかを定義するタスクです。どちらも簡単に学ぶことができます。私はそれらを並べて使用します。スクリプト用のRubyおよびスタンドアロンアプリ用のPython。


1
Rubyをまだ知らない人からの質問:「$ -Variables」とはどういう意味ですか?グローバル変数ですか?その場合、Pythonでは、クラスまたは関数の外部のモジュールで定義された変数はグローバルです。そうでない場合-違いは何ですか?
Anon

1
Anon:コード内の任意の場所で$ variableを宣言すると、プレフィックスが原因でグローバルになります。したがって、それがどこで定義されているかは関係なく、常にグローバルであり、常にそのように知られています。
ロバートK

8
正確には、実際には$ _や$ 1などの事前定義された変数を意味していました。これらはルビー自体によって自動的に値で埋められます。$ _は最後に読み込まれた行です。$ 1、$ 2などは、最後の一致からの正規表現の一致です。完全なリストについては、こちらを参照してください:zenspider.com/Languages/Ruby/QuickRef.html#17これは、基本的にコンパクトスクリプトのハックです。API呼び出しでもすべての情報を取得できますが、$変数を使用するとより簡潔になります。このような種類の変数は、Pythonのスタイルに合わないだけで、意図的に省略されています。
haffax 2009

そのzenspiderリンクをありがとう-Rubyの素早い(チュートリアルではない)感覚のためにそのような何かを探していました。
Anon

12

「RubyにはXがあり、Pythonにはないが、PythonにはYがあり、Rubyにはない」が、それを見るのに最も便利な方法だとは思いません。それらは非常によく似た言語であり、多くの共有機能があります。

大きな違いは、言語がエレガントで読みやすいものにすることです。あなたが育てた例を使用すると、理論的には両方にラムダがありますが、Pythonプログラマーはそれらを回避する傾向があり、それらを使用して作成されたコンストラクトは、Rubyのように可読性や慣用性に近く見えません。だから、Pythonで、優れたプログラマは、それが実際にという理由だけで、彼はRubyで希望よりも、問題の解決に別のルートを取ることになるでしょうそれを行うには良い方法。


5
ラムダのスコープは限られており、多くの場合役に立たないことに同意します。しかし、私はPythonプログラマーがペストのようにそれらを回避すると言っているのは公平ではないと思います。
Jason Baker、

1
私はラムダがPythonで頻繁に使用されることに同意します-map、filter、reduceなど。大きな違いは、Pythonのラムダは式に制限されているのに対し、Rubyブロックは複数行になり、ステートメントが含まれる可能性があることです。私がRubyについて読んだことからの私の一般的な印象は、この機能は特にRubyistをDSLアプローチに向かわせる一方、PythonistaはAPIを作成する傾向があるということです。Rubyに関する私の情報はまだ非常に表面的です。
Anon

2
@Lennart:複数行ブロックは常にRubyで使用されます-実際には、慣用的なPythonコードで使用されているラムダよりも頻繁に使用されます。一般的な例については、info.michael-simons.eu/2007/08/06/rails-respond_to-methodをご覧ください。
チャック

1
@Lennart:いいえ、利回りは使用しません。(Rubyの生成量はとにかくPythonの生成量とは完全に異なります。ジェネレーターは返されません。)を記述しても意味がありませんfor format in respond_to()。このrespond_toメソッドは意味のあるものを何も返しません-現在のHTTPリクエストに応答するだけです。do中には、respond_to doブロックの始まりです。そのブロックではformat、HTTPリクエストに応答するための非常に基本的なDSLを実装する一時オブジェクト(この例ではラベルが付いています)と対話します。
チャック、

3
ジェネレータに対して「列挙型をミックスイン」して、すぐに30の新しい素晴らしいイテレータを取得できますか ブロック/プロシージャが優れている理由を理解する前に、言語全体を確認する必要があります。
バイアス

12

私は元の質問の変形を提案したいと思います、「RubyにはPythonにはない、そしてその逆は何があるのですか?」「まあ、IntercalではできないRubyやPythonで何ができるの?」という残念な答えを認めているのはどちらでしょうか。PythonとRubyはどちらも、チューリング近似である王座に座っている広大な王室の一部であるため、そのレベルには何もありません。

しかし、これはどうですか:

このような美しさと優れたエンジニアリングを備えたRubyではできない、またはその逆でPythonで優雅かつうまくできることは何ですか?

それは単なる機能比較よりもはるかに興味深いかもしれません。


せいぜいコメント。まだ私の+1
1

11

Pythonにはリスト内包表記とジェネレーターの明示的な組み込み構文がありますが、Rubyではマップブロックとコードブロックを使用します。

比較する

list = [ x*x for x in range(1, 10) ]

res = (1..10).map{ |x| x*x }

リスト内包表記は単純なPythonではないのですか?Pythonにもマップ関数があります。
SilentGhost 2009

しかし、Rubyにはリスト内包構文はありません
Dario

Python:res = map(lambda x:x * x、range(1,10))
GogaRieger

Python:res=map(2 .__rpow__, range(1,10))
John La Rooy、2013

11

「大文字で始まる変数は定数になり、変更できません」

違う。彼らはできます。

警告が出た場合にのみ警告が表示されます。


2
言語によって操作の警告が表示される場合、その操作は「不可能」と見なすことができると私は考えています。それ以外は狂気です。
porgarmingduod 2011年

11

インフラストラクチャ側のもう少し:

  • PythonはC ++との統合がはるかに優れています(Boost.PythonSIPなどの機能を介して、Rubyよりも、Py ++、オプションは、RubyインタープリターAPIに対して直接書き込むように見えます(もちろん、Pythonでも実行できます)。どちらの場合も、そうすることは低レベルで面倒でエラーが発生しやすくなります)またはSWIGを使用します(これは機能し、多くの言語をサポートする場合は間違いなく優れていますが、Boost.PythonまたはSIPほど優れていません。あなたは特にC ++をバインドしようとしています)。

  • Pythonには多くのWebアプリケーション環境(Django、Pylons / Turbogears、web.py、おそらく少なくとも他の6種類)がありますが、Ruby(効果的に)にはRailsがあります。(他のRuby Webフレームワークは確かに存在しますが、Railsに大きな影響を与えるのは難しいようです)。この側面は良いですか悪いですか?言うのは難しく、おそらくかなり主観的です。私は、Pythonの状況がより良く、Rubyの状況がより良いという議論を容易に想像できます。

  • 文化的には、PythonとRubyのコミュニティーは多少異なるように見えますが、Rubyコミュニティーとのやり取りにそれほど経験がないので、これをほのめかすことができます。これは主に、両方について多くの経験を持つ誰かがこの声明を増幅(または拒否)できることを期待して追加しています。


7
2番目のポイントはせいぜい誤解されています。まず、ラックとシナトラ
Max Ogden

6
他のRailsスタックが存在することを明確に述べます。誰かが実際に使っているとは思いません。シナトラとラックをチェックしても、その印象は正確には変わりませんでした。本当に、たとえば、シナトラ(合計94問の質問)、また​​はキャンプ(合計2問の質問)、また​​は他のいずれかが実際に実際のユーザーベース/コミュニティを持っていると思いますか?それらのほとんどは、私が知る限り、実際のユーザーすら持っていません。Django(4K +)またはRails(7K +)、さらにはweb.pyと比較してください。
ジャックロイド

1
Sinatraは、そのDSLにより、実際にはさまざまな軽量タスクでかなり人気があります。RailのMVCはより多くを提供するため、あまり使用されません。Railsは実際にはRack上に構築されています-それがPhusion Passengerを可能にするものです。
代替

11

恥知らずにコピー/貼り付け:Alex MartelliPythonよりもRubyの優れている点」のスレッドから回答 comp.lang.pythonのメーリングリスト。

2003年8月18日、午前10時50分、エリックマックスフランシスは次のように書いています。

「Brandon J. Van Every」はこう書いている:

PythonよりRubyのほうが優れている点は何ですか?きっと何かあると思います。それは何ですか?

Pythonの人ではなく、Rubyの人にこれを尋ねるほうがはるかに理にかなっているのではないでしょうか。

たとえば、Pythonコミュニティの「社会学的調査」が目的に含まれている場合、そのコミュニティに質問を投稿すると、他の場所に情報を公開するよりも、その情報に関するより多くの情報を明らかにする可能性が高くなります。 :-)。

個人的に、私はこの機会を利用して、最後のOSCONでデイブ・トーマスの1日Rubyチュートリアルをたどることができました。構文の違いの薄いベニアの下で、RubyとPythonは驚くほど似ています-ほぼすべての言語セットの中で最小スパニングツリーを計算している場合、PythonとRubyが最初に合体する2つの葉になると確信しています中間ノード:-)。

確かに、Rubyでは、各ブロックの最後に(単にインデントを解除するのではなく)愚かな "end"を入力することにうんざりしています。各ブロックの 開始なので、ほぼ洗浄です:-)。'@foo'と 'self.foo'のような他の構文の違い、またはRubyとPythonの大文字と小文字の違いの重要性は、私にとってはほとんど同じです。

他の人は間違いなくプログラミング言語の選択をそのような問題だけに基づいており、最もホットな議論を生み出しています-しかし私にとってそれは行動中のパーキンソンの法則の1つの例にすぎません(問題に関する議論の量は問題の問題に反比例します)実際の重要性)。

編集する(AM 6/19/2010 11:45):これは「バイクシェッドのペイント」(または略して「bikeshedding」)とも呼ばれます。ここでも、「ディベート」を提供したノースコートパーキンソンを参照しています。 「ささいな話題についての熱い議論」の典型的な例として、「バイクシェッドを塗る色」について。(編集終了)。

私が重要だと思う構文の違いの1つは、Pythonの好意ですが、他の人々はその逆を疑うことはありません-「パラメーターをとらない関数を呼び出す方法」です。Pythonでは(Cのように)関数を呼び出すには、常に「呼び出し演算子」を適用します。つまり、呼び出すオブジェクトの直後に括弧を付けます(これらの括弧の内側は、呼び出しで渡した引数に移動します。引数を渡さない場合、括弧は空になります)。これは、 演算子を含まないオブジェクト。オブジェクトへの参照のみを意味します。どのようなコンテキストでも、特別なケース、例外、アドホックルールなどはありません。Rubyでは(Pascalのように)引数付きの関数を呼び出すには、引数を渡します(通常はかっこで囲みますが、常にそうではありません)。これは多くの人々(少なくとも間違いなく、Pascal、またはVisual Basicなどの同様の「暗黙の呼び出し」を使用する他の言語でプログラミングの経験があった人)の期待に応えるかもしれませんが、私にとっては、オブジェクトの単なる言及は、オブジェクトのタイプに応じて、オブジェクトへの参照、またはオブジェクトへの呼び出しを意味する可能性があります-そして私ができる場合 単に言及するだけでオブジェクトへの参照を取得する「明示的にこれを参照してください。呼び出さないでください」を明示的に使用する必要があります。それ以外の場合は不要な演算子。これは、関数(またはメソッド、またはその他の呼び出し可能なオブジェクト)の「ファーストクラス」と、オブジェクトをスムーズに交換する可能性に影響を与えると感じています。したがって、私にとって、この特定の構文の違いはRubyに対する深刻なブラックマークです-しかし、私はそれらに激しく異議を唱えることがほとんどできなかったとしても、他の人がなぜそうしないのかを理解しています:-)。関数(またはメソッド、またはその他の呼び出し可能なオブジェクト)とオブジェクトをスムーズに交換する可能性。したがって、私にとって、この特定の構文の違いはRubyに対する深刻なブラックマークです-しかし、私はそれらに激しく異議を唱えることがほとんどできなかったとしても、他の人がなぜそうしないのかを理解しています:-)。関数(またはメソッド、またはその他の呼び出し可能なオブジェクト)とオブジェクトをスムーズに交換する可能性。したがって、私にとって、この特定の構文の違いはRubyに対する深刻なブラックマークです-しかし、私はそれらに激しく異議を唱えることがほとんどできなかったとしても、他の人がなぜそうしないのかを理解しています:-)。

構文の下で、基本的なセマンティクスのいくつかの重要な違いについて説明します。たとえば、Rubyの文字列は(C ++のように)可変オブジェクトですが、Pythonでは(Javaのように)可変ではありません。繰り返しますが、すでに慣れ親しんでいるもので主に判断する人は、これがRubyのプラスであると考えるかもしれません(もちろん、JavaまたはC#に精通している場合を除きます:-)。私は、不変文字列は優れたアイデアだと思います(そして、Javaが独立して、すでにPythonにあったアイデアを再発明したことには驚くことではありません)が、「可変文字列バッファ」タイプも気にしないでしょう。 (理想的には、Java独自の「文字列バッファ」よりも使いやすさが優れているもの)。親しみやすさのため、この判断はしません。Javaを学ぶ前に、 すべてのデータは不変であり、私が知っているすべての言語には可変文字列がありましたが、Javaで不変文字列のアイデアを初めて見たとき(Pythonを学ぶ前によく学びました)、すぐに優れた、非常に適していると感じましたより高いレベルのプログラミング言語の参照セマンティクス(マシンに近い言語やCなどのアプリケーションから遠い言語に最適なセマンティクスとは対照的に)重要)データ型。

Rubyには基本的なセマンティクスでいくつかの利点があります。たとえば、Pythonの「リストとタプル」の非常に微妙な区別が削除されています。しかし、ほとんどの場合、スコアは(私が保持しているように、単純で大きなプラスと微妙な巧妙な違い、顕著なマイナス)、Rubyに反対です(たとえば、閉じた間隔と半分開いた間隔の両方を持ち、表記a..bおよびa .. .b [ どっちがどっちかが明らかだと主張したい人はいますか?-)]はばかげています-もちろん私見です!)繰り返しますが、言語の中核に似ているが微妙に異なるものがたくさんあることをMINUSではなくPLUSと見なしている人は、もちろん、これらの数え方から「逆の方法」で数えます。

これらの比較に惑わされて、2つの言語が 非常に違う、気にして。そうではありません。しかし、「カペッリダンジェロ」と「スパゲッティーニ」を比較するように依頼された場合、これらの2種類のパスタは誰にとってもほとんど区別がつかず、準備したいどの料理でも交換可能であることを指摘した後、必然的に長さおよび直径がわずかに異なる方法、一方のケースでストランドの端が先細りになっている方法など、他のケースではどのようにテーパ付けされていないかを顕微鏡検査に移す-私が個人的にむしろカペッリdを使用する理由を試して説明するあらゆる種類のスープのパスタとしてのアンジェロですが、そのような長く薄いパスタの形(オリーブオイル、ニンニク、ミンチレッドピーマン、細かく挽いたアンチョビ)に適したソースと一緒にパスタシュータとしてスパゲッティーニを好むでしょう。たとえば、ニンニクとピーマンを細かく刻むのではなくスライスした場合は、スパゲッティニの薄いエバネッセンスではなく、より堅いスパゲッティのボディを選択する必要があります。また、アンチョビを控え、代わりに新鮮な春バジルを追加することをお勧めします。または-私は異端者です...!-ライトミント...]葉-料理を出す直前の瞬間)。申し訳ありませんが、私は海外旅行をしていて、しばらくパスタを食べていなかったことを示しています。しかし、類推はまだかなり良いです!-)-ライトミント...]葉-料理を出す直前の瞬間)。申し訳ありませんが、私は海外旅行をしていて、しばらくパスタを食べていなかったことを示しています。しかし、類推はまだかなり良いです!-)-ライトミント...]葉-料理を出す直前の瞬間)。申し訳ありませんが、私は海外旅行をしていて、しばらくパスタを食べていなかったことを示しています。しかし、類推はまだかなり良いです!-)

したがって、PythonとRubyに戻ると、2つの重要な点(適切な言語の観点から、ライブラリ、ツールや環境などのその他の重要な付属品、各言語を埋め込む/拡張する方法など)がなくなります。それは今のところ-いずれにしても、各言語のすべての実装には適用されません。たとえば、JythonとClassic PythonはPython言語の2つの実装です!):

  1. RubyのイテレーターとコードブロックとPythonのイテレーターとジェネレーター。


  2. すべての組み込みクラスを含む既存のクラスを「再開」し、実行時にその動作を変更する機能を含む、Rubyの総制限のない「動的」- 対して、既存の動作を変更することのないPythonの広大だが 境界のある動的組み込みクラスとそのインスタンス。

個人的に、私は1ウォッシュを検討します(違いが非常に深いので、どちらか一方が近づいていて、もう一方を崇拝するのが嫌いな人を簡単に見ることができます。そして2つの重要な問題-Rubyを「いじくり回す」のにはるかに適したものにする1つの問題ですが、Pythonは大規模な本番アプリケーションでの使用にも等しく適しています。ある意味で面白いのは、両方の言語が他のほとんどの言語よりもはるかに動的であるため、最終的には私のPOVとの言語の主な違いはそれに関係するはずです。つまり、Rubyはこの点で「11になる」ということです(参照もちろんここは「Spinal Tap」です)。Rubyではそれができる!つまり、組み込みの文字列クラスを動的に変更して、a = "Hello World" b = "hello world" if a == b print "equal!\ n" else print "different!\ n" end WILL print "等しい"。Pythonでは、私がそれを行う方法はありません。メタプログラミング、実験的フレームワークの実装などの目的で、Rubyのこの驚くべき動的機能は非常に優れています。 魅力的。しかし-さまざまなソースからのすべての種類のライブラリを含め、多くの人々によって開発され、さらに多くの人々によって維持され、クライアントサイトで本番環境に入る必要がある大規模なアプリケーションについて話している場合は、私は望んでいないとてもダイナミックな言語です。どうもありがとうございました。いくつかのライブラリが、文字列が異なることに依存している他の無関係なライブラリを無意識のうちに壊してしまうという考えそのものを嫌います-これは、LOOKの分離とSHOULD BEの分離が必要なコードの断片の間にある、深く隠された「チャネル」のようなもので、死をもたらす大規模プログラミング。モジュールが他の「密かに」の動作に影響を与えるようにすることで、組み込み型のセマンティクスを変更する機能は、本番アプリケーションプログラミングの単なる悪い考えです。

このような大規模なアプリケーションでRubyを使用する必要がある場合、コーディングスタイルの制限、多数のテスト(すべてが変更されたときに再実行する-まったく関係のないものでも...)などに依存しようとします。この言語機能の使用を禁止します。しかし、私の意見では、そもそも機能がないことはさらに優れています。Python自体が、特定の数の組み込み関数を「釘付け」にできる場合、アプリケーションプログラミングにとってさらに優れた言語であるのと同じように、私はそれを知っていました。たとえば、len( "ciao")は4です(誰かが組み込みモジュールの「len」という名前のバインディングを変更したかどうかについて気にする必要はありません...)。最終的にPythonが組み込みを「釘付け」にしてくれることを願っています。

しかし、組み込みの再バインドは非常に非推奨であり、Pythonでまれな方法であるため、問題は軽微です。Rubyでは、 他の言語(たとえば、Dylanなど)の非常に強力なマクロ機能と同様に、私自身の意見で同様のリスクを提示しているように(Pythonがそのような強力なマクロシステムを取得しないことを願っています) 「人々が言語自体に埋め込まれた独自のドメイン固有の小さな言語を定義できるようにする」という魅力は重要です。私見では、アプリケーションプログラミングにおけるPythonのすばらしい有用性を損なうことになります。すべてのプログラマーの心に潜んでいます...)

アレックス


9

他のいくつか:

http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-python/

(そのページが更新されてから、Ruby側で何かを誤解したり変更したりした場合、誰かが自由に編集してください...)

文字列はPythonではなくRubyで変更可能です(「変更」によって新しい文字列が作成される)。

Rubyにはいくつかの大文字と小文字の規則がありますが、Pythonにはありません。

Pythonにはリストとタプル(不変リスト)の両方があります。Rubyには、Pythonリストに対応する配列がありますが、それらの不変の変形はありません。

Pythonでは、オブジェクト属性に直接アクセスできます。Rubyでは、常にメソッドを介します。

Rubyでは、メソッド呼び出しの括弧は通常オプションですが、Pythonではそうではありません。

Rubyには、アンダースコアと名前のマングリングを使用するというPythonの規則の代わりに、アクセスを強制するためのパブリック、プライベート、および保護があります。

Pythonには多重継承があります。Rubyには「ミックスイン」があります。

そして、非常に関連性の高い別のリンク:

http://c2.com/cgi/wiki?PythonVsRuby

これは特に、SOにたくさんの素晴らしいものを投稿しているAlex Martelliによる別の良いものへのリンクです:

http://groups.google.com/group/comp.lang.python/msg/028422d707512283


1
ルビーでは、配列をフリーズして不変なものに変更するだけです
user163365

Alex Martelliによるすばらしい投稿:)
Skilldrick 2010年

8

よくわからないので、最初に回答として追加します。

Pythonはバインドされていないメソッドを関数として扱います

ことは、あなたは次のようにどちらかのメソッドを呼び出すことができますtheobject.themethod()かでTheClass.themethod(anobject)

編集:メソッドと関数の違いはPythonでは小さく、Python 3では存在しませんが、Rubyには関数がないため、Rubyには存在しません。関数を定義すると、実際にはオブジェクトのメソッドが定義されます。

ただし、1つのクラスのメソッドを取得して関数として呼び出すことはできません。呼び出したいオブジェクトに再バインドする必要がありますが、これは非常に混乱します。


Rubyには関数がまったくありません。とTheClass.instance_method(:themethod).bind(anobject).callはいえ、同等のルビーになります。
ローガンカパルド2009

ああ。それで、明示的なクラスにない関数を定義するとき、ある種の魔法のメインクラスがありますか?
Lennart Regebro 2009

はい、最上位で定義されているメソッドはのプライベートメソッドですObject
ローガンカパルド2009

1
FWIW、Pythonでは、関数とメソッドは実際には同じ型であり、それらの異なる動作は記述子に由来するようです:users.rcn.com/python/download/…
バスティアンレオナール

1
しかし、それをオブジェクトにバインドした場合、バインドは解除されません。ああ。:-)そして、それらはPythonでも同じです。Rubyには実際には関数がないというだけのことです。そして、それは私の発言が正しいことを意味します。アンバインドメソッドは、Pythonの関数であるかのように呼び出すことができます。これは実際に便利です。たとえば、クラスを持たないオブジェクトのクラスで定義されたメソッドを呼び出すことができるということは、便利な場合があります。
Lennart Regebro、2009年

7

オブジェクトから属性への「通信」をカスタマイズできるPython記述子APIについて述べたいと思います。また、Pythonでは、__getattribute__メソッドのデフォルト実装を通じて指定されたデフォルトをオーバーライドすることで、代替プロトコルを自由に実装できることにも注目してください。上記について詳しく説明します。記述子は__get____set____delete__メソッドを含む通常のクラスです。インタプリタがのようなものに遭遇するanObj.anAttrと、以下が実行されます:

  • __getattribute__のメソッドanObjが呼び出されます
  • __getattribute__ クラスdictからAttrオブジェクトを取得します
  • abAttrオブジェクトに__get____set__または__delete__呼び出し可能オブジェクトがあるかどうかをチェックします
  • コンテキスト(つまり、呼び出し側オブジェクトまたはクラス、およびセッターがある場合は値ではなく値)が呼び出し可能オブジェクトに渡されます。
  • 結果が返されます。

前述のように、これはデフォルトの動作です。1つは、を再実装することでプロトコルを自由に変更できます__getattribute__

この手法は、デコレータよりもはるかに強力です。


6

Rubyには、を使用しcallccた継続サポートが組み込まれています。

したがって、amb-operatorのようなクールなものを実装できます


callccが理解できればいいのに。そのメリットを認めるために、マッカーシーの曖昧なオペレーターよりも平凡なアプリケーションシナリオを提供できますか?ファンキーなCSのものではなく、現実の世界という意味ですか?
ThomasH 2009

「ファンキーCSもの」は本物です。学ぶために少し時間をかけてください:intertwingly.net/blog/2005/04/13/Continuations-for-Curmudgeons
Stephen Eilert


5

Pythonにはdocstringがあり、rubyにはありません...あるいは、そうでない場合、Pythonのように簡単にアクセスできません。

Ps。私が間違っている場合、かなりください、例を残してください?私は非常に簡単にクラスにモンキーパッチを当てることができる回避策を持っていますが、「ネイティブな方法」での機能の一種のdocstringが欲しいです。


3
docstringはありませんが、RDocはあります。したがって、そうです。簡単にアクセスすることはできませんが、100%隠されることはありません。
Omar Qureshi

Rubyはdocstringを使用しません。文書化は別の方法で行います。
チャック、

1
Omar:はい、私はrdocについて知っていますが、それはpythonのdocstringのように「アクセス可能」ではありません。たとえば、クラスがあり、クラス内からrdocドキュメントを出力したい場合、かなり大変な仕事です。私が行ったことは、私がup2dateを維持し、その情報をvi自体にフェッチしようとするriドキュメントを生成することです。間違いなくpythonのdocstrings ..と同じレベルまでではない
rasjani 2009

docstringは、doctestを提供するために使用できます。Rubyにそのようなものはありますか?
Lennart Regebro 2009

2
はい、「Ruby Doctest」と呼ばれています。doctestに関する限り、実際に重要なことは、テスト可能なコードスニペットを含むどこかに読み取り可能なドキュメントがあることです。それは、ドキュメント文字列であってもコメントであっても違いはありません。
チャック

5

Rubyには、コマンドラインからの入力ファイル( '-n'フラグ)に対する行ごとのループがあるため、AWKのように使用できます。このRubyワンライナー:

ruby -ne 'END {puts $.}'

AWKワンライナーのような行を数えます:

awk 'END{print NR}'

Rubyはこの機能をPerlを通じて取得します。これは、システム管理者をPerlに参加させる方法としてAWKから取り入れたもので、方法を変更する必要はありません。


1
Pythonのコマンドラインサポートはやや弱いことを付け加えておきます。不足している自動ループのほかに、いくつかのステートメントを1行に入れて、それを単一文字列のコマンドライン引数としてインタープリターに渡すことはできません。少なくとも私はそうすることに失敗しました。
ThomasH 2009

もちろんできます。ただし、(他の言語と同様に)引用符で囲む必要があります。
Lennart Regebro、2009年

Pythonは、コマンドラインで使用するように作成されていません。その方法で使用する場合は、sys.stdinなどのいくつかのことを明示的に指定する必要があるためですpython -c "import sys; print len(list(sys.stdin))"
u0b34a0f6ae

5

Rubyにはシギルと小枝がありますが、Pythonにはありません。

編集:そして、私が忘れてしまった非常に重要なことの1つです(結局、前のものはほんの少し燃やすだけでした:-p)。

Pythonには、JITコンパイラ(Psyco)、より高速なコード(Pyrex)を作成するための視覚的に低レベルの言語、およびインラインC ++コード(Weave)を追加する機能があります。


本当ですが、それは単なる構文です。
Lennart Regebro 2009

6
まあ、もしあなたがその道を進みたいなら、両方ともチューリング完全です。他のすべては単なる構文です。
イェルクWミッターク

はい、importax構文の違い;-)
Fortran

1
@fooやself.fooと書くことはどのように重要ですか?
Lennart Regebro、2009

1
@ヨルク:そう、それを「構文」以外のものと呼んでください。ポイントは、@ fooとself.fooは同じことを行うということです。これは実際にはRubyが持つ機能ではなく、Pythonが行う機能ではありません。
Lennart Regebro、2009

5

私のpythonは錆びているので、これらの一部はpythonにある可能性があり、私は最初は覚えていない/最初から学んだことはありませんが、私が考えた最初のいくつかは次のとおりです。

空白

Rubyは空白をまったく異なる方法で処理します。手始めに、何もインデントする必要はありません(つまり、4つのスペースまたは1つのタブを使用しても問題ありません)。また、スマートライン継続を行うため、以下が有効です。

def foo(bar,
        cow)

基本的に、オペレーターで終了すると、何が起こっているのかがわかります。

ミックスイン

Rubyには、完全なクラスの代わりにインスタンスを拡張できるミックスインがあります。

module Humor
  def tickle
    "hee, hee!"
  end
end
a = "Grouchy"
a.extend Humor
a.tickle    »   "hee, hee!"

列挙型

これがジェネレーターと同じであるかどうかはわかりませんが、列挙型としてのRuby 1.9 ruby​​では、

>> enum = (1..4).to_enum
=> #<Enumerator:0x1344a8>

リファレンス:http : //blog.nuclearsquid.com/writings/ruby-1-9-what-s-new-what-s-changed

「キーワード引数」

そこにリストされている項目は両方ともRubyでサポートされていますが、そのようなデフォルト値をスキップすることはできません。あなたはどちらか順番に行くことができます

def foo(a, b=2, c=3)
  puts "#{a}, #{b}, #{c}"
end
foo(1,3)   >> 1, 3, 3
foo(1,c=5) >> 1, 5, 3
c          >> 5

c = 5は、実際には呼び出しスコープの変数cに値5を割り当て、パラメーターbに値5を設定することに注意してください。

または、2番目の問題に対処するハッシュを使用してそれを行うことができます

def foo(a, others)
  others[:b] = 2 unless others.include?(:b)
  others[:c] = 3 unless others.include?(:c)
  puts "#{a}, #{others[:b]}, #{others[:c]}"
end
foo(1,:b=>3) >> 1, 3, 3
foo(1,:c=>5) >> 1, 2, 5

参照:Rubyの実用的なプログラマガイド


2番目の例foo(1、c = 5)は、思ったように動作しません。Rubyには名前付きパラメーターがありません。
horseyguy 2009

5
Pythonには、括弧内の暗黙の行継続([または{
u0b34a0f6ae

5

RubyとPythonの両方のクラス定義にコードを含めることができます。ただし、Rubyではクラス(self)への参照があります。Pythonでは、クラスがまだ定義されていないため、クラスへの参照はありません。

例:

class Kaka
  puts self
end

この場合のselfはクラスであり、このコードは「カカ」を出力します。Pythonでは、クラス名を出力したり、クラス定義の本体からクラスにアクセスしたりする方法はありません。


最初のポイントの詳細(コードなど)を提供できますか?
ロイック・ウォルフ

コード例は良い考えですが、このケースは些細なものですが、私はそれを追加しました。
Lennart Regebro 2009

@SilentGhost:現時点ではあまりわかりにくいものは考えられません。:)
Lennart Regebro 2009

pythonでクラス内のクラス名にアクセスできます:class foo():def init __(self):print self .__ class .__ name__
txwikinger

1
@txwikinger:そうですが、クラスの本体内ではなく、classステートメントと同時に実行されます。
バスティアンレオナール

4

構文はささいなことではなく、私たちの考え方に直接影響します。また、使用するシステム用に作成するルールにも直接影響します。例として、数式や文の書き方が原因で、演算の順序があります。数学の標準的な表記法では、人々はそれを複数の方法で読んで、同じ方程式で異なる答えを得ることができます。接頭表記または接尾表記を使用した場合、値を計算する順序のルールだけではなく、操作する数値が何であるかを区別するルールを作成します。

標準的な表記法により、計算する順序を曖昧にする際に、どの番号について話しているのかが明確になります。接頭辞と接尾辞の表記は、数値をあいまいにしながら計算する順序をわかりやすくします。構文の空白によって引き起こされる困難がなければ、Pythonにはすでに複数行のラムダがあるはずです。(提案は、必ずしも明示的なブロック区切り文字を追加せずに、この種のものを取り除くために存在します。)

たとえば、条件がfalseの場合に何かを発生させたい条件を記述する方が、Rubyまたは他の言語の意味的に等価な「if-not」構文よりも、Rubyのunlessステートメントを使用して書く方がはるかに簡単です。今日人々が使用している言語のほとんどが同等である場合、各言語の構文をどうやって取るに足らないものと見なすことができるでしょうか。ブロックや継承メカニズムなどの特定の機能の後、構文は言語の最も重要な部分であり、表面的なものではありません。

表面的なものは、私たちが構文に帰する美の美的品質です。美学は、私たちの認知がどのように機能するかとは何の関係もありません。


この「コメント」は、担当者に関係なく、コメントで許可されているものの3倍の長さです。
Andrew Grimm

これは実際には私への答えとしてうまく見えます。「これはコメントです」ビットを編集しました。
トカゲに請求する

3

ルビの「メソッドが見つからない」メカニズムについて何も言及されていないことに驚いています。その言語機能の力の例として、Railsのfind_by _...メソッドの例を挙げます。私の推測では、Pythonにも同様のものが実装される可能性がありますが、私の知る限りでは、ネイティブにはありません。


PythonはありGET_ATTRIBUTE基本的には、Rubyのmethod_missingと同じことを実現し、。
mipadi 2009

3
Rubyがどこかで言及されているのに、なぜPython開発者はいつもお尻を痛めるのですか?これは真実ではないことを否定することはできません。
aarona

method_missing場合によっては、Pythonでエミュレートできますclass M(): def __getattr__(self, n): return lambda: "Missing! " + n; M().hi()。ただし、わずかな違いがあり、Pythonでは慣用的であるとは思いません:-)

1
@DJTripleThreat:私はそれが真実であることを否定します。
Lennart Regebro、2011年

3

PythonとRubyのラムダのもう1つの違いは、Paul GrahamのAccumulator Generator問題で示されています。ここに転載:

数値nを取り、数値iを取り、nをi増分した値を返す関数を返す関数fooを記述します。注:(a)整数ではなく数値、(b)プラスではなく増分されます。

Rubyでは、これを行うことができます:

def foo(n)
  lambda {|i| n += i }
end

Pythonでは、nの状態を保持するオブジェクトを作成します。

class foo(object):
    def __init__(self, n):
        self.n = n
    def __call__(self, i):
        self.n += i
        return self.n

一部の人々は、たとえそれが少し冗長であっても、概念的に明確であるとして明示的なPythonアプローチを好むかもしれません。他のことをするのと同じように状態を保存します。呼び出し可能なオブジェクトのアイデアに頭を抱える必要があるだけです。しかし、どのアプローチが美的に好まれるかに関係なく、RubyラムダがPythonのコンストラクトよりも強力な構成体であるという点を示しています。


3
Pythonでは数値をインクリメントできないため、その制限は意味がありません。Pythonでは、数値は不変です。代わりに「plus」に変更すると、クラスは不要になります。したがって、これはラムダの違いについては何も示していませんが、数値の動作方法の違いを示しています。もちろん、変更可能な数値クラスを作成しない限り。:)
Lennart Regebro 2010年

2
制限は、望ましい動作を明確にするためにあります。問題が求めているのは:f = foo(10)f(2)>> 12 f(3)>> 15 ... lambda {| i | n + i}は次のようになります。f = foo(10)f(2)>> 12 f(3)>> 13 ...数値もRubyでは不変です。たとえば、2 + = 1とは言えません。そして、n + = 1は通常のPython関数では問題ありませんが、ラムダではありません。つまり、「n」が何であるか、つまり、関数が呼び出されてラムダが形成されたときに作成され、ラムダで(式だけでなく)代入を実行でき、nの値を保持できるということです。複数の呼び出し。
dormsbee 2010年

Pythonでこのような長さにする必要はないと思います。関数は他の関数内で定義できます。def foo(n): def f(i): return n + i return f
FMc

2
それでもまだ同じではなく、あなたの例は上のコメントのPythonラムダと同等です。Rubyバージョンは、呼び出し間で状態を維持するラムダを作成します。投稿した例では、nの開始値を構成できますが、fooが返す関数には常にその開始値が含まれます。Rubyのバージョンが増加します。したがって、f = foo(10)としましょう。Pythonバージョン:f(1)=> 11、f(1)=> 11. Rubyバージョンf.call(1)=> 11、f.call(1)=> 12.
dormsbee

def foo(n): L=[n] def f(i): L[0] += i return L[0] return f。Python3では、nonlocalキーワードを使用できます。
jfs

3

Pythonはオプションの引数に名前を付けました

def func(a, b=2, c=3):
    print a, b, c

>>> func(1)
1 2 3
>>> func(1, c=4)
1 2 4

AFAIK Rubyには位置付けられた引数しかありません。関数宣言のb = 2は常に追加される影響であるためです。


3
「関数宣言のb = 2は常に追加される影響であるので、Rubyには位置付けられた引数しかありません」とはどういう意味ですか?
horseyguy 2009

3
あなたが住んでいる惑星は何def my_method(param1, optional = false)ですか?Ruby 1.8.6、1.8.7、そしておそらく1.9で動作します!
Robert K

5
邪悪なノミ、および彼のコメントに賛成した人々は、あなたは例を十分に近く見ていませんでした。彼bfunc呼び出しでパラメーターをスキップすることができ、それでもデフォルトを維持します。つまり、bは署名の2番目の引数ですが、2番目のパラメータの前にを付けることで、これをスキップできますc=。Rubyはこれをシミュレートするためにハッシュを使用しますが、まったく同じではありません。
マセック

2

Rubyにはドキュメントが埋め込まれています。

 =begin

 You could use rdoc to generate man pages from this documentation

 =end

5
docstringは、設定したメソッド/クラスの一部になります。あなたは、ヘルプ(クラス)を行うことができますし、それはあなたのドキュメンテーション文字列などが表示されますので、
レナートRegebro


2

Rubyでは、requireを使用してファイルをインポートすると、そのファイルで定義されたすべてのものが最終的にグローバル名前空間になります。

貨物あなたは「できるあなたの名前空間を乱雑にすることなく、ライブラリを必要と」。

# foo-1.0.0.rb
class Foo
  VERSION = "1.0.0"
end

# foo-2.0.0.rb
class Foo
  VERSION = "2.0.0"
end
>> Foo1 = import( "foo-1.0.0")
>> Foo2 = import( "foo-2.0.0")
>> Foo1 :: VERSION
=> "1.0.0"
>> Foo2 :: VERSION
=> "2.0.0"

これはむしろ新しい答えではなく、コメントであるべきでした。
Lennart Regebro、2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.