gpt4 book ai didi

python - 嵌套生成器表达式调用动态引用的函数

转载 作者:行者123 更新时间:2023-12-04 00:12:52 25 4
gpt4 key购买 nike

当在 Python 3 中动态嵌套生成器表达式时,当生成器表达式引用动态引用的函数时,我看到了一些非常奇怪的行为,我不知道如何解释。

这是一个非常简化的重现问题的案例:

double = lambda x: x * 2
triple = lambda x: x * 3
processors = [double, triple]

data = range(3)
for proc in processors:
data = (proc(i) for i in data)

result = list(data)
print(result)
assert result == [0, 6, 12]

在这种情况下,我希望每个数字都乘以 6 (triple(double(x))) 但实际上 triple(triple(x)) 是叫。我或多或少清楚,当生成器表达式运行时,proc 指向 triple,无论它在生成器表达式创建时指向什么。

那么,(1) 这是预期的吗?有人可以指出 Python 文档中的一些相关信息或其他解释这一点的地方吗?

和 (2) 您能否推荐另一种嵌套生成器表达式的方法,其中每个级别都调用一个动态提供的可调用对象?

编辑:我在 Python 3.8.x 上看到它,还没有用其他版本测试过

最佳答案

这是两件事的结果:

  • 生成器是惰性求值的,因此只有在使用生成器时才会调用函数,
  • 在评估时解析名称,而不是在创建生成器时解析。

所以在您使用 list(data) 使用生成器时,名称 proc 指的是函数 triple,并且两个生成器调用由名称proc绑定(bind)的函数,所以你得到triple两次。

map 起作用的原因是因为它是一个函数,所以当您将 proc 作为参数传递时,它会在以下位置接收 proc 的值map 被调用的时间,在循环中,而 proc 仍然可以引用 double 函数。

关于python - 嵌套生成器表达式调用动态引用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67212630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com