如何在Python中显式检测生成器端?

如何在Python中显式检测生成器端?,python,generator,Python,Generator,我编写了一个生成器,它返回值的元组: import numpy as np def mygenerator(): data = np.arange(10) data = np.reshape(data, (-1, 2)) for row in data: yield row[0], row[1] generator = mygenerator() while True: a, b = generator.__next__() print

我编写了一个生成器,它返回值的元组:

import numpy as np

def mygenerator():
    data = np.arange(10)
    data = np.reshape(data, (-1, 2))
    for row in data:
        yield row[0], row[1]

generator = mygenerator()
while True:
    a, b = generator.__next__()
    print("a: ", a, "b: ", b)

想在没有
的情况下使用它来。。。在
中。那么如何检测生成结束?

当生成器耗尽时,它将抛出异常
StopIteration
。您可以使用
try
except
语句捕获异常,并在异常发生时退出循环:

while True:
    try:
        a, b = next(generator)
    except StopIteration:
        break
    print("a: ", a, "b: ", b)
顺便说一句,为什么不为循环设置
?似乎:

for a, b in generator:
    print("a: ", a, "b: ", b)

完全按照您的要求执行,没有繁琐的构造。

对此进行了详细说明,并建议执行以下操作,生成器将耗尽,直到
下一步()
返回

import numpy as np

def mygenerator():
    data = np.arange(10)
    data = np.reshape(data, (-1, 2))
    for row in data:
        yield row[0], row[1]

generator = mygenerator()
a, b = next(generator, None)
while a and b:
    print("a: ", a, "b: ", b)
    a, b = next(generator, None)

只需继续在其上调用
next
,并手动捕获
StopIteration
?我知道这可能是一个恼人的问题,但为什么不能使用for循环呢?介意再给我们看一点代码,看看这是否真的不可能吗?我也有点惊讶,知道这个问题的答案可能是什么。这是Stackoverflow:如果你写复杂的例子,你让它简短,如果你写简短的例子,你让它使用适合这个简短例子的简单代码:)我不能用
。。。在
中,因为在我的真实代码中,我使用复杂的返回值处理和切换不同的循环。。。