【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 ...
随机推荐
- 习题集1a:研究方法入门
1.课程实践编号 课程实践编号 随着对习题集“PS 1a:研究方法入门”和其他习题集的了解,你可能会发现进度栏中的习题编号并非一直是连续的. 对于存在两个习题集的课程,如果一个习题集看上去“缺失”习题 ...
- Mapreduce概述和WordCount程序
一.Mapreduce概述 Mapreduce是分布式程序编程框架,也是分布式计算框架,它简化了开发! Mapreduce将用户编写的业务逻辑代码和自带默认组合整合成一个完整的分布式运算程序,并发的运 ...
- zepto.js移动端城市选择插件
http://sc.chinaz.com/jiaoben/170327301850.htm
- 使用163.com邮箱发送邮件
不要直接使用登录的密码,而是用配置中的授权码做为密码
- NumPy数组对象
1.创建NumPy数组 import numpy as np # 创建3*2*4的三维数组 a = np.arange(24).reshape(3, 2, 4) # 打印三维数组的所有元素 print ...
- 1#Two Sum(qsort用法)
void*空类型指针,就好像暂时还没有确定类型,任何类型都可以赋给它.但是具体操作时一定要确定类型(如下,比较时先转Node) cmp返回一定是int,有-1,0,1三种,如果是1则第一个数要放在第二 ...
- ECMA Script 6_解构赋值_模式匹配
解构赋值 从数组中提取值,按照对应位置,对变量赋值 只要等号右边的值不是对象或数组,就先将其转为对象. 由于 undefined 和 null 无法转为对象,所以对它们进行解构赋值,都会报错 let ...
- PHP 常用设计模式 (转载)
1.单例模式 单例模式顾名思义,就是只有一个实例.作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的要点有三个: 一是某个类只能有一个实例: ...
- MacBook Air 装win10系统 by DODUI
为了给齐哥更完美的体验Windows10系统,DODUI亲手操刀MacBook双系统安装Win10,双系统安装教程如下: 终于遇到各种奇葩问题,给小伙伴分享一下. 双系统安装Win10准备工具: 1. ...
- Python全栈-magedu-2018-笔记7
第三章 - Python 内置数据结构 线性结构 线性结构 可迭代 for ... in len()可以获取长度 通过下标可以访问 可以切片 学过的线性结构 列表.元组.字符串.bytes.bytea ...