Zen of Pythonサンプルソースコード
Pythonが公開されてからすでに20年近くが経過している。"The Zen of Python" と呼ばれる、十九条に渡る叡知に満ちた神秘的な詩句が出力されるはずだ。この "The Zen of Python" こそが Pythonic であるための指針であると広く認められている。 本来、"The Zen of Python" は全二十条からなるが、現在示されているのは十九条に過ぎない。最後の一条はいずれ明らかにされるが、その日こそが Python の完成に至る日であると定められている。
Zen of PythonはPythonの言語としての思想を表す言葉。Pythonを起動して「import this」すると表示される。「Simple is better than complex」のように短い言葉が並んだ詞のような言葉で,Pythonistaだけでなく開発者一般が肝に命ずべき「教条」が並んでいる。
しかし,Pythonの「Zen」を言葉として理解することと実践することはまったくの別物だ。言葉はコードに比べて曖昧なので,思い込みや勘違いから正しくZenを実践できないこともあるかも知れない。そういうときはPEP 20 (The Zen of Python) by Exampleを見てみるといい。
Zen of Pythonの一行ごとに,「コードでかくとしたらこんな感じ』という例題が書いてある。
たとえば最初の行「Beautiful is better than ugly(きたないよりきれいなほうがいい)」をPythonで書くとは以下のようになる(英語の部分は翻訳してある)。
################################### 1 ################################## """ 偶数のみ,数値を2で割った数値のリストを返す関数を作れ """ #----------------------------------------------------------------------- halve_evens_only = lambda nums: map(lambda i: i/2, filter(lambda i: not i%2, nums)) #----------------------------------------------------------------------- def halve_evens_only(nums): return [i/2 for i in nums if not i % 2] #----------------------------------------------------------------------- print 'きたないよりきれいなほうがいい'
たしかに,lambdaを使ったワンライナーは汚いし,見づらくてメンテナイスしたくない。
もう一つ。Zen of Python3行目の例題。
################################### 3 ################################## """ 次の測定結果をディスクに書き出してくれないかな? """ measurements = [ {'weight': 392.3, 'color': 'purple', 'temperature': 33.4}, {'weight': 34.0, 'color': 'green', 'temperature': -3.1}, ] #----------------------------------------------------------------------- def store(measurements): import sqlalchemy import sqlalchemy.types as sqltypes db = sqlalchemy.create_engine('sqlite:///measurements.db') db.echo = False metadata = sqlalchemy.MetaData(db) table = sqlalchemy.Table('measurements', metadata, sqlalchemy.Column('id', sqltypes.Integer, primary_key=True), sqlalchemy.Column('weight', sqltypes.Float), sqlalchemy.Column('temperature', sqltypes.Float), sqlalchemy.Column('color', sqltypes.String(32)), ) table.create(checkfirst=True) for measurement in measurements: i = table.insert() i.execute(**measurement) #----------------------------------------------------------------------- def store(measurements): import json with open('measurements.json', 'w') as f: f.write(json.dumps(measurements)) #----------------------------------------------------------------------- print '複雑よりシンプルなほうがいい'
辞書の内容をディスクに書き出すためだけにsqliteやsqlalchemyを使うのは複雑すぎる。
中にはネタとしか思えない例題などもあるけど,全編を通じて楽しめるコードになっている。ここで取り上げた例題をみると分かるとおり,各行とも同じ 題材をもとにした2種類のサンプルコードが掲載されているので,どこがどうちがうのか,文章と一緒によく読んでみるとよいと思う:-)。
- minidxer's blog
- Login or register to post comments
Recent comments
1 week 3 days ago
1 week 5 days ago
6 weeks 3 days ago
9 weeks 4 days ago
9 weeks 6 days ago
9 weeks 6 days ago
10 weeks 19 hours ago
10 weeks 20 hours ago
10 weeks 1 day ago
10 weeks 1 day ago