Преобразование лямбда-выражения в простую функцию - PullRequest
1 голос
/ 23 апреля 2019

Мне любопытно, можно ли избежать лямбда-выражений в следующем случае.

Например, используя лямбда-выражение, я могу просто определить функцию, которая возвращает лямбда-выражение.

def square_fun(a,b,c):
   return lambda x: a*x**2 + b*x + c

После того, как мы можем позвонить, используя:

f = square_fun(1,2,3)

f(1) # here x = 1

Как мне получить такое же поведение, избегая лямбда-выражения?

например, square_fun должен возвращать другую функцию

def square_fun(a,b,c):
   return f...

Ответы [ 2 ]

7 голосов
/ 23 апреля 2019

В python вы можете определить функцию внутри другой функции, поэтому следующий фрагмент должен дать вам то же поведение:

def square_fun(a, b, c):
    def result(x):
        return a*x**2 + b*x + c
    return result

f = square_fun(1, 2, 3)
print(f(1))
# Should print 6

Итак, я попытаюсь объяснить, что здесь происходит:

  1. В строке f = square_fun(1, 2, 3), f будет фактически отображено на внутреннюю функцию (aka. result)
  2. Обратите внимание, что return result не имеет () в конце, поэтому функция еще не вызывается
  3. Функция вызывается в print(f(1)), а переменная x принимает 1 в качестве значения
  4. Наконец, функция результата возвращает вычисленное значение, используя x и a, b и c (из square_fun(1, 2, 3))

Вы можете найти дополнительную информацию здесь => https://www.learnpython.org/en/Closures

4 голосов
/ 23 апреля 2019

Вы также можете использовать functools.partial :

from functools import partial


def square_fun(x, a, b, c):
    return a * x ** 2 + b * x + c


f = partial(square_fun, a=1, b=2, c=3)
print(f(1))
# should print 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...