python - lambda 中生成器的行为对 future 的变化安全吗?

标签 python lambda generator yield readline

我有以下功能:

|    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/

相关文章:

python - 在python中遍历对象

java - Lambda 中的变量捕获

Python 随机样本生成器(适用于庞大的人口规模)

python - 如何向生成器重新抛出异常

python - 使用 NDK 在 Android 上从 C++ 运行 Python

python - django select_related() 和 django-mptt。如何一次获取所有 sibling ?

python - pip 安装与 conda 安装

python - 从map()返回不同的变量

c# - c# 与 vb.net 中的 lambda 表达式

python - 向 xrange() 添加任意元素?