Python中yield深入理解
众所周知,python中的yield有这样的用法:
def test(alist):
for i in alist:
yield i
这样,这个test函数就变成了一个生成器,当每次调用的时候,就会自动返回当前值。比如:
a = [1,2,3,4,5]
for i in test(a):
print(i)
我们也可也手动遍历这个生成器:
test(a).__next__()
yield进阶
当某个函数包含了yield,就表示这个函数为一个生成器,在执行上会和普通的函数有很多不同。比如:
def test():
print('This is a test!')
yield 5
直接调用test函数的时候(test()),print函数是不会执行的,只有通过__next__()方法才能真正调用这个函数:test().__nexty__(). 再来一个例子:
def test():
print('This is a test!')
yield 5
print('Written by Eric')
>>> t = test() #注意这里一定要先实例化,如果直接用test().__next__()会反复返回第一次的值,不会报错
>>> t.__next__()
This is a test!
5
>>> t.__next__() #第二次调用的时候会执行到第二个yield,由于不存在,则返回错误
written by eric
Traceback (most recent call last):
File "<pyshell#47>", line 1, in <module>
t.__next__()
StopIteration
send函数
__next__()函数和send()函数在某些情况下是一样的:
__next__() 等效于 send(None)
send()函数的作用是向yield表达式中传参数. 举个例子:
def test():
print('This is a test!')
v = yield 5
print('The value of v is :', v)
yield 10
print('Written by Eric')
>>> t = test()
>>> t.send(None) #等效于t.__next__()
This is a test!
5
>>> t.send(66)
The value of v is: 66 #v值已改变
10
值得注意的是,send更改的是在yield调用之后的值:
>>> t = test()
>>> v_temp = t.__next__()
This is a test!
>>> print(v_temp) #此时v的值为5
5
>>> t.send(66) #此时v的值被更改为66
The value of v is: 66
10
也就是说,我们可以利用这个send函数更改yield断点的值从而影响后面的部分,但是不影响之前的部分
Python中yield深入理解的更多相关文章
- python中yield的理解
首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂 ...
- [转]Python中yield的解释
转自: http://python.jobbole.com/83610/ 本文作者: 伯乐在线 - wklken .未经作者许可,禁止转载!欢迎加入伯乐在线 专栏作者. 翻译 来源于stackover ...
- [翻译]Python中yield的解释
问题: Python中yield关键字的作用是什么?它做了什么? 例如,我想理解以下代码 def node._get_child_candidates(self, distance, min_dist ...
- Python中yield和yield from的用法
yield python中yield的用法很像return,都是提供一个返回值,但是yield和return的最大区别在于,return一旦返回,则代码段执行结束,但是yield在返回值以后,会交出C ...
- Python Deque 模块使用详解,python中yield的用法详解
Deque模块是Python标准库collections中的一项. 它提供了两端都可以操作的序列, 这意味着, 你可以在序列前后都执行添加或删除. https://blog.csdn.net/qq_3 ...
- python中yield用法
在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor). 一.迭代器(iterator) 在Python中,for循环可以用于Python中的任何 ...
- python中yield的用法
---"在python中,当你定义一个函数,使用了yield关键字时,这个函数就是一个生成器" (也就是说,只要有yield这个词出现,你在用def定义函数的时候,系统默认这就不是 ...
- python中yield使用
16.yield使用 列表推导与生成器表达式 当我们创建了一个列表的时候,就创建了一个可以迭代的对象: >>> squares=[n*n for n in range(3)] ...
- 关于Python中yield的一些个人见解
# 样例代码def yield_test(n): for i in range(n): yield call(i) print("i=",i) #做一些其它的事情 print(&q ...
随机推荐
- MySQL行级锁、表级锁、页级锁详细介绍
原文链接:http://www.jb51.net/article/50047.htm 页级:引擎 BDB.表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行行级:引擎 INNODB , ...
- [Head First Python]5. 推导数据:处理数据
读取4个文件内容,格式化数据,升序,显示每个文件前3个数据 julie.txt 2.59,2.11,2:11,2:23,3-10,2-23,3:10,3.21,3-21 james.txt 2-34, ...
- H5本地存储
在HTML5中可以把数据长期存储在客户端,使用的对象就是localStorage. localStorage常用方法有setItem.getItem.removeItem.clear. 下面是一个存储 ...
- text-overflow 文字溢出时的设置
text-overflow : clip | ellipsis clip: 不显示省略标记(...),而是简单的裁切. ellipsis: 当对象内文本溢出时显示省略标记(...) 设置或检索是否使用 ...
- Java所有编码问题参考手册
一.编码基本知识 1.iso8859-1 ——属于单字节编码,最多能表示的字符范围是 0-255,应用于英文系列.比如,字母 'a' 的编码为0x61=97. 很明显,iso8859-1 编码表示的 ...
- JS闭包的概念
原文地址:http://zhidao.baidu.com/link?url=f81iaijX6nzY99Wz43v-p_qZEn4cCaomT4LD6NH5jVtI0yK2V76VJWefih51vA ...
- UESTC_树上的距离 2015 UESTC Training for Graph Theory<Problem E>
E - 树上的距离 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 262143/262143KB (Java/Others) Subm ...
- Unique Paths 解答
Question A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram be ...
- html5 laboratory - drawing in the canvas
html5 laboratory - drawing in the canvas Creating a bar chart with canvas 21st February 2010 The exp ...
- Java Service Wrapper
Java Service Wrapper 将Java 应用程序部署成Windows系统服务Java Service Wrapper 1 Product Overview 1 Editions 2 Me ...