40. ぷちPython講座:リスト内包
• リスト内包 : ルールから配列を作る
– for ループを書かなくていい
– R の apply() 系の関数に相当
a = []
for x in xrange(10):
a.append(x * x)
リスト内包なら簡潔!
a = [x * x for x in xrange(10)]
※厳密にはいろいろ(ry
41. 「リスト内包」を使えば……
phi = [
lambda x: 1,
lambda x: x,
������������ ������ = ������ ������ (������ = 0, ⋯ , ������ − 1)
lambda x: x ** 2,
lambda x: x ** 3
]
こう書ける気がする
phi = [lambda x: x ** m for m in xrange(M)]
• かんたんになったね!
42. だめでした……
• ������0 2 , ������1 2 , ������2 2 , ������3 2 を表示してみる
– “1 2 4 8” と出力されることを期待
M = 4
phi = [lambda x: x ** m for m in xrange(M)]
print phi[0](2), phi[1](2), phi[2](2), phi[3](2)
• ところがこれの実行結果は “8 8 8 8”
– って、全部同じ!? なんで???
43. うまくいかない理由は……
• 「レキシカルスコープ」がどうとか
– ちょっとややこしい
• 回避する裏技もあるけど……
– もっとややこしい
M = 4
phi = [lambda x, c=m: x ** c for m in xrange(M)]
print phi[0](2), phi[1](2), phi[2](2), phi[3](2)
# => “1 2 4 8” と表示される(ドヤ