Python Tips, Tricks, and Hacks という記事を読んで

Python Tips, Tricks, and Hacks - Siafoo

いやー、Python の初学者には勉強になる記事だった。
一番驚いたのは「5.1 Default Argument Values are Only Evaluated Once」のセクションだね。
これは一種のバグと言えるような気がしないでもない。

On the plus side, a clever programmer could probably turn this into a trick, in effect creating C-style 'static variables'.

とあるけど、ホントかなぁ。。。たとえ上手い使い方があったとしても、美しいコードにはならないと思う。


使えそうだと思ったのは「2.1.4 Generator Expressions」
これって要するに遅延評価しているわけだよね。

def f(n):
  return n*n

generator = (f(n) for n in [1, 2, 3])

f = lambda n: 2*n
for n in generator:
  print n

これの実行結果は

2
4
6

となる一方、

def l():
  return [1, 2, 3]

generator = (n for n in l())

l = lambda: [1, 2]
for n in generator:
  print n

これの実行結果は

1
2
3

となる。
そして

def fibs():
  a, b = 0, 1
  while True:
    yield b
    a, b = b, a+b

generator = (n for n in fibs())
for i in range(10):
  print generator.next()

これの実行結果は

1
1
2
3
5
8
13
21
34
55

となる。ふーん。