内容简介:我是从这个时候yield的主要作用应该在于节省内存,例如查询数据库的时候,结果的数量非常 多,此时yield就可以发挥作用,在用到它的时候才产生数据。而不是像list一样保存 所有的数据。
我是从 python 2.7
开始接触的,要说 python 的各种历史,我还真的说不出来。
不过好在有 peps
记录了python的发展和进化。今天我们来挖挖 yield
的
历史。
PEP-255
: 在2001年的时候,
yield首次在python中出现。这时候的用法比较简单,只是单纯的作为 generator
:
In [1]: def foo(): ...: for i in range(10): ...: yield i ...: In [2]: gen = foo() In [3]: for i in gen: ...: print(i, end=', ') ...: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
这个时候yield的主要作用应该在于节省内存,例如查询数据库的时候,结果的数量非常 多,此时yield就可以发挥作用,在用到它的时候才产生数据。而不是像list一样保存 所有的数据。
PEP-380
: 这个pep介绍了新的语法 yield from
。他的作用主要是把对原本的generator产生作用的语句指向另外一个
generator,例如:
In [1]: def foo(): ...: for i in range(10): ...: yield i ...: In [2]: def bar(): ...: yield from foo() ...: In [3]: gen = bar() In [4]: for i in gen: ...: print(i, end=', ') ...: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
通过 yield from foo()
我们能直接从 bar()
这个generaotor里拿到 foo()
产
生的值。这也是传说中的代理模式的应用。
yield 和 yield from 有区别吗?什么时候该用哪个?
我们分别用一下:
In [1]: def foo(): ...: yield [1, 2, 3] ...: In [2]: def bar(): ...: yield from [1, 2, 3] ...: In [3]: for i in foo(): ...: print(i) ...: [1, 2, 3] In [4]: for i in bar(): ...: print(i) ...: 1 2 3
可以看出来,如果直接yield那是会直接把整个 [1, 2, 3]
给yield出来。什么时候
用yield什么时候用yield from傻傻分不清怎么办?有一个trick,但是如果你用这个
被主管打了可千万别怪我:
In [1]: class Future: ...: pass ...: In [2]: def foo(): ...: yield Future() ...: In [3]: def bar(): ...: yield from Future() ...: In [4]: for i in foo(): ...: pass ...: In [5]: for i in bar(): ...: pass ...: ------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-5-c0dd2fd4aa2d> in <module>() ----> 1 for i in bar(): 2 pass <ipython-input-3-1c731241676c> in bar() 1 def bar(): ----> 2 yield from Future() 3 TypeError: 'Future' object is not iterable In [6]: class Future: ...: def __iter__(self): ...: yield self ...: In [7]: for i in bar(): ...: pass ...: In [8]:
为什么?因为
def foo(): yield from bar()
几乎相当于
def foo(): for i in bar(): yield i
但是不同的是, yield from
会把对 foo() 作用的 next
, .send
, .throw
全部
传递给 bar() 但是后面一种形式不会,也就是说后面一种形式把代理这个动作几乎丢掉
了。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 番外篇2-基本规范、注释、static关键字、import关键字
- 说说iOS中的常用的关键字static ,class(仅限Swift关键字)
- Golang 关键字
- 2019 关键字
- golang关键字
- final关键字深入解析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java遗传算法编程
Lee Jacobson、Burak Kanber / 王海鹏 / 人民邮电出版社 / 2016-12-6 / 49元
本书简单、直接地介绍了遗传算法,并且针对所讨论的示例问题,给出了Java代码的算法实现。全书共分灾6章。第1章简单介绍了人工智能和生物进化的知识背景,这也是遗传算法的历史知识背景。第2章给出了一个基本遗传算法的实现;第4章和第5章,分别针对机器人控制器、旅行商问题、排课问题展开分析和讨论,并给出了算法实现。在这些章的末尾,还给出了一些练习供读者深入学习和实践。第6章专门讨论了各种算法的优化问题。 ......一起来看看 《Java遗传算法编程》 这本书的介绍吧!