对于python yield的理解

网上的解释https://www.cnblogs.com/Skrillex/p/6678196.html):
yield是生成器中的一个关键字,他的作用和返回差不多,但是又有很大的区别:
1.下一次迭代时,从上一次迭代遇到的yield后面的代码开始执行

2.简要理解:yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后开始。

3.第一次调用时必须先next()或send(None),否则会报错,send后之所以为None是因为这时候没有上一个yield。可以认为,next()等同于send(None)。
----next()和send(None)会是生成器函数执行一遍,然后到yield的地方停下,下一次使用next(),send(None)时,从这个地方开始

4.send(msg)与next()的区别在于send可以传递参数给yield表达式,这时传递的参数会作为yield表达式的值,而yield的参数是返回给调用者的值。

自己的理解:
首先如果使用迭代器的话,那么他也会在返回一个值之后指向下一个值
但是这个 yield 主要使用在函数: 他是把 迭代器那个“堆”换成了 函数
如下所示:

def yii(arr):
for i in arr:
yield i+1

arr = [1,2,3,4] for n in yii(arr):
print(n)

显示结果:

2
3
4
5

下面这个是高级理解:

def shengcheng():
print(‘循环前’)
for i in range(5):
print(‘第一步’,i)
yield i
print(‘第二步:’,i)
yield i
print(‘第三步’,i)
yield i

s = shengcheng() res = s.send(None)print(‘sendNone结束\r\n’)
#yield也会结束这个循环,所以得把range(n)的n设大一点5*3for x in range(15):
res = next(s)
print(‘结束并return:’, res,’\r\n’)

显示结果如下:

循环前 第一步 0
sendNone结束

第二步: 0 结束并return: 0

第三步 0 结束并return: 0

第一步 1 结束并return: 1

第二步: 1 结束并return: 1

第三步 1 结束并return: 1

第一步 2 结束并return: 2

第二步: 2 结束并return: 2

第三步 2 结束并return: 2

第一步 3 结束并return: 3

…省略…

首先这个利用send()的话是直接退出因为 yield 具有 return 相似的作用所以直接返回所以结束了 方法的遍历(但是内存记住了这个位置 如果下次还使用yield的话就会从下一个位置继续)

所以在后续的利用next()这个方法就是在刚刚send()方法后继续

猜你喜欢

转载自blog.csdn.net/qq_42224330/article/details/88651236