只是看看Python生成器,真的给他们留下了深刻的印象,但有什么东西不能用它们吗?我在考虑过去的C编码,从文件中读取,或者用户操作是区域。例如,是否可以使用生成器来提示用户输入(基本数据输入?)和输入的调用函数进程?是否有任何表现或清理问题需要关注?
答案 0 :(得分:13)
发电机不能很好地存在。
通常,在尝试保留生成器对象时会出错。
>>> def generatorForEvenKeys( aDictionary ):
for k in aDictionary:
if k % 2 == 0: yield aDictionary[k]
>>> x = generatorForEvenKeys( someDictionary )
>>> pickle.dump(x,file('temp.dat','wb'))
获取以下错误:
TypeError: can't pickle generator objects
答案 1 :(得分:12)
发电机的一个问题是它们被“消耗”了。这意味着如果您需要再次迭代序列,则需要再次创建生成器。
如果延迟评估是一个问题,那么您可能不需要生成器表达式。例如,如果您想预先执行所有计算(例如,以便您可以释放资源),那么列表推导或for循环可能是最佳的。
如果使用psyco,列表表达式和循环的速度会大幅提高,但对于生成器则不会。
另外很明显,如果您需要预先获得序列的长度,那么您不需要生成器。
答案 2 :(得分:1)
当你想要一些可迭代的东西时,你可以使用一个生成器,而不需要将整个列表保存在内存中(这就是为什么xrange
支持比Python 2.x及更低版本中的range
更长的序列的原因
当你需要将整个“东西列表”加载到内存中时,使用生成器没什么意义 - 你也可以只返回一个列表。
对于一个(略显人为的)例子:
def my_pointless_generator(x):
thedata = range(x) # or thedata = list(range(x)) in Python 3.x
for x in thedata:
yield x
..可以像...一样有效地重写。
def my_pointless_generator(x):
return range(x)