我想为我正在从数据源读取的数据设置一个“处理管道”,并将一系列操作符(使用生成器)应用于每个项目因为它被读取。for循环中的Python生成器“链”
一些演示相同问题的示例代码。
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()))
期望:[17, 18, 19]
实际:[31, 32, 33]
的Python似乎无法通过对每次循环节约op
价值,所以不是每次都适用的第三个功能。 有没有一种方法可以在每次通过for循环时将实际的运算符函数“绑定”到生成器表达式?
我可以通过将for循环中的生成器表达式更改为列表理解来解决这个问题,但由于实际数据要大得多,所以我不想将它全部存储在内存中的任何一点。
谢谢大家! 'map'解决方案对我来说效果最好,因为我还想在for循环中做其他事情(涉及日志记录,附加检查等)。在我真正的程序中,每个'operator'实际上是一个带有__call__'的类,并且还有一些我需要处理的其他函数和属性。 'reduce'解决方案也可以很好地工作,但是如果不将函数中的每个操作符都包装在一起执行这些额外的操作,就会失去这种能力。 – gtback