来源:机器学习算法与Python实战
本文约3000字,建议阅读5分钟
必要掌握的高端语法助你成为Python大牛。
这是stackoverflow上一个关于python中yield用法的帖子,这里翻译自投票最高的一个回答。
原文链接:
https://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do
问题
Python中yield关键字的用途是什么?它有什么作用?
例如,我试图理解以下代码:
def _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
这是调用者(caller):
result, candidates = [], [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时会发生什么?返回了一个列表(list)?还是返回了一个元素?然后被重复调用了吗?调用何时结束?
代码来自 Jochen Schulz (jrschulz), who made a great Python library for metric spaces.
回答
要想理解yield的作用,你必须了解什么是生成器(generators),在这之前,我们先来看可迭代对象(iterables)。
可迭代对象 (iterables)
当你创建了一个列表,你可以遍历这个列表读取它的每一个元素,逐个读取列表元素称为迭代(iteration)。
>>> mylist = [1, 2, 3]>>> for i in mylist:...