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

#python

#python

Вопрос:

Я столкнулся с этой логикой:

 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. В основном так работают декораторы.

2. Это довольно распространено в языках, которые рассматривают функции как объекты первого класса — на ум приходит Javascript

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

4. В чем именно здесь вопрос?

Ответ №1:

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

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