gpt4 book ai didi

python-3.x - 如何创建部分依赖于外部参数的函数数组? (Python)

转载 作者:行者123 更新时间:2023-12-04 23:47:21 26 4
gpt4 key购买 nike

我有兴趣创建一个由许多小函数“g”组成的函数“G”列表/数组。这本质上应该对应于一系列随时间“进化”的功能。

每个“g”接收两个变量并返回这些变量与在同一时间步长索引的外部全局变量的乘积。

假设 obs_mat (T x 1) 是一个预定义的全局数组,t对应于时间步长

G = []

for t in range(T):
# tried declaring obs here too.
def g(current_state, observation_noise):
obs = obs_mat[t]
return current_state * observation_noise * obs

G.append(g)

不幸的是,当我测试结果函数时,它们似乎没有发现 obs 中的差异。时变常数,即(得到 G[0](100,100)G[5](100,100) 相同)。我试着玩弄 obs 的范围但没有太多的运气。任何人都可以帮助引导我朝着正确的方向前进吗?

最佳答案

这是在内部函数中从外部范围引用变量的常见“陷阱”。外部变量在内部函数运行时查找,而不是在定义内部函数时查找(因此所有版本的函数都会看到变量的最后一个值)。要让每个函数看到不同的值,您要么需要确保它们在不同的命名空间中查找,要么需要将值绑定(bind)到内部函数的默认参数。

这是一种使用额外命名空间的方法:

def make_func(x):
def func(a, b):
return a*b*x
return func

list_of_funcs = [make_func(i) for i in range(10)]

每个内部函数 func可以访问 x make_func 中的参数功能。因为它们都是由对 make_func 的单独调用创建的。 ,他们每个人都看到具有不同 x 的单独命名空间值(value)观。

这是使用默认参数的另一种方法(使用由 lambda 表达式创建的函数):
list_of_funcs = [lambda a, b, x=i: a*b*x for i in range(10)]

在这个版本中, i列表推导中的变量绑定(bind)到 x 的默认值lambda 表达式中的参数。这种绑定(bind)意味着函数不会关心 i 的值。以后改。这个解决方案的缺点是,任何不小心调用具有三个参数而不是两个参数的函数之一的代码都可能毫无异常(exception)地工作(可能会产生奇怪的结果)。

关于python-3.x - 如何创建部分依赖于外部参数的函数数组? (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29068966/

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