def add(s, x): return s + x def gen(): for i in range( 3 ): yield i base = gen() for n in [30,1,20]: base = (add( i, n ) for i in base) print(list(base))
你的代码有两个生成器,第一个是
def gen():
for i in range( 3 ):
yield i
gen()函数中包含yield关键字,这个函数就是一个生成器(generator)。
调用gen()函数就是创建了一个生成器(generator)对象。
base = gen() 是返回一个generator对象给base,这时是不执行gen()函数的。
只有在第一次调用base.__next__() 或 next(base)时gen()函数才开始执行。
你是用for循环来迭代,就是每次循环在for循环内部调用.__next__()。
当执行到yield i时返回i,并且记住这个返回的位置,下次迭代时,代码从yield的下一条语句开始执行。
比如
base = gen()
print(next(base)) 第一次返回0
print(next(base)) 第二次返回1
print(next(base)) 第三次返回2
由于gen()函数中 for i in range( 3 ):只循环3次。
如果第四次next(base)会结束gen()函数。这时会抛出 StopIteration(迭代停止的异常)
在用for循环来迭代base时,就是通过捕获 StopIteration异常来判断循环结束的。
第二个生成器是 (add( i, n ) for i in base)
和第一个生成器类似,只是它每返回一个add( i, n )都隐式的执行yield。
相当于 (yield add( i, n ) for i in base)
https://www.cnblogs.com/liangmingshen/p/9706181.html
这个讲解的很详细
for 中 base = (add( i, n ) for i in base) 执行了三遍。等于本次循环创建的generator对象 套用了上次循环的generator对象
等于是
base2 = (add( i, n ) for i in base)
base3 = (add( i, n ) for i in base2)
base4 = (add( i, n ) for i in base3)
print(list(base4))
迭代时除了最初的base返回0,1,2, 还要每个值加三次n。
而且迭代是在list(base)时才开始执行,这时for n in [30,1,20]:循环已经结束了,
n的值都是最后一次循环的值20
《请问我的这个代码 for n in [30,1,20]: 同等于 for i in range(3): 的意思吗? 》
循环的次数等同于,但只有最后一次的20起了作用
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,欢迎您加入CSDN!
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y