【Python学习】yield send我就说这么多
C#的yield已经忘得差不多了。又遇到python的yield。
iterator
def testYield():
print 'yield1'
m = yield 1
print 'm =' , m
print 'yield2'
yield 5
for a in testYield():
print 'test'
result = testYield()
result.send('test')
print list(result)
OUTPUT:
yield1
test
m = None
yield2
test
File "C:\pytest\Sele\Generator.py", line 36, in <module>
result.send('test')
TypeError: can't send non-None value to a just-started generator
[Finished in 0.2s with exit code 1]
参考这里面的说:
http://www.jb51.net/article/15717.htm
send(something) and next()
第一次调用,send不能传非空值,不知道为什么,以后再搞明白
yield 在函数里出现,说明这个函数是generator,生成器,会被区别对待。
举个栗子~
def testYield(): m = yield 1
print type(m)
print m
m2 = yield 5
yield 88 result = testYield()
print result.next()
print result.send('fighting')
result.next()
print result.next()
# print list(result)
print result.next() A:给我做一块蛋糕, 并打包
哒哒哒,进入函数工厂
计算机: 好的,做好了。给你1 print.send('fighting') B:给我做一块蛋糕,让‘fighting’来做,并打包
哒哒哒,进入函数工厂
计算机:好的,这就让fighting去做。给你5 result.next()C:给我做一块蛋糕, 并打包
哒哒哒,进入函数工厂
计算机:好的,做好了。给你88,哎?人呢?
print result.next() D:给我做一块蛋糕, 并打包
哒哒哒,进入函数工厂
计算机: 没有原料了,做不出来蛋糕了,停止售卖 stop iteration
print list(result) E:看看你们能做啥
哒哒哒,进入函数工厂
计算机:我们空了 输出【】 正儿八经的输出是:
1
<type 'str'>
fighting
5
File "C:\pytest\Sele\Generator.py", line 39, in <module>
print result.next()
StopIteration
result = testYield()
result.next() #启动了这个生成器,直到第一个yield语句 hold
你去取这个 result.next(),比如print result.next(), 这个值才真正生成了,result.next()的type是int
result.send(something), 这个something会被传到yield表达式中,m= 'something'。type(m) is str. print m才能获得你用send传入的值。
说明什么呢?
你用send传什么东西,如果你在方法里并不用,就没什么用了。我暂时是这么想的。
result.send(something)继续寻找下一个yield,并hold
跟next()类似,send也会使得生成器停在那里。
print result.send(something) 出来的并不是something。print的是generator找到的下一个yield的值。
这翻译的生成器,就是生成函数的返回值对吧,yield英文是啥意思?produce生产一个东西
再看一个栗子~
def h():
print 'Wen Chuan'
m = yield 5 # Fighting!
print 'm=', m
d = yield 12
print 'We are together!'
print d
test = yield 35
print test
c = h()
current = c.next() # start generator, stop at the first yield
print current
current = c.send('Fighting!') # send current yield 'fighting', stop at the next yield
print current
c.send('got it')
print list(c)
print list(h())
输出:
Wen Chuan
5
m= Fighting!
12
We are together!
got it
None
[]
Wen Chuan
m= None next() = send(None)
We are together!
None
None
[5, 12, 35]
【时隔快一年,之前学习的python忘得差不多了。于是打算重新学】
http://anandology.com/python-practice-book/iterators.html
说点正常人能看懂的。之前写的我自己都看不懂。。下面英文是摘抄。
Generators simplifies creation of iterators. A generator is a function that produces a sequence of results instead of a single value.
Each time the yield
statement is executed the function generates a new value.
So a generator is also an iterator. You don’t have to worry about the iterator protocol.
The word “generator” is confusingly used to mean both the function that generates and what it generates. In this chapter, I’ll use the word “generator” to mean the genearted object and “generator function” to mean the function that generates it.
Can you think about how it is working internally?
When a generator function is called, it returns a generator object without even beginning execution of the function. When next
method is called for the first time, the function starts executing until it reaches yield
statement. The yielded value is returned by the next
call.
The following example demonstrates the interplay between yield
and call to next
method on generator object.
好的这段话说得不错,我来翻译一下。
说啊这个Generators是简化iterator的创建的。一个Generator是用来生成一串结果的方法,而不是仅返回一个值。
每次呢,yield语句一旦执行,这个方法就生产出一个新的值。
所以呢,这个generator也是一个迭代器。你就别担心iterator的规则它是否适用,答案是肯定的。
这个词"generator"到底意思是它的作用是生成还是说它生成的东西呢?这一点让人困惑。在俺们这里,我用generator来表示生成的对象,用generator function来表示它生成东西的这个作用。
当一个generator function被调用的时候呢,它会返回一个generator 对象,只是返回个对象,并不干其他的事情,甚至都没开始执行这个方法。
当next 方法第一次被调用的时候,这个方法才开始执行,直到它遇到了一个yield语句。这个yield(量产)的值作为next的返回值。
【Python学习】yield send我就说这么多的更多相关文章
- python学习 - yield
def myYield2(): for i in range(3): yield '2222 i am in myYield2', 'i = ', i def myYield(): for i in ...
- 【Python学习之十】yield之send方法
yield作用 简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator.下面以斐波拉 ...
- [Python 学习]2.5版yield之学习心得 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source …
[Python 学习]2.5版yield之学习心得 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source - [Pyth ...
- Python协程:从yield/send到async/await
这个文章理好了脉落. http://python.jobbole.com/86069/ 我练 习了一番,感受好了很多... Python由于众所周知的GIL的原因,导致其线程无法发挥多核的并行计算能力 ...
- 【Python学习笔记之二】浅谈Python的yield用法
在上篇[Python学习笔记之一]Python关键字及其总结中我提到了yield,本篇文章我将会重点说明yield的用法 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生 ...
- 理解Python协程:从yield/send到yield from再到async/await
Python中的协程大概经历了如下三个阶段:1. 最初的生成器变形yield/send2. 引入@asyncio.coroutine和yield from3. 在最近的Python3.5版本中引入as ...
- [Python学习笔记-005] 理解yield
网络上介绍yield的文章很多,但大多讲得过于复杂或者追求全面以至于反而不好理解.本文用一个极简的例子给出参考资料[1]中的讲解,因为个人觉得其讲解最为通俗易懂,读者只需要对Python的列表有所了解 ...
- Python学习--22 异步I/O
在同步IO中,线程启动一个IO操作然后就立即进入等待状态,直到IO操作完成后才醒来继续执行.而异步IO方式中,线程发送一个IO请求到内核,然后继续处理其他的事情,内核完成IO请求后,将会通知线程IO操 ...
- Python学习笔记(十)
Python学习笔记(十): 装饰器的应用 列表生成式 生成器 迭代器 模块:time,random 1. 装饰器的应用-登陆练习 login_status = False # 定义登陆状态 def ...
随机推荐
- sql语句表连接删除
DELETE 表1,表2FROM 表1 LEFT JOIN 表2 ON 表1.id=表2.id WHERE 表1.id=需要删除的ID
- GA:利用GA对一元函数进行优化过程,求x∈(0,10)中y的最大值——Jason niu
x = 0:0.01:10; y = x + 10*sin(5*x)+7*cos(4*x); figure plot(x, y) xlabel('independent variable') ylab ...
- xss的一般防护措施(及CreateDefaultBuilder源码)
从上个礼拜开始,公司的安全小组就开始排查公司项目的安全性,首屈一指的就是xss问题,为此我总结了下我的经验. 1.对后台程序的输出数据做html编码处理,前端做简单的替换处理 2.如果业务需要,后台可 ...
- 【NPOI】通过NPOI从内存流中创建EXCEL
一言不合就开始帖代码 XSSFWorkbook workbook = new XSSFWorkbook(); //创建工作簿 XSSFSheet sheet = (XSSFSheet)workbook ...
- 用Margin还是用Padding?(转载)
转载出自 海玉的博客 本文地址: http://www.hicss.net/use-margin-or-padding/ 用margin还是用padding这个问题是每个学习CSS进阶时的必经之路. ...
- 2018.我的NOIP补全计划
code: efzoi.tk @ shleodai noip2011 D1 选择客栈 这道题是一道大水题,冷静分析一会就会发现我们需要维护最后一个不合法点和前缀和. 维护最后一个不合法点只要边扫描边维 ...
- 写给踏入IT行业的自己
在IT工程师和培训机构多如牛毛的时代,拜师学艺并不难.但自学编程对于毫无基础的同学来说却可能是个问题,相信有过类似经历的朋友都有一把辛酸泪和一肚不吐不快的体会.让我们从一个故事说起… 故事 某君在一个 ...
- DevPress GridControl的使用
XtraGrid使用方法 XtraGrid的关键类就是:GridControl和GridView.GridControl本身不显示数据,数据都是显示在GridView/CardView/XXXXV ...
- 第一次OO阶段性总结
作业一 在第一次作业发布的时候对这次作业比较掉以轻心,因为之前在暑假的时候上过先导课,对面向对象的编程思想和java的语法都比较熟悉,加上有其他的事物分心,所以到了最后一天才开始着手写代码,轻视作业的 ...
- EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽
DbContextPool 是 ASP.NET Core 2.1 引入的新特性,可以节省创建 DbContext 实例的开销,但没有想到其中藏着一个小坑. 最近有一个 ASP.NET Core 项目持 ...