gpt4 book ai didi

Python 函数相当于 * 来扩展参数?

转载 作者:行者123 更新时间:2023-12-01 05:05:29 24 4
gpt4 key购买 nike

Python 中是否有相当于 * 符号的函数,用于扩展函数参数?这就是整个问题,但如果您想解释我为什么需要它,请继续阅读。

在我们的代码中,我们在某些地方使用元组来定义嵌套函数/条件,以在运行时评估 f(a, b, g(c, h(d))) 等内容。语法类似于(fp = 函数指针,c = 常量):

nestedFunction = (fp1, c1, (fp2, c2, c3), (fp3,))

在运行时,在某些条件下,将被评估为:

fp1(c1, fp2(c2, c3), fp3())

基本上每个元组中的第一个参数必须是一个函数,元组中的其余参数可以是常量或表示其他函数的元组。这些功能是从内到外评估的。

无论如何,您可以看到如何需要以函数的形式进行参数扩展。事实证明你不能定义类似的东西:

def expand(myTuple):
return *myTuple

我可以通过仔细定义我的函数来解决这个问题,但是参数扩展最好不必解决这个问题。仅供引用,改变这种设计不是一个选择。

最佳答案

您需要编写自己的递归函数,将参数应用于嵌套元组中的函数:

def recursive_apply(*args):
for e in args:
yield e[0](*recursive_apply(*e[1:])) if isinstance(e, tuple) else e

然后在函数调用中使用它:

next(recursive_apply(nestedFunction))

next() 是必需的,因为 recursive_apply() 是一个生成器;您可以将 next(recursive_apply(...)) 表达式包装在辅助函数中以方便使用;这里我将递归函数捆绑在本地命名空间中:

def apply(nested_structure):
def recursive_apply(*args):
for e in args:
yield e[0](*recursive_apply(*e[1:])) if isinstance(e, tuple) else e
return next(recursive_apply(nested_structure))

演示:

>>> def fp(num):
... def f(*args):
... res = sum(args)
... print 'fp{}{} -> {}'.format(num, args, res)
... return res
... f.__name__ = 'fp{}'.format(num)
... return f
...
>>> for i in range(3):
... f = fp(i + 1)
... globals()[f.__name__] = f
...
>>> c1, c2, c3 = range(1, 4)
>>> nestedFunction = (fp1, c1, (fp2, c2, c3), (fp3,))
>>> apply(nestedFunction)
fp2(2, 3) -> 5
fp3() -> 0
fp1(1, 5, 0) -> 6
6

关于Python 函数相当于 * 来扩展参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25142819/

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