2017-10-24 17 views
0

数字の組み合わせの一覧が表示されますが、代わりに何も印刷されません。私は何が欠けていますか?印刷がジェネレータの式で動作しない

import itertools 

def PrintIt(num): 
    print(num) 
    return True 

nums = itertools.permutations(range(1, 10)) 

x = (num for num in nums if PrintIt(num)) # Prints nothing 

print(list(x))の場合、すべての異なる順列が期待どおりに出力されます。

+2

'x'は反復処理されていないジェネレータです。あなたは 'list'を呼び出したときにそれを繰り返します。あなたの質問は何ですか?あなたはそれが 'x'に割り当てられた行に印刷することを期待しましたか? –

答えて

2

理由は、xをジェネレータ式に割り当てているためです。ジェネレータ式は、必要な場合を除いて計算を行いません。計算をより簡単にするには、強制的にリストにすることです。そのような状況では、Pythonはリストを作成する必要があります。そのため、pythonはすべての計算を実行しなければなりません。あなたはそれがこのように印刷することができますので:ところで

x = [num for num in nums if PrintIt(num)] 

または

x = (num for num in nums if PrintIt(num)) 
list(x) 

を、あなたの印刷機能を持つ必要はありません、あなただけ行っている可能性:

x = [num for num in nums if print(num)] 

しかし、ifを使用して、いくつかの状態をテストするのではなく、あなたがここでやっているような副作用についてのみ、議論の余地があります。あなたのプログラムを書く方法は次のとおりです。

import itertools 
nums = itertools.permutations(range(1, 10)) 
for num in nums: 
    print(num) 
+0

副作用については何も言及していません。その関数はブール値を返しています。 –

+0

しかし、あなたはその価値について本当に気にしません。私は、評価の結果に興味があったのではなく、彼らが副作用(画面上での印刷)に興味があったからである。式が評価されます。そして、それはclunkyです、それは私が議論しているすべてです。 –

+0

あなたはそうですね。だからこそ、それは「if」の中にあるのです。 OPの機能が単に印刷する以上のことをしたとしましょう... –

関連する問題