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

时间:2015-03-01 16:28:49

标签: python function math

这就是我目前所拥有的,它运作良好:

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行以外的所有相同代码的新函数。如何创建一个更通用的函数,可以将函数作为参数吗?

[为了清晰起见更改了标题,编辑了语言,并在最后一段中将x^2更改为x**2。]

2 个答案:

答案 0 :(得分:14)

Python中的函数是first-class citizens。您可以将函数作为参数传递:

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 :(得分:2)

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

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)