for 循环中的 Python 生成器 "chain"

标签 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()))

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

Python 似乎并不是每次通过 for 循环都保存 op 的值,所以它每次都应用第三个函数。 有没有办法每次通过 for 循环将实际的运算符函数“绑定(bind)”到生成器表达式?

我可以通过将 for 循环中的生成器表达式更改为列表理解来轻松解决这个问题,但由于实际数据要大得多,我不想在任何时候将其全部存储在内存中。

最佳答案

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

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

但是,map_operatormap 几乎相同内置(在 python 3.x 中)。因此,只需使用它即可。

关于for 循环中的 Python 生成器 "chain",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34995042/

相关文章:

python - 忽略函数的返回以节省 Python 中的内存

python - Itertools循环方法——为什么是 "while"循环?

Javascript 插件/片段组合器

python - 为什么 Python 2.7 不允许我在 yield 之后隐式地重新引发异常?

python - cx_Freeze exe 文件被检测为恶意软件

Python 线程意外变慢

python - 值错误 : in user code while using keras model in R

generator - 如何在mern.io中生成新模块?

php - 拆分 PHP 生成器

Python 3 和 Pandas - 在 DataFrame 中创建新行但为空 DataFrame