Quantcast
Channel: CodeSection,代码区,Python开发技术文章_教程 - CodeSec
Viewing all articles
Browse latest Browse all 9596

yield python

$
0
0
3. (译)python关键字yield的解释(stackoverflow) 译者: hit9 原文: http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained 译者注: 这是stackoverflow上一个很热的帖子,这里是投票最高的一个答案

Contents

(译)Python关键字yield的解释(stackoverflow) 提问者的问题 回答部分 可迭代对象 生成器 yield关键字 回到你的代码 控制生成器的穷尽 Itertools,你最好的朋友 了解迭代器的内部机理 3.1. 提问者的问题

Python关键字yield的作用是什么?用来干什么的?

比如,我正在试图理解下面的代码:

def node._get_child_candidates(self, distance, min_dist, max_dist):
if self._leftchild and distance - max_dist < self._median:
yield self._leftchild
if self._rightchild and distance + max_dist >= self._median:
yield self._rightchild

下面的是调用:

result, candidates = list(), [self]
while candidates:
node = candidates.pop()
distance = node._get_dist(obj)
if distance <= max_dist and distance >= min_dist:
result.extend(node._values)
candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))
return result

当调用 _get_child_candidates 的时候发生了什么?返回了一个链表?返回了一个元素?被重复调用了么? 什么时候这个调用结束呢?

3.2. 回答部分

为了理解什么是 yield ,你必须理解什么是生成器。在理解生成器之前,让我们先走近迭代。

3.3. 可迭代对象

当你建立了一个列表,你可以逐项地读取这个列表,这叫做一个可迭代对象:

>>> mylist = [1, 2, 3]
>>> for i in mylist :
... print(i)
1
2
3

mylist 是一个可迭代的对象。当你使用一个列表生成式来建立一个列表的时候,就建立了一个可迭代的对象:

>>> mylist = [x*x for x in range(3)]
>>> for i in mylist :
... print(i)
0
1
4

所有你可以使用 for..in.. 语法的叫做一个迭代器:链表,字符串,文件……你经常使用它们是因为你可以如你所愿的读取其中的元素,但是你把所有的值都存储到了内存中,如果你有大量数据的话这个方式并不是你想要的。

3.4. 生成器

生成器是可以迭代的,但是你 只可以读取它一次 ,因为它并不把所有的值放在内存中,它是实时地生成数据:

>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator :
... print(i)
0
1
4
看起来除了把 [] 换成 () 外没什么不同。但是,你不可以再次使用 foriinmygenerator , 因为生成器只能被迭代一次:先计算出0,然后继续计算1,然后计算4,一个跟一个的… 3.5. yield关键字

yield 是一个类似 return 的关键字,只是这个函数返回的是个生成器。

>>> def createGenerator() :
... mylist = range(3)
... for i in mylist :
... yield i*i
...
>>> mygenerator = createGenerator() # create a generator
>>> print(mygenerator) # mygenerator is an object!
<generator object createGenerator at 0xb7555c34>
>>> for i

Viewing all articles
Browse latest Browse all 9596

Trending Articles