2016-10-19 5 views
0

я наткнулся на эту логику:Отправка функции в качестве аргумента другой функции

def f2(f): 
    def g(arg): 
     return 2 * f(arg) 
    return g 

def f1(arg): 
    return arg + 1 

f_2 = f2(f1) 
print f_2(3) 

С первого взгляда может показаться, что это очень простой код. Но для выяснения того, что здесь происходит, требуется некоторое время. Отправка функции в качестве аргумента другой функции для меня необычна. Хотя он работает, мне интересно, следует ли избегать такой техники (поскольку она сначала кажется довольно запутанной).

+1

Это в основном то, как работают декораторы. –

+0

Его довольно часто встречаются в языках, которые рассматривают функции как объекты первого класса - Javascript - это тот, который приходит на ум – xbonez

+0

это также известно как декоратор в python ... очень распространенная практика –

ответ

2

Передача функций другим функциям является распространенной идиомой в так называемых функциональных языках программирования, таких как LISP, Scheme, Haskell и т. Д. Python иногда называют «языком мультипарадигмы», поскольку он имеет некоторые особенности функциональные языки (а также императивные/структурированные и объектно-ориентированные языки).

Так что, хотя это считается передовой техникой, вряд ли редко встречается в Python. Python даже имеет ключевое слово языка (lambda), чтобы вы могли определять короткие анонимные функции «в строке» при вызове функции, поэтому вам не нужно указывать им имя и определять их в другом месте. Он также имеет встроенные функции, такие как map, filter и reduce, которые явно предназначены для работы с переданными функциями; они заимствованы из вышеупомянутых функциональных языков. И обычно используемая функция языка, декораторы, в основном является функцией, которая принимает функцию и возвращает функцию.

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