業務でRubyとPython(3系)を行き来して頭こんがらがってきたので備忘録書いておく。
言語概要
RubyもPyrhonもスクリプト言語。
Railsの強さからスタートアップのWebサービス言語としてはRubyが優勢。DSLの作りやすさからiOS系のツールで使われていることも多い。
一方、機械学習や科学計算ではPythonの方が広く使われている。atcoderでpypyが使えることから狭義の競プロでもつよい。
if文
Rubyはelsif, Pythonはelif
Ruby
a = 1 if a < 0 puts "negative" elsif a > 0 puts "positive" else puts "zero" end
Python
a = 1 if a < 0: print("negative") elif a > 0: print("positive") else: print("zero")
ループ
Rubyはforも使えるがtimesの方がRubyっぽい(気がする)
Ruby
3.times do |i| puts i end
Python
for i in range(3): print(i)
関数
Rubyは明示的にreturnしない場合、最後の行の評価値が返る. Rubyは引数がない場合、カッコを省略できる。
Ruby
def add(a, b) a+b end
Python
def add(a, b): return a+b
クラス
define_finalizerという裏道はあるがRubyでデストラクタは基本ない
Pythonのインスタンスメソッドは第1引数に自身をとる。クラスメソッドはRubyはself. , Pythonはデコレーター
Ruby
class Post def initialize @content = "asdf" end def my_instance_method @content end def self.my_class_method puts "class method" end end
Python
class Post(): def __init__(self): self.content = "asdf" def my_instance_method(self): return self.content @classmethod def my_class_method(cls): print("class method")
加減乗除
RubyもPythonも++が使えない
Ruby
a = 1 a += 1 puts a
Python
a = 1 a += 1 print(a)
Rubyの割り算は切り捨て。Pythonの割り算は小数
Ruby
a = 3 b = 2 puts a/b # => 1
Python
a = 3 b = 2 print(a/b) # => 1.5
文字列展開
Python 3.6からf stringが使える
Ruby
a = 1 puts "a = #{a}"
Python
a = 1 print(f"a = {a}")
その他
Rubyは10年前の1.9からHashはorderを持っている. 順序が違っていても==の評価値はtrue
Pythonは3.6からCPythonの実装としてdictはordered. 仕様としてなったのは3.7から. 3.7でもinsertion orderと順番付き同値は別物
まとめ
Future Work
ORMについてもやりたい