lambda中发电机的行为是否能够抵御未来的变化?

sla*_*ast 3 python lambda yield generator 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]
Run Code Online (Sandbox Code Playgroud)

我说的某个地方:

|    line_reader = lambda: next(line_reader_iter(infile))
Run Code Online (Sandbox Code Playgroud)

显然,lambda只能运行,因为编译时与运行时行为似乎存在差异,这是非常受欢迎的:line_reader_iter()将对iterator对象的引用放入lambda表达式而不是创建生成器每次评估lambda时都对象.但是:这种便携且稳定的行为?我只是一个Python新手,我不知道我的代码是否在Python执行模型的灰色区域.有人可以赐福我吗?

slarti

And*_*ark 7

我认为你实际上误解了为什么会这样.每次调用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
Run Code Online (Sandbox Code Playgroud)

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

line_reader = line_reader_iter(infile).next
Run Code Online (Sandbox Code Playgroud)

以下是我的范围示例的工作原理:

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

  • 事实上,`line_reader_iter()`是多余的,因为文件在迭代时已经产生了行. (7认同)