よくプログラミング初心者の方に「PythonとRubyの違いを教えてください」と聞かれるので書いておきます。
免責
あくまで僕がプログラミング初心者さんに説明するときにこの説明を使うよという視点です。読んでる方が思う視点とか別の意見はぜひご自身のブログに書いてください(読みますので)。 違いはたくさんありますが、5分で簡潔に伝わる違いを伝えたいと思っています。 あと私はPythonをずっと10年近く使っていますが、Rubyはちょっとだけです。でもRubyもとても良い言語だと思っています。
(コードサンプルの色味が読みにくくてごめんなさい。気が向いたら直しときます)
本文
プログラミング初心者に簡単にPythonとRubyの違いを説明する場合ベストは「Pythonはより明示します。Rubyはより略せます」だと思っています (あくまでプログラミング初心者に5分以内に伝えると考えたときの視点ですよ)。
細かな違いはあれど、個人的には言語としてPythonとRubyではそれほど大きな違いはないと思います (少なくともHaskelとPythonや、ErlangとPythonのような違いはないですよね)。
もちろん今回は言語の話です。コミュニティの色や存在しているフレームワーク、ライブラリーの違いは大きくあると思います。 機械学習やデータ処理をしたいなぁ、しかもWebでも同じ言語を使いたいなぁというのであればPythonをオススメします。 でもそういう場合は言語仕様関係なく選びますよね。
言語として「PythonとRubyの違いが知りたい」と言うプログラミング初心者の人に分かりやすく違いを説明するのであれば、やはり「明示するか略すか」が良いと思います。
Pythonの明示姓
言うよりも見るということで、フィボナッチ数列の計算をキャッシュありで行うプログラムを2つ書きました。
Pythonの例:
fib = {} fib[1] = 1 fib[2] = 1 def fibonacci(num): if num in fib: return fib[num] fib[num] = fibonacci(num-1) + fibonacci(num-2) return fib[num] print(fibonacci(100))
Rubyの例:
@fib = {} @fib[1] = 1 @fib[2] = 1 def fibonacci(num) @fib[num] ||= fibonacci(num-1) + fibonacci(num-2) end p fibonacci(100)
この2つの例はかなりPythonらしさとRubyらしさを表していると思います。 (もちろんRubyでもPythonのような書き方はできますが、Rubyで書くのであればこの書き方のほうが美しいと思います)
この違いを産んでいるのはこの辺の違いからでしょうか:
return
の略nil
の扱い- 代入の違い
- 例外の違い
Rubyで ||=
でうまく書けると気持ちいい。
Pythonは愚直ですが、何やっているかはパット見で分かりやすいなぁと感じます。
クラスで紹介する他の例
他の例として、Pythonのほうがより明示的に書く必要があるという説明をします。
Rubyでは def メソッド名=(...)
や @属性名
と記号で書けるところを、Pythonでは明示的に self.
などを書く必要があります。
説明用のプログラムでは、PythonとRubyで Account
クラスを作っています。
Account
は fullname
というゲッターとセッターを持っており、 fullname
という属性に値をそのまま保存します。
Pythonの例:
class Account: @property def fullname(self): return self.fullname @fullname.setter def set_fullname(self, fullname): self.fullname = fullname user = Account() user.fullname = "Hiroki Kiyohara" print(user.fullname)
Rubyの例:
class Account def fullname @fullname end def fullname=(fullname) @fullname = fullname end end user = Account.new() user.fullname = "Hiroki Kiyohara" p user.fullname
この例は極端に分かりやすい例なので、「見た目Rubyのほうが良いじゃん」と思われるかもしれません。 ですが、Pythonはより「明示的に」書く必要があり、記号や略記が少ないのが特徴です。
Pythonは美しいと僕も思いますが、結構、言語開発者とか深い仕様レベルでの美しさだなぁと思います。実にパースしやすそうです。 パッと見た感じはRubyのほうが小奇麗だと思います。Rubyの言語の深い部分は知らないです。
Slackにて話してると
shimizukawa [11:41 AM] Rubyは言語仕様が美しくなるように言語設計している Pythonは文法のパースがシンプルになるように言語設計している
わかり哲也。
僕はそういう意味で、Pythonが好きです。