Make組ブログ

Python、Webサービスや製品開発、ライブラリー開発についてhirokikyが書きます

PythonとRubyの比較をよく聞かれるので明示するか略せるかが違うよという説明をまとめておいた

よくプログラミング初心者の方に「PythonRubyの違いを教えてください」と聞かれるので書いておきます。

免責

あくまで僕がプログラミング初心者さんに説明するときにこの説明を使うよという視点です。読んでる方が思う視点とか別の意見はぜひご自身のブログに書いてください(読みますので)。 違いはたくさんありますが、5分で簡潔に伝わる違いを伝えたいと思っています。 あと私はPythonをずっと10年近く使っていますが、Rubyはちょっとだけです。でもRubyもとても良い言語だと思っています。

(コードサンプルの色味が読みにくくてごめんなさい。気が向いたら直しときます)

本文

プログラミング初心者に簡単にPythonRubyの違いを説明する場合ベストは「Pythonはより明示します。Rubyはより略せます」だと思っています (あくまでプログラミング初心者に5分以内に伝えると考えたときの視点ですよ)。

細かな違いはあれど、個人的には言語としてPythonRubyではそれほど大きな違いはないと思います (少なくともHaskelとPythonや、ErlangPythonのような違いはないですよね)。

もちろん今回は言語の話です。コミュニティの色や存在しているフレームワーク、ライブラリーの違いは大きくあると思います。 機械学習やデータ処理をしたいなぁ、しかもWebでも同じ言語を使いたいなぁというのであればPythonをオススメします。 でもそういう場合は言語仕様関係なく選びますよね。

言語として「PythonRubyの違いが知りたい」と言うプログラミング初心者の人に分かりやすく違いを説明するのであれば、やはり「明示するか略すか」が良いと思います。

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. などを書く必要があります。

説明用のプログラムでは、PythonRubyAccount クラスを作っています。 Accountfullname というゲッターとセッターを持っており、 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が好きです。

他のオススメ記事

blog.hirokiky.org