2016-06-01 7 views
1

pythonでcallableのリストを反復処理することに問題があります。呼び出し可能文字列は、文字列のジェネレータで呼び出されるはずです。現在の動作では、リスト内の最後の呼び出し可能オブジェクトは、リスト内の呼び出し可能オブジェクトの数だけ呼び出されます。私の現在のコード:callableのリストを反復する問題

for m in list_of_callables: 
    strings = (m(s) for s in strings) 

上記のコード文字列は、最初に 'Generator'タイプです。私はまた、次のことを試してみました:これは、どちらかの仕事をしていない

for i in range(len(list_of_callables)): 
    strings = (list__of_callables[i](s) for s in strings) 

、私は呼び出し可能オブジェクトをループしないし、単にそれだけで正常に動作し、それらを呼び出すとき:

strings = (list_of_callables[0](s) for s in strings) 
strings = (list_of_callables[1](s) for s in strings) 

これはに奇妙なよう上記のように私はforループと同等でなければなりません。

ご協力いただきありがとうございます:)。

+3

これは、[遅延バインディング閉鎖]のエピソードのように聞こえる(http://docs.python-guide.org/en/latest/ write/gotchas /#late-binding-closures) –

+1

「ジェネレータ」とは何かを知っていますか?私は[ジェネレータ式](https://docs.python.org)の代わりに[list comprehension](https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions)を使用したいと思います/3/reference/expressions.html#generator-expressions)。 –

+1

ここで期待される動作は何ですか?ジェネレータの内側と外側の両方にある識別文字列「文字列」を再利用すると、私は混乱します。そのため、コードの背後にある推論を理解することが非常に難しくなります。 –

答えて

3
strings = (m(s) for s in strings) 

これは実際にあなたの呼び出し可能関数を呼び出すわけではありません。 mの後にを呼び出すジェネレータ式を作成します。mは後でになります。

ループの後には、mが最後の呼び出し可能です。 stringsから要素を取得しようとすると、これらのネストされたジェネリックスはすべてmを検索して値を計算し、最後に呼び出し可能なものをすべて見つけます。

あなたが代わりにgenexpのitertools.imapを使用することによってこの問題を解決することができます:

strings = itertools.imap(m, strings) 
+0

ありがとうございました。 –