2015-03-01 3 views
2

Это то, что я в настоящее время, и она отлично работает:Как передать функцию в качестве параметра функции в 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, скажем, х = х ** 2 - 3, мне нужно будет создать новую функцию со всем тем же кодом, кроме строки 5. Как создать более общую функцию, которая может иметь функцию в качестве параметра?

[Изменено название, отредактированы язык для ясности и изменил x^2 к x**2 в последнем абзаце.]

ответ

7

Функции first-class citizens в 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) 
#    ^

Или .. .


Если вы не хотите, чтобы t о имя новой функции каждый раз, вы будете иметь возможность передать анонимную функцию (т.е .: лямбда) вместо:

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

Есть ли способ указать в синтаксисе итерационной функции, как должен выглядеть синтаксис (который является f (x: int)) другой функции (третий параметр)? – Matthias

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) 

Вы также можете передать существующие (не лямбда функции) таким же образом:

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

iterate(3, 12, newFunc) 
+0

Спасибо. Сильвен и вы дали по сути одно и то же решение - так как я мог «принять» только один, я отправился в Сильвен, чтобы быть немного более всеобъемлющим. –

+0

Cheers, @ RussellBogogove Я скопировал уравнение из вопроса, не задумываясь. – Holloway

Смежные вопросы