Python Generator - 什么不使用它

mea*_*ade 9 python

只是看看Python生成器,真的给他们留下了深刻的印象,但有什么东西不能用它们吗?我在考虑过去的C编码,从文件中读取,或者用户操作是区域.例如,是否可以使用生成器来提示用户输入(基本数据输入?)和输入的调用函数进程?是否有任何表现或清理问题需要关注?

S.L*_*ott 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'))
Run Code Online (Sandbox Code Playgroud)

获取以下错误:

TypeError: can't pickle generator objects
Run Code Online (Sandbox Code Playgroud)


Rya*_*rom 12

发电机的一个问题是它们被"消耗"了.这意味着如果您需要再次迭代序列,则需要再次创建生成器.

如果延迟评估是一个问题,那么您可能不需要生成器表达式.例如,如果您想要预先执行所有计算(例如,以便您可以释放资源),那么列表理解或for循环可能是最好的.

如果使用psyco,列表表达式和循环的速度会显着提高,但对于生成器则不然.

另外很明显,如果您需要预先获得序列的长度,那么您不需要生成器.