如何在 Python 中将函数作为函数参数传递
How to pass a function as a function parameter in Python
这是我目前拥有的并且运行良好:
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 行之外的所有相同代码创建一个新函数。如何我创建一个更通用的函数,可以将函数作为参数?
只需将函数作为参数传递即可。例如:
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)
函数在 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))
这是我目前拥有的并且运行良好:
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 行之外的所有相同代码创建一个新函数。如何我创建一个更通用的函数,可以将函数作为参数?
只需将函数作为参数传递即可。例如:
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)
函数在 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))