s = (i for i in range(1, 3)) # ① print(s.__next__()) # ② for i in s: print(i) # ③
A. 语句①的s是一个元组:错误。语句①使用圆括号(i for i in range(1, 3))创建的是一个生成器表达式(generator expression),而不是元组。生成器表达式会返回一个生成器对象,该对象在迭代时逐个产生值(惰性求值)。如果创建元组,应使用tuple()或显式写成s = (1, 2)。因此,s是生成器,不是元组。
B. 语句②的输出结果为1:正确。语句②print(s.__next__())调用生成器s的__next__()方法。生成器s由range(1, 3)初始化,产生序列[1, 2](range左闭右开,包括1,不包括3)。第一次调用__next__()返回第一个值1,因此输出结果为1。
C. 语句③的输出结果为1 2:错误。语句③指的是for i in s: print(i)部分的输出。在语句②中,生成器s的第一个值1已被消耗,因此生成器当前位置在第二个元素。for循环遍历生成器s剩余的元素,只有一个值2,所以输出结果为2,而不是1 2。整个程序的输出是:
D. 语句③可以替代为while s.__next__(): print(s.__next__()):错误。该替代代码会导致运行时错误。原因:
生成器s在语句②后剩余一个值2。
while s.__next__(): 首先调用s.__next__(),返回2(条件为True),进入循环体。
循环体内print(s.__next__())试图再次调用s.__next__(),但生成器已无更多元素,引发StopIteration异常。
原for循环会自动处理StopIteration并优雅结束,而替代代码会因异常而终止。