Подтвердить что ты не робот

Функции Python с несколькими скобками параметров

У меня возникли проблемы с пониманием того, что означает h(a)(b). Я никогда не видел одного из них до вчерашнего дня, и я не мог объявить функцию таким образом:

def f (a)(b):
    return a(b)

Когда я пытался сделать def f (a, b):, он тоже не работал. Что делают эти функции? Как я могу объявить их? И, наконец, какая разница между f(a, b) и f(a)(b)?

4b9b3361

Ответ 1

Функции с несколькими скобками параметров не существуют, как вы видели, когда пытались определить их. Существуют, однако, функции, которые возвращают (другие) функции:

def func(a):
    def func2(b):
        return a + b
    return func2

Теперь, когда вы вызываете func(), он возвращает внутреннюю функцию func2:

>>> func2 = func(1)  # You don't have to call it func2 here
>>> func2(2)
3

Но если позже вам не понадобится внутренняя функция, тогда нет необходимости сохранять ее в переменной, и вы можете просто называть ее один за другим:

>>> func(1)(2)   # func(1) returns func2 which is then called with (2)
3

Это очень распространенная идиома при определении декораторов, которые принимают аргументы.


Обратите внимание, что вызов func() всегда создает новую внутреннюю функцию, хотя все они называются func2 внутри определения нашего func:

>>> f1 = func(1)
>>> f2 = func(1)
>>> f1(1), f2(1)
(2, 2)
>>> f1 is f2
False

И, наконец, какая разница между f(a, b) и f(a)(b)?

Теперь должно быть ясно, что вы знаете, что делает f(a)(b), но суммировать:

  • f(a, b) вызывает f с двумя параметрами a и b
  • f(a)(b) вызывает f с одним параметром a, который затем возвращает другую функцию, которая затем вызывается с одним параметром b

Ответ 2

f(a)(b) просто означает, что выражение f(a) возвращает значение, которое само вызываемо. Это короткая форма

g = f(a)
g(b)

Вам может быть удобнее добавить пару резервных круглых скобок, чтобы подчеркнуть, что это не синтаксическая конструкция.

(f(a))(b)  # f(a) is evaluated first, then the result is applied to b

Это точно аналогично удвоению квадратных скобок для индексирования вложенных словарей.

d1[x][y]

эквивалентно

d2 = d1[x]
d2[y]

Ответ 3

Допустим, что у нас есть выражение типа

f(a)(b)

тогда f(a) возвращает сама функция, которая вызывается с аргументом b. Рассмотрим следующий пример

def f(a):
   def g(b):
      return a * b
   return g

Затем f(5)(4) оценивается как 5 * 4, так как f(5) возвращает функцию, которая в основном

def g(b):
   return 5 * b

Теперь можно сделать что-то вроде этого

mult_by_5 = f(5)
[mult_by_5(x) for x in range(10)]

Предположим, что насчет более вложенных функций?:

def f(a):
  def g(b):
    def h(c):
      return a * b *c
    return h
  return g
f(2)(3)(4) # 24