reduce やら、ジェネレータやらのドキュメントを見ていて、
reduce とジェネレータ式(所謂ジェネレータとは違う?)の違いが見えなかったので、
その動作調査に関するメモ。
以下、1〜3行目は、python ドキュメントに載っているジェネレータ式のサンプルで、
xvec と yvec の内積を計算することができる。ドキュメントにも書いてあるけど、
リストの内包表現に近い形("()","[]"という違いがある。)で表現することができる。
リストの各要素に対して演算を施し、最終的に一つの値が出てくるところが、
なんとなく reduce に似ているなと思い、似たことが reduce を使って出来ないかと
思い、やってみた結果が4行目。
式を書いてみて気付いたのは、得られる結果は同じだけど、
根本的にやらんとしていることが違うということ。
ジェネレータ式の方は、単にリスト化されたタプルのそれぞれの要素を計算している
だけであり、sum() が最終的に一つの値にしてくれているのに対して、
reduce の方は、端から単一の値を出すための計算をしている。
なので、ジェネレータ式の意味を理解するには、5〜6行目の方がいいような気がするけど、
逆にこうするとリストの内包表現(7〜8行目)との違いが見えにくくなる。。。
いまいち、まだジェネレータが役立つコードが書けてないな。。。
xvec = [10, 20, 30]
yvec = [7, 5, 3]
print sum(x*y for x,y in zip(xvec, yvec))
print reduce(lambda i,j: i+j, [x * y for x,y in zip(xvec, yvec)])
for z in (x*y for x,y in zip(xvec, yvec)):
print z
for z in [x*y for x,y in zip(xvec, yvec)]:
print z
0 件のコメント:
コメントを投稿