オモンパカリスト

深層学習、計算論的神経科学に興味あります

RubyからPythonのコーディング所感

まだまだプログラミング初級者だけど、
Rubyを初めて触ってから1年が経とうとして、
去年末あたりから触りだしたPythonも少し慣れてきた。
Pythonには独特なリスト内包があるけど、それについてはまだちょっと書き慣れていない。
Rubyもかなり独特だけど。

Ruby

Rubyのクラス定義やメソッド定義はめちゃくちゃ見やすい
class クラス名(頭文字が大文字)~enddef メソッド名~end

class Human
  def initialize(name, age)
    @name = name
    @age = age
  end

  def name
    @name
  end

  def name=(name)
    @name = name
  end

  def age
    @age
  end

  def age=(age)
    @age = age
  end
end

human = Human.new('Taro', 18)
puts human.name
human.age = 19
puts human.age

initializeメソッドがコンストラクタ。
クラスはインスタンス変数(@から始まる変数)を持っている。
この場合Humanクラスは@name, @ageを持っている。
Rubyのメソッド呼び出しは括弧()を省略することができて、それがオモロイ。
human.age = 19は実際のところhuman.age=(19)
つまるところhumanオブジェクト(Humanクラスのインスタンス)のage=メソッドを呼び出してる。
ちなみにreturnの明記は必要とせずとも一番最後の行が返り値となる。

ちなみにちなみに、attr_accessorというアクセサを使えば
インスタンス変数の基本的な読み書きを省略できて...

class Human
  def initialize(name, age)
    @name = name
    @age = age
  end
  attr_accessor :name, :age
end

human = Human.new('Taro', 18)
puts human.name
human.age = 19
puts human.age

超カンタン。しかも、多分だけど、attr系はC実装だからこっちのほうが処理も速いきがする。。

Python

一方Python(2.7系)は、インデントを下げて各処理ルーチンのブロックを表現する。

class Human:
  def __init__(self, name, age):
    self.name = name
    self.age = age

  def change_name(self, name):
    self.name = name
    return self.name

  def change_age(self, age):
    self.age = age
    return self.age


human = Human('Taro', 18)
print human.name
human.change_age(19)
print human.age

クラスのコンストラクタは__init__メソッド。ちょっと初見気持ち悪い。
しかも、クラス内のメソッドたちは定義時のみ第一引数にselfを必要とする。
といっても、おかげでselfにプロパティをつけてあげればインスタンス変数として扱える。

可読性は?

RubyよりもPythonのほうが初見は見やすいきがする。 といってもRubyで慣れてきてからPythonを見たからなのかな。
ちなみに、Rubyの対話的シェルで最強のpryがいるけど、
PythonのIPythonもアップデートが早くて強力だし、なによりJupyterまじ最高。