このサイトについて

サンプルコード付きのZen of Python

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

2011-02-17 05:56