1. ホーム
  2. python

[解決済み] RubyからPythonを学ぶ:違いと共通点

2022-06-25 01:38:16

質問

私はRubyをよく知っています。現在、Pythonを学ぶ必要があるかもしれないと考えています。両方を知っている人のために、どのような概念が2つの間で類似しており、何が異なっているのでしょうか?

私は、私が書いた入門書のようなリストを探しています。 スクリプターのためのLua学習 : 空白の重要性やループ構成などの単純なもの; 名前が nil の名前と、どの値が "truthy" と見なされるのか; Python の mapeach であるか、または つぶやく 理解しがたいこと つぶやく が普通?

もし私が良い様々な答えを得たら、私は喜んでそれらをコミュニティwikiに集約します。そうでなければ、真の包括的なリストを作成するために、みなさんが互いに意見を戦わせ、批評し合うことができます。

編集 : 明確にしておくと、私のゴールは "適切な"そして慣用的な Python です。もし、Pythonで inject に相当するPythonがあっても、リストを反復して途中で結果を蓄積するという共通の機能を実現する、より良い/異なる方法があるために誰もそれを使用しないのであれば、私はあなたがどのように物事を行うかを知りたいのです。おそらく私は、共通の目標のリスト、Rubyでそれらを達成する方法、およびPythonで同等のものが何であるかを尋ねることで、この質問を更新するつもりです。

どのように解決するのですか?

私との主な相違点は以下のとおりです。

  1. Rubyにはブロックがあり、Pythonにはありません。

  2. Pythonには関数がありますが、Rubyにはありません。 Pythonでは、任意の関数やメソッドを取り出して、別の関数に渡すことができます。 Rubyでは、すべてがメソッドで、メソッドは直接渡すことができません。 代わりに、それらを渡すためにProcでラップする必要があります。

  3. RubyとPythonはどちらもクロージャをサポートしていますが、その方法は異なっています。 Pythonでは、関数を別の関数の内部で定義することができます。 内側の関数は外側の関数から変数への読み込みアクセスはできますが、書き込みアクセスはできません。 Rubyでは、ブロックを使ってクロージャを定義します。 クロージャは外側のスコープから変数への完全な読み込みと書き込みのアクセス権を持っています。

  4. Pythonにはリスト内包があり、これはかなり表現力が豊かです。 例えば、数字のリストがあれば、次のように書くことができます。

    [x*x for x in values if x > 15]
    
    

    で、15より大きいすべての値の二乗の新しいリストを取得します。 Rubyでは、次のように書くことになる。

    values.select {|v| v > 15}.map {|v| v * v}
    
    

    Rubyのコードはそれほどコンパクトには感じられません。 また、values配列を15以上の値を含む短い中間配列に変換しているため、効率的ではありません。 次に、中間配列を取り出し、中間配列の2乗を含む最終配列を生成しています。 そして、中間配列は捨てられる。 つまり、Rubyでは計算中に3つの配列がメモリに残ってしまいますが、Pythonでは入力リストと結果のリストだけが必要なのです。

    Pythonもまた、同様のマップ内包を提供します。

  5. Pythonはタプルをサポートしていますが、Rubyはそうではありません。 Rubyでは、タプルをシミュレートするために配列を使用しなければなりません。

  6. Ruby は switch/case 文をサポートしていますが、Python はサポートしていません。

  7. Ruby は標準的な expr ? val1 : val2 三項演算子をサポートしていますが、Pythonはサポートしていません。

  8. Ruby は単一継承のみをサポートしています。 多重継承を模倣する必要がある場合は、モジュールを定義し、ミックスインを使用してモジュールのメソッドをクラスに引き込むことができます。 Pythonはモジュールミックスインではなく、多重継承をサポートしています。

  9. Pythonは単一行のラムダ関数だけをサポートしています。 Rubyのブロックは、ラムダ関数の一種であり、任意の大きさにすることができます。 このため、Rubyのコードは一般的にPythonのコードよりも関数的なスタイルで書かれています。 例えば、Rubyでリストをループする場合、通常は次のようにします。

    collection.each do |value|
      ...
    end
    
    

    このブロックは、関数が collection.each . Pythonで同じことをするとしたら、名前を付けた内部関数を定義して、それをコレクションeachメソッドに渡す必要があります(リストがこのメソッドをサポートしている場合)。

    def some_operation(value):
      ...
    
    collection.each(some_operation)
    
    

    これではあまりきれいに流れません。 そこで、通常、Pythonでは以下のような非機能的なアプローチをとることになります。

    for value in collection:
      ...
    
    
  10. 安全な方法でのリソースの使用は、2つの言語間でかなり異なっています。 ここでは、何らかのリソースを割り当て(ファイルを開く、データベースのカーソルを取得するなど)、それに対して任意の操作を行い、例外が発生しても安全な方法でそれを閉じたいということが問題になります。

    Rubyでは、ブロックはとても使いやすいので(#9参照)、このパターンは通常、リソースに対して実行する任意の操作のためのブロックを受け取るメソッドとしてコーディングされます。

    Pythonでは、任意の操作のために関数を渡すと、名前付きの内部関数を書かなければならないので、少し面倒です(#9参照)。 その代わりに、Pythonでは with 文を使って安全にリソースを扱えるようにします。 参照 Pythonオブジェクトを正しくクリーンアップするにはどうしたらいいですか? を参照してください。