[解決済み] RubyからPythonを学ぶ:違いと共通点
質問
私はRubyをよく知っています。現在、Pythonを学ぶ必要があるかもしれないと考えています。両方を知っている人のために、どのような概念が2つの間で類似しており、何が異なっているのでしょうか?
私は、私が書いた入門書のようなリストを探しています。
スクリプターのためのLua学習
: 空白の重要性やループ構成などの単純なもの; 名前が
nil
の名前と、どの値が "truthy" と見なされるのか; Python の
map
と
each
であるか、または
つぶやく
理解しがたいこと
つぶやく
が普通?
もし私が良い様々な答えを得たら、私は喜んでそれらをコミュニティwikiに集約します。そうでなければ、真の包括的なリストを作成するために、みなさんが互いに意見を戦わせ、批評し合うことができます。
編集
: 明確にしておくと、私のゴールは "適切な"そして慣用的な Python です。もし、Pythonで
inject
に相当するPythonがあっても、リストを反復して途中で結果を蓄積するという共通の機能を実現する、より良い/異なる方法があるために誰もそれを使用しないのであれば、私はあなたがどのように物事を行うかを知りたいのです。おそらく私は、共通の目標のリスト、Rubyでそれらを達成する方法、およびPythonで同等のものが何であるかを尋ねることで、この質問を更新するつもりです。
どのように解決するのですか?
私との主な相違点は以下のとおりです。
-
Rubyにはブロックがあり、Pythonにはありません。
-
Pythonには関数がありますが、Rubyにはありません。 Pythonでは、任意の関数やメソッドを取り出して、別の関数に渡すことができます。 Rubyでは、すべてがメソッドで、メソッドは直接渡すことができません。 代わりに、それらを渡すためにProcでラップする必要があります。
-
RubyとPythonはどちらもクロージャをサポートしていますが、その方法は異なっています。 Pythonでは、関数を別の関数の内部で定義することができます。 内側の関数は外側の関数から変数への読み込みアクセスはできますが、書き込みアクセスはできません。 Rubyでは、ブロックを使ってクロージャを定義します。 クロージャは外側のスコープから変数への完全な読み込みと書き込みのアクセス権を持っています。
-
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もまた、同様のマップ内包を提供します。
-
Pythonはタプルをサポートしていますが、Rubyはそうではありません。 Rubyでは、タプルをシミュレートするために配列を使用しなければなりません。
-
Ruby は switch/case 文をサポートしていますが、Python はサポートしていません。
-
Ruby は標準的なexpr ? val1 : val2
三項演算子をサポートしていますが、Pythonはサポートしていません。 -
Ruby は単一継承のみをサポートしています。 多重継承を模倣する必要がある場合は、モジュールを定義し、ミックスインを使用してモジュールのメソッドをクラスに引き込むことができます。 Pythonはモジュールミックスインではなく、多重継承をサポートしています。
-
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: ...
-
安全な方法でのリソースの使用は、2つの言語間でかなり異なっています。 ここでは、何らかのリソースを割り当て(ファイルを開く、データベースのカーソルを取得するなど)、それに対して任意の操作を行い、例外が発生しても安全な方法でそれを閉じたいということが問題になります。
Rubyでは、ブロックはとても使いやすいので(#9参照)、このパターンは通常、リソースに対して実行する任意の操作のためのブロックを受け取るメソッドとしてコーディングされます。
Pythonでは、任意の操作のために関数を渡すと、名前付きの内部関数を書かなければならないので、少し面倒です(#9参照)。 その代わりに、Pythonでは
with
文を使って安全にリソースを扱えるようにします。 参照 Pythonオブジェクトを正しくクリーンアップするにはどうしたらいいですか? を参照してください。
関連
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み] 文字列リテラルの前にある'b'文字は何を意味するのでしょうか?
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] Pythonでファイル名から拡張子を抽出する
-
[解決済み] Rubyからシェルコマンドを呼び出す方法
-
[解決済み] リストに値が存在するかどうかを確認する最速の方法
-
[解決済み】type()とisinstance()の違いは何ですか?)
-
[解決済み】RubyにあってPythonにないもの、またその逆は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonの非常に便利な2つのデコレーターを解説
-
Python Decorator 練習問題
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
Evidentlyを用いたPythonデータマイニングによる機械学習モデルダッシュボードの作成
-
[解決済み] データ型が理解できない
-
[解決済み】TypeError: re.findall()でバイトのようなオブジェクトに文字列パターンを使用することはできません。)
-
[解決済み] TypeError: 'DataFrame' オブジェクトは呼び出し可能ではない
-
[解決済み】Python - "ValueError: not enough values to unpack (expected 2, got 1)" の修正方法 [閉店].
-
[解決済み] Pythonのオブジェクトを正しくクリーンアップするにはどうしたらいいですか?
-
[解決済み】RubyにあってPythonにないもの、またその逆は何ですか?