我想爲我正在從數據源讀取的數據設置一個「處理管道」,並將一系列操作符(使用生成器)應用於每個項目因爲它被讀取。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