algonote

There's More Than One Way To Do It

RubyとPythonの比較

業務で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と順番付き同値は別物

まとめ

github.com

Future Work

ORMについてもやりたい