How to pass a function as a function parameter in Python

22,126

Solution 1

Functions are first-class citizens in Python. you can pass a function as a parameter:

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

In your code, you will pass the function you need as the third argument:

def f(x):
    return 2*x*(1-x)

iterate(seed, num, f)
#                  ^

Or

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

iterate(seed, num, g)
#                  ^

Or ...


If you don't want to name a new function each time, you will have the option to pass an anonymous function (i.e.: lambda) instead:

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

Solution 2

Just pass the function as a parameter. For instance:

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

You can then either use it as you currently do or pass a function (that takes a single argument) eg:

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

You can also pass existing (non lambda functions) in the same way:

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

iterate(3, 12, newFunc)
Share:
22,126
ba_ul
Author by

ba_ul

Updated on November 19, 2020

Comments

  • ba_ul
    ba_ul over 3 years

    This is what I currently have and it works fine:

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

    Now if I want to change the iterating equation on line 5 to, say, x = x ** 2 - 3, I'll have to create a new function with all the same code except line 5. How do I create a more general function that can have a function as a parameter?