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))
自学Python:生成器 练习题 没看明白代码执行顺序???,高手指点
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
6条回答 默认 最新
- CSDN专家-天际的海浪 2021-04-14 22:20关注
你的代码有两个生成器,第一个是
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)
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 2无用
悬赏问题
- ¥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 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算