发电机在lambda中的行为对未来的变化是安全的?

2024-03-28 12:28:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下功能:

|    def line_reader_iter(file_object):
|       while True:
|           a_line = file_object.readline()
|           if len(a_line)==0: raise StopIteration
|           yield a_line[:-1]

我在某处说:

^{pr2}$

显然,lambda之所以有效,是因为编译时与运行时行为之间似乎存在差异,这是非常受欢迎的:行_reader_iter()将对迭代器对象的引用放入lambda表达式中,而不是每次计算lambda时创建生成器对象。但是:这种行为是便携和稳定的吗?我只是一个Python新手,不知道我的代码相对于Python执行模型是否处于灰色地带。有人能告诉我吗?在

斯拉蒂


Tags: 对象lambda功能truereadlinelenifobject
1条回答
网友
1楼 · 发布于 2024-03-28 12:28:18

我想你实际上是误解了为什么这是有效的。每次调用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

您可以使用以下方法获得所需的行为:

^{pr2}$

下面是我的范围示例的工作方式:

>>> counter = iter(range(10)).next
>>> counter()
0
>>> counter()    # yay, we are actually using the same iterator
1

相关问题 更多 >