Python循环中的Python Generator"链"

gtb*_*ack 8 python generator

我正在尝试为我正在从数据源读取的数据设置"处理管道",并在读取每个项目时应用一系列操作符(使用生成器).

一些演示相同问题的示例代码.

def reader():
    yield 1
    yield 2
    yield 3

def add_1(val):
    return val + 1

def add_5(val):
    return val + 5

def add_10(val):
    return val + 10

operators = [add_1, add_5, add_10]

def main():
    vals = reader()

    for op in operators:
        vals = (op(val) for val in vals)

    return vals

print(list(main()))
Run Code Online (Sandbox Code Playgroud)

期望:[17, 18, 19]
实际:[31, 32, 33]

Python似乎没有op通过for循环保存每次的值,所以它每次都应用第三个函数.有没有办法每次通过for循环将实际的操作符函数"绑定"到生成器表达式?

我可以通过将for循环中的生成器表达式更改为列表解析来解决这个问题,但由于实际数据要大得多,我不希望将它全部存储在内存中的任何一点.

Dun*_*nes 2

您可以通过在新函数中创建生成器来强制绑定变量。例如。

def map_operator(operator, iterable):
    # closure value of operator is now separate for each generator created
    return (operator(item) for item in iterable)

def main():
    vals = reader()
    for op in operators:
        vals = map_operator(op, vals)   
    return vals
Run Code Online (Sandbox Code Playgroud)

然而,与内置函数(在 python 3.x 中)map_operator几乎相同。map所以就用它来代替吧。