2015-11-15 3 views
0

Я знаю, как передать простую функцию как параметр другой функции, но как передать «вложенные» функции? Я пытаюсь сделать что-то вроде этого:Функция передачи функции как параметр

def do(func): 
    print (func(6)) 

def a(x): 
    return x*2 

def b(x): 
    return x*3 

do(a(b)) 
+0

'делать (лямбда-х: а (Ь (х)))' – Doorknob

+4

Вы ищете [функция композиции] (https://mathieularose.com/function -композиция-в-питон /). – poke

ответ

3

Использование функции композиции подход:

def compose(f, g): 
    return lambda x: f(g(x)) 

def do(func): 
    print (func(6)) 

def a(x): 
    return x*2 

def b(x): 
    return x*3 

combinedAB = compose(a,b) 
do(combinedAB) 
1

Ну основная проблема здесь заключается в том, что do(a(b)) будет проходить функцию b в a и в результате TypeError.

Основной проблемой здесь является то, что все, что вы передаете функционировать doдолжен быть вызываемым или иначе print(func(6)) выражение не будет по соответствующим причинам (отсутствие метода __call__), поэтому я не думаю, что путь этот структурирована, соответствует тому, что вы пытаетесь сделать.

В качестве решения можно либо делать то, что предложила @Doorknob (в основном проходит в вызываемом) или рассмотреть возможность возвращение функции b из функции a, которая затем будет использоваться в функции do.

Таким образом, если вы измените функцию a, как так:

def do(func): 
    print (func(6)) 

def a(x): 
    x = x * 2 
    def b(y): 
     return x * (y * 3) 
    return b 

do(a(2)) 

Вы получите хороший результат 72. Хотя я не уверен, что это строго то, что вы подразумеваете под «вложенными» функциями.

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