「評価時間の差異」の下で、今日の落ち着きが「this list」から抜け出しており、苦労しています。発電機の評価時間の差異を回避する
は私の問題の短いデモンストレーションとして、私はn
が[2..5]
から行くと、すべてのn
番目の番号をスキップ無限発電機を作る:
from itertools import count
skip_lists = []
for idx in range(2, 5):
# skip every 2nd, 3rd, 4th.. number
skip_lists.append(x for x in count() if (x % idx) != 0)
# print first 10 numbers of every skip_list
for skip_list in skip_lists:
for _, num in zip(range(10), skip_list):
print("{}, ".format(num), end="")
print()
予想される出力:
1, 3, 5, 7, 9, 11, 13, 15, 17, 19,
1, 2, 4, 5, 7, 8, 10, 11, 13, 14,
1, 2, 3, 5, 6, 7, 9, 10, 11, 13,
実際の出力:
1, 2, 3, 5, 6, 7, 9, 10, 11, 13,
1, 2, 3, 5, 6, 7, 9, 10, 11, 13,
1, 2, 3, 5, 6, 7, 9, 10, 11, 13,
私はその大きな特徴を思い出したら
、私はskip_list
の一部となる定数にif
句の変数を結合することによって、それを「解決」してみました:
from itertools import count
skip_lists = []
for idx in range(2, 5):
# bind the skip distance
skip_lists.append([idx])
# same as in the first try, but use bound value instead of 'idx'
skip_lists[-1].append(x for x in count() if (x % skip_lists[-1][0]) != 0)
# print first 10 numbers of every skip_list
for skip_list in (entry[1] for entry in skip_lists):
for _, num in zip(range(10), skip_list):
print("{}, ".format(num), end="")
print()
しかし、再び:
1, 2, 3, 5, 6, 7, 9, 10, 11, 13,
1, 2, 3, 5, 6, 7, 9, 10, 11, 13,
1, 2, 3, 5, 6, 7, 9, 10, 11, 13,
実際の解決策は別として、なぜ私のハックがうまくいかなかったのかを知りたいです。
グレート答えは、私のコードは=動作するようになりました)しかし、私は 'skip_lists.append([idx])'に 'idx'を格納し、' idx'の代わりにそれにアクセスするのはなぜうまくいかないのかまだ分かりません。この値は最後の反復に変わらず、 'print(skip_list)'は結局、2番目の例では[[2、]、[3、]、[4、]]を返します。 –
Arne
ジェネレータ式のコードオブジェクトは、最初にループが完了した後に、評価しているときに 'idx'という名前から読み込みます。より多くの場合、そのループの後に 'idx'を表示してください。その時点での名前 'idx'はint 4を参照します。 –
これは恐ろしいことです。 'skip_lists.append([lambda x idx:x])'はローカルスコープの参照を作成することさえできません。私にこれを解決する方法を教えてくれてありがとう。 – Arne