【发布时间】:2014-10-21 11:50:04
【问题描述】:
我很困惑为什么不同的循环结构在与简单的生成器一起使用时表现如此不同。考虑以下代码:
example_list = [1, 2, 3, 4, 5]
for_count = 0
next_count = 0
while_count = 0
def consumer(iterable):
for item in iterable:
yield
return
for item in consumer(example_list):
print("For Count: {0}".format(for_count))
for_count += 1
# First while loop
while consumer(example_list).next():
print("Next Count: {0}".format(next_count))
next_count += 1
# Second while loop
while consumer(example_list):
print("While Count: {0}".format(while_count))
while_count += 1
if while_count > 10: # add contrived limit for infinite loop
break
这段代码的输出是:
计数:0
计数:1
计数:2
计数:3
计数:4
而计数:0
而计数:1
而计数:2
而计数:3
而计数:4
计数:5
计数:6
计数:7
计数:8
计数:9
而计数:10
如果您能帮助理解以下内容,我将不胜感激:
-
for循环如何知道何时结束但第二个while循环不知道?我预计两个while循环都会立即退出,因为产生了None。 - 为什么不使用
.next()引发异常?consumer例程不是一个定义了__next__()方法的类,那么当您使用yield关键字时它会神奇地出现吗? - 为什么如果我将
consumer更改为yield item,第一个while循环会像第二个一样变为无限? - 如果我将
consumer更改为简单地返回而不是产生任何东西,第二个while循环将立即退出而不是变为无限。我一直认为yield本质上是一个return,您可以从中恢复。为什么while循环会以不同方式处理它们?
【问题讨论】:
标签: python loops return generator yield