Pythonで関数型プログラミングを試しているときに、同じ結果になるはずの2つの式の違いに気づきました。
特に、私がしたいのは、他のイテラブルで構成されている(または、利回りと言うべきですか?)イテラブルを持つことです。私がやりたいことの簡単な例は次のとおりです。
import itertools as itr
itr.repeat(itr.repeat(1,5),3)
これは 3 つの iterable から構成される iterable であり、それ自体が 1 の 5 回のオカレンスで構成されています。しかし、これは起こることではありません。代わりに(リストに変換されて)得られるものは次のとおりです。
[[1,1,1,1,1],[],[]]
つまり、最も内側の iterable はコピーされません (そのように見えます) 代わりに、同じ iterable が何度も使用され、要素が不足します。
マップを使用して機能するこれのバージョンは次のとおりです。
import itertools as itr
map(lambda x: itr.repeat(1,5), range(3))
これにより、私が期待する結果が得られます。
[[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1]]
繰り返しのみを使用する方法では機能しないのに、なぜこれが機能するのかわかりません。たぶん、マップ バージョンでは iterable がrepeat
lambda でラップされているという事実と関係がありますが、違いはあるのでしょうか? 私が見る限り、 と の唯一の違いlambda x: itr.repeat(1,5)
はitr.repeat(1,5)
、最初のものは引数を取り (その後破棄します)、もう 1 つは引数を取りません。