6.回到你的代码
(译者注:这是回答这对问题的具体解释)
生成器:
调用者:
这个代码包含了几个小部分:
- 我们对一个列表进行迭代,但是迭代中列表还在不断的扩展。它是一个迭代这些嵌套的数据的简洁方式,即使这样有点危险,因为可能导致无限迭代。candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))
穷尽了生成器的所有值,但 while 不断地在产生新的生成器,它们会产生和上一次不一样的值,既然没有作用到同一个节点上. - extend() 是一个迭代器方法,作用于迭代器,并把参数追加到迭代器的后面。
通常我们传递它一个列表参数:
但是在你的代码中的是一个生成器,这是不错的,因为:
- 你不必读两次所有的值
- 你可以有很多子对象,但不必叫他们都存储在内存里面。
并且这很奏效,因为Python不关心一个方法的参数是不是个列表。Python只希望它是个可以迭代的,所以这个参数可以是列表,元组,字符串,生成器… 这叫做 ducktyping,这也是为何Python如此棒的原因之一,但这已经是另外一个问题了…
你可以在这里停下,来看看生成器的一些高级用法:
7.控制生成器穷尽
|
|
对于控制一些资源的访问来说这很有用。
8.Itertools,你最好的朋友
itertools包含了很多特殊的迭代方法。是不是曾想过复制一个迭代器?串联两个迭代器?把嵌套的列表分组?不用创造一个新的列表的 zip/map?
只要 import itertools
需要个例子?让我们看看比赛中4匹马可能到达终点的先后顺序的可能情况:
9.了解迭代器的内部机制
迭代是一个实现可迭代对象(实现的是 iter() 方法)和迭代器(实现的是next() 方法)的过程。可迭代对象是你可以从其获取到一个迭代器的任一对象。迭代器是那些允许你迭代可迭代对象的对象。