张岂逢 2021-04-14 20:31 采纳率: 60%
浏览 85
已采纳

自学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)) 
  • 写回答

6条回答 默认 最新

  • 关注

    你的代码有两个生成器,第一个是

    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) 

     

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算