众所周知,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深入理解的更多相关文章

  1. python中yield的理解

    首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂 ...

  2. [转]Python中yield的解释

    转自: http://python.jobbole.com/83610/ 本文作者: 伯乐在线 - wklken .未经作者许可,禁止转载!欢迎加入伯乐在线 专栏作者. 翻译 来源于stackover ...

  3. [翻译]Python中yield的解释

    问题: Python中yield关键字的作用是什么?它做了什么? 例如,我想理解以下代码 def node._get_child_candidates(self, distance, min_dist ...

  4. Python中yield和yield from的用法

    yield python中yield的用法很像return,都是提供一个返回值,但是yield和return的最大区别在于,return一旦返回,则代码段执行结束,但是yield在返回值以后,会交出C ...

  5. Python Deque 模块使用详解,python中yield的用法详解

    Deque模块是Python标准库collections中的一项. 它提供了两端都可以操作的序列, 这意味着, 你可以在序列前后都执行添加或删除. https://blog.csdn.net/qq_3 ...

  6. python中yield用法

    在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor). 一.迭代器(iterator) 在Python中,for循环可以用于Python中的任何 ...

  7. python中yield的用法

    ---"在python中,当你定义一个函数,使用了yield关键字时,这个函数就是一个生成器" (也就是说,只要有yield这个词出现,你在用def定义函数的时候,系统默认这就不是 ...

  8. python中yield使用

    16.yield使用   列表推导与生成器表达式   当我们创建了一个列表的时候,就创建了一个可以迭代的对象: >>> squares=[n*n for n in range(3)] ...

  9. 关于Python中yield的一些个人见解

    # 样例代码def yield_test(n): for i in range(n): yield call(i) print("i=",i) #做一些其它的事情 print(&q ...

随机推荐

  1. commons-logging 和 log4j 之间的关系

    我们在做项目时,日志的记录是必不可少的一项任务,而我们通常是使用 apache 的 log4j 日志管理工具.然而,在项目中,我们经常会看到两个 jar 包:commons-logging.jar 和 ...

  2. 优先队列(和fence repair完全一样)

    懒省事的小明 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述       小明很想吃果子,正好果园果子熟了.在果园里,小明已经将所有的果子打了下来,而且按果子的不同种 ...

  3. CodeForces 25E Test KMP

    Description Sometimes it is hard to prepare tests for programming problems. Now Bob is preparing tes ...

  4. mysql的client和sever之间通信password的传输方式

    本文想要说明的是,当我们用mysql -uroot -p1234567 -h127.0.0.1 -P3306 去连接mysql server时密码是通过什么样的形式传过去的呢? 首先密码这种东西明文传 ...

  5. Window 点击“X”关闭之后无法show

    将Window的属性closeAction设置为hide就可以了. var panel1 = Ext.create('Ext.panel.Panel', { title: 'this is panel ...

  6. Qt Quick - 开启下一代交互动效原型设计(效果很美,相关系列博文)

    http://blog.csdn.net/unixzii/article/details/46501265

  7. tr 替换删除字符

    1.关于tr    通过使用 tr,您可以非常容易地实现 sed 的许多最基本功能.您可以将 tr 看作为 sed 的(极其)简化的变体:它可以用一个字符来替换另一个字符,或者可以完全除去一些字符.您 ...

  8. 在javascript中使用com组件的方法

    转载自:  http://dhailin.blog.163.com/blog/static/230738322011128102043880/ 首先创建一个COM组件,插入一个双接口Itest,在此接 ...

  9. Rotate Array 解答

    Question Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, t ...

  10. ※数据结构※→☆非线性结构(tree)☆============二叉树 顺序存储结构(tree binary sequence)(十九)

    二叉树 在计算机科学中,二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用作二叉查找树和二叉堆或是 ...