我有以下功能:
| def line_reader_iter(file_object):
| while True:
| a_line = file_object.readline()
| if len(a_line)==0: raise StopIteration
| yield a_line[:-1]
在某处我说:
| line_reader = lambda: next(line_reader_iter(infile))
显然,lambda 之所以起作用,是因为编译时与运行时行为似乎存在差异,这是非常受欢迎的:line_reader_iter() 将迭代器对象的引用放入 lambda 表达式而不是创建每次评估 lambda 时生成器对象。但是:这是可移植且稳定的行为吗?我只是一个 Python 新手,我不知道我的代码是否处于 Python 执行模型方面的灰色区域。有人可以启发我吗?
拉尔提
最佳答案
我认为您实际上误解了这样做的原因。每次调用 line_reader()
时,都会 创建一个新的 line_reader_iter
生成器。它似乎有效,因为您每次都使用相同的 infile
,并且每次调用 readline()
都会返回文件的下一行。
考虑以下更简单的示例:
>>> counter = lambda: next(iter(range(10)))
>>> counter()
0
>>> counter() # each time the lambda is called, a new range iter is created
0
您可以使用以下方法获得所需的行为:
line_reader = line_reader_iter(infile).next
以下是我的范围示例的工作方式:
>>> counter = iter(range(10)).next
>>> counter()
0
>>> counter() # yay, we are actually using the same iterator
1
关于python - lambda 中生成器的行为对 future 的变化安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7572626/