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種類のサンプルコードが掲載されているので,どこがどうちがうのか,文章と一緒によく読んでみるとよいと思う:-)。