自学Python:生成器 练习题 没看明白代码执行顺序???,高手指点

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