みんなのpythonを読んだら、もうちょっと実践的なコードを基に、他の言語と比較しながら説明してあるDive Into Pythonなど読むべし。pythonの初歩からhtml,xmlの処理、そしてSOAPによる通信といった割と基本的な(けど実用的な)章があって、終わりのほうは単体テスト、リファクタリングといったテスト技法や、関数型プログラミングに関しても触れてるので、全体を読んでpythonへの理解はかなり深まった(と思う)。わからないところも、みんなのpython片手にPython ライブラリリファレンスひけば、大概解決したし。
で、17章にフィボナッチ数を求める例があって、そこでジェネレータ使ってたのをみてジェネレータって便利だと理解した。
def fibonacci(max): a,b = 0,1 while a < max: yield a a, b = b, a+b for n in fibonacci(1000): print n
とfibonacci関数定義するだけでフィボナッチ数が。perlで書いたのと同じようなアルゴリズムなのにperlより簡単にかけているのはyield文のせい。
060914追記
perlでもクロージャ使えば同じようにかけるわ。ということに朝起きたときに気づいた
sub fibonacci { my $max = shift; my ($fib,$a,$b,) = (0,0,1); return sub { ($fib,$a, $b) = ($a,$b, $a+$b); if ($a < $max){ return $fib; } } } my $f = fibonacci(100);
pythonにもクロージャってあるんだろうけど、ジェネレータとの使いわけってどうなるんだろうか?