美文网首页
深入浅出理解yield

深入浅出理解yield

作者: harlan_win | 来源:发表于2019-04-10 10:47 被阅读0次

索引

https://www.cnblogs.com/Skrillex/p/6678196.html

转载部分内容来自:http://www.jianshu.com/p/d09778f4e055 [彻底理解yield]

http://blog.csdn.net/haskei/article/details/54908853 [深入理解yield]

简要

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的参数是返回给调用者的值。

------猜测next()和send(None)会设置一个开始点

------比如函数中有一个yield赋值,a = yield 5,第一次迭代到这里会返回5,a还没有赋值。第二次迭代时,使用.send(10),那么,就是强行修改yield 5表达式的值为10,本来是5的,那么a=10

------猜测send(n)时 x = yield y 的值就是本次send的值,也就是x=n!

实践

1.初步理解

[ 复制代码

](javascript:void(0); "复制代码")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">def yii(arr): for i in arr: yield i+1 arr = [1,2,3,4] for n in yii(arr): print(n)</pre>

[ 复制代码

](javascript:void(0); "复制代码")

显示结果:

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">2
3
4
5</pre>

2.次级理解

[ 复制代码

](javascript:void(0); "复制代码")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">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*3
for x in range(15):
res = next(s) print('结束并return:', res,'\r\n')</pre>

[ 复制代码

](javascript:void(0); "复制代码")

显示结果如下:

[ 复制代码

](javascript:void(0); "复制代码")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">D:\Lio\Python\PyInstall\python.exe D:/Servers/Python/dm04_test_send.py
Traceback (most recent call last):
File "D:/Servers/Python/dm04_test_send.py", line 17, in <module> res = next(s)
StopIteration
循环前
第一步 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 ......省略......

Process finished with exit code 1</pre>

[ 复制代码

](javascript:void(0); "复制代码")

循环与yield的图解

image

相关文章

  • 深入浅出理解yield

    索引 https://www.cnblogs.com/Skrillex/p/6678196.html 转载部分内容...

  • 重点汇总-python-gitbook-重要点学习-1

    Python中关键字yield有什么作用? 为了理解yield有什么用,首先得理解generators,而理解ge...

  • Python

    怎样理解for循环中用yield{}的用法

  • 迭代器

    我发现我之前还是没有理解迭代器。 最初的理解 定义的函数中有 yield 就是一个迭代器。 yield 只是暂时将...

  • yield的理解

    参考文档:https://www.ibm.com/developerworks/cn/opensource/os-...

  • 关于yield与 yield from的理解

    以下属于自我的理解,如果不太明白,别问我,我也很萌逼。 1.yield 主要用来生成一个生成器,每一次调用就返回一...

  • Python Yield 精髓

    对 Python 中的 Yield 一直理解的不够深刻,甚至存在误解。遇到一个神奇的用法后(多个 yield 连续...

  • 深入理解yield

    yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法。只是粗略的知道...

  • 深入理解yield

    转自Python中文开发者社区 yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白...

  • 深入理解yield

    yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法。 只是粗略的知...

网友评论

      本文标题:深入浅出理解yield

      本文链接:https://www.haomeiwen.com/subject/srzgiqtx.html