【问题标题】:How to pass a function as a function parameter in Python如何在 Python 中将函数作为函数参数传递
【发布时间】:2015-03-01 16:28:49
【问题描述】:

这是我目前拥有的,并且工作正常:

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

【问题讨论】:

    标签: python function math


    【解决方案1】:

    函数在 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))
    

    【讨论】:

    • 有没有办法在迭代函数的语法中指出另一个函数(第三个参数)的语法(即 f(x: int))必须是什么样子?
    【解决方案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)
    

    【讨论】:

    • 谢谢。 Sylvain 和你给出了基本相同的解决方案 - 因为我只能“接受”一个,所以我去了 Sylvain 的更全面一点。
    • 干杯,@RussellBorogove 我不假思索地从问题中复制了方程式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2012-04-28
    • 2016-02-21
    • 2014-06-29
    相关资源
    最近更新 更多