Tag: yield

“yield”关键字有什么作用?

yieldPython中关键字的用法是什么?它有什么作用? 例如,我试图理解这个代码1: 这是调用者: 当这个方法_get_child_candidates被调用时会发生什么?是列表返回?一个单一的元素?是否再次被调用?随后的电话何时会停止? 答案: 要理解什么yield,你必须了解什么是 generators。并且在 generators 来之前迭代。 Iterables 当你创建一个列表,你可以逐个阅读它的项目。逐个读取它的项目称为迭代: mylist是一个迭代。当你使用列表理解,你创建一个列表,所以一个可迭代的:   你可以使用的所有东西都是可for... in...迭代的; lists,strings,file… 这些迭代器很方便,因为您可以随心所欲地读取它们,但是将所有值存储在内存中,而且当有很多值时,并不总是您想要的值。 Generators 生成器是迭代器,一种迭代器,只能迭代一次。发生器不会将所有的值存储在内存中,它们会立即生成值:   除了你用来()代替之外,它是一样的。但是,你不能执行for i in mygenerator,因为发电机可以只使用一次,第二次:他们计算0,则忘记它和计算1,并结束由一个计算4,一个。   Yield yield是一个使用的关键字return,除了函数将返回一个生成器。   这是一个无用的例子,但是当你知道你的函数将会返回一大堆你只需要读取一次的值的时候,它是很方便的。 要掌握yield,你必须明白当你调用函数时,你写在函数体中的代码不会运行。该函数只返回生成器对象,这有点棘手:-) 然后,您的代码将在每次for使用生成器时运行。 现在困难的部分: 第一次for调用由你的函数创建的generator对象时,它会从你的函数开始直到碰到它yield,然后返回第一个循环的值。然后,每个其他的调用将运行你已经写在函数中的循环一次,并返回下一个值,直到没有值返回。 一旦函数运行,发生器被认为是空的,但不再被yield触发。这可能是因为循环已经结束,或者因为你不再满足"if/else"了。   你的代码解释 Generator: 调用者:   循环在一个列表上进行迭代,但是在迭代循环时,列表​​将被扩展:-)这是一个简洁的方式来查看所有这些嵌套的数据,即使这样做有点危险,因为你可能会以无限循环结束。在这种情况下,candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))耗尽了生成器的所有值,但是while不断创建新的生成器对象,由于它不在同一个节点上应用,所以会产生与以前不同的值。 该extend()方法是一个列表对象的方法,期望一个迭代,并将其值添加到列表中。 通常我们通过一个列表: 但是在你的代码中它会得到一个生成器,这是很好的,因为: 您不需要两次读取值。 你可能有很多的子元素,你不希望他们都存储在内存中。   它的工作原理是因为Python不关心一个方法的参数是否是一个列表。Python期望iterables,所以它将与字符串,列表,元组和生成器一起工作!这就是所谓的鸭子打字,也是Python如此酷的原因之一。但是,这是另一个故事,另一个问题… 你可以在这里停下来,或者稍微阅读一下看看生成器的高级用法: 控制 generator 耗尽 注意:对于Python3使用print(corner_street_atm.__next__())或print(next(corner_street_atm)) 它可以用于控制对资源的访问等各种功能。 Itertools,你最好的朋友