如何在Python中将函数作为函数参数传递

11

这是我目前所拥有的,它可以很好地运行:

def iterate(seed, num):
    x = seed
    orbit = [x]
    for i in range(num):
        x = 2 * x * (1 - x)
        orbit.append(x)
    return orbit

现在,如果我想将第5行的迭代方程更改为x = x ** 2 - 3,我将不得不创建一个除第5行外所有代码都相同的新函数。如何创建一个更通用的函数,可以将函数作为参数?

2个回答

28

在Python中,函数是一等公民。你可以将一个函数作为参数传递:

def iterate(seed, num, fct):
#                      ^^^
    x = seed
    orbit = [x]
    for i in range(num):
        x = fct(x)
        #   ^^^
        orbit.append(x)
    return orbit

在您的代码中,您需要将所需的函数作为第三个参数传递:
def f(x):
    return 2*x*(1-x)

iterate(seed, num, f)
#                  ^

或者

def g(x):
    return 3*x*(2-x)

iterate(seed, num, g)
#                  ^

或者...


如果您不想每次命名一个新函数,您可以选择传递一个匿名函数(即:lambda):

iterate(seed, num, lambda x: 3*x*(4-x))

1
在迭代函数的语法中,有没有一种方法可以指示另一个函数(第三个参数)的语法(即f(x:int))应该是什么样子的? - Matthias

5

只需将函数作为参数传递即可。例如:

def iterate(seed, num, func=lambda x: 2*x*(1-x)):
    x = seed
    orbit = [x]
    for i in range(num):
        x = func(x)
        orbit.append(x)
    return orbit

你可以选择按照现有方式使用它,或者传递一个接受单个参数的函数,例如:

iterate(3, 12, lambda x: x**2-3)

您可以以同样的方式传递现有的非 Lambda 函数:
def newFunc(x):
    return x**2 - 3

iterate(3, 12, newFunc)

谢谢。Sylvain和你提供了基本相同的解决方案——因为我只能“接受”一个,所以我选择了Sylvain的,因为它更加全面。 - ba_ul
谢谢,@RussellBorogove 我没有考虑就从问题中复制了方程式。 - Holloway

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接