0

これはうまくいきます:

>>> def my_range(stop):
    i = 0
    while i < stop:
        yield i
        i += 1

>>> [k for k in my_range(10) if k < 5]
[0, 1, 2, 3, 4]

次に、ジェネレーターを変更します。

>>> def my_range():
    i = 0
    while True:
        yield i
        i += 1

>>> result = []
>>> for k in my_range():
    if k < 5:
        result.append(k)
    else:
        break


>>> print(result)
[0, 1, 2, 3, 4]

では、なぜこれが無限ループに陥ってしまうのでしょうか。私は k < 5 を持っていますが、ジェネレーターは next が呼び出されたときにのみ反復するはずではありませんか?

>>> [k for k in my_range() if k < 5]
4

2 に答える 2

7

breakLCの条件は、 falseを返す場合を意味するものではありません。その動作が必要な場合はitertools、具体的に調べてくださいtakewhile()

于 2013-02-08T03:33:47.510 に答える
6

この答えはそれをよく説明しています:

次の点に注意してください。

[ expression for item in list if conditional ]

以下と同等です。

for item in list:
    if conditional:
        expression

つまり、リスト内包表記:

[k for k in my_range() if k < 5]

次と同等です。

for k in my_range():
    if k < 5:
        k

これで、なぜこれが終わらないのかが明らかになるはずです。実際にbreakは、無限ループには何もありません。

于 2013-02-08T03:39:38.150 に答える