#python #python-3.x #function #lambda
#python #python-3.x #функция #лямбда
Вопрос:
У меня возникли проблемы с пониманием следующей функции.
def make_adder(n):
return lambda x: x n
plus_2 = make_adder(2)
plus_2(5)
>>> 7
Что представляет x в этой функции и как это не приводит к ошибке, потому что x не определено?
Комментарии:
1. это параметр функции. то же самое, как если бы вы сделали
def foo(x): <do something with x>
Ответ №1:
X представляет параметр, который получает лямбда-выражение, вот почему он стоит перед «:».
Когда вы выполняете plus_2 = make_adder(2)
вызов, лямбда-выражение заменяет n параметром функции (2), так что теперь plus_2
равно lambda x: x 2
. При вызове plus_2(5)
вычисляется лямбда-выражение, заменяющее x параметром функции (5), так что результат равен 5 2 = 7;
Ответ №2:
Вы определяете функцию, которая, учитывая n
, возвращает функцию, которая принимает аргумент x и возвращает x n
. Это называется функцией более высокого порядка. Это не приводит к ошибке, потому что вы явно возвращаете другую функцию, которая ожидает аргумент.
Комментарии:
1. таким образом, функция make_adder возвращает не добавление N, а функцию, которая затем принимает X и вызывает, которая возвращает x n . Это правильно?
2. Это совершенно верно. Это способ сделать ваши функции более общими — теперь вы можете создать
add_one
,add_two
,add_seventeen
просто изменив параметр.
Ответ №3:
Лямбда-функции потрясающие. Они позволяют вам определять встроенные функции более высокого порядка. Общий формат lambda args: expression
. В этом случае x
аргумент передается в лямбда-функцию. Поскольку make_adder
возвращает лямбда-функцию, все, что вы передаете, make_adder
устанавливается как n
. Итак, когда вы передаете, make_adder(2)
вы получаете лямбда-функцию, которая добавляет 2 к аргументу ( x
) .
Декомпозиция исходного фрагмента:
def make_adder(n):
return lambda x: x n
plus_2 = make_adder(2) # returns lambda x: x 2
plus_2(5) # executes lambda expression, x 2 with x=5
Начинаем с нуля:
5 2 # 7
plus_two_fn = lambda x: x 2 # Add 2 when you call plus_two_fn(x)
plus_two_fn(3) # returns 5 (3 2)
def plus_num_fn(num):
return lambda x: x n # Allow you to define plus "any" number
plus_one_fn = plus_num_fn(1) # lambda x: x 1
plus_one_fn(2) # returns 3 (2 1)
Ответ №4:
В строке ниже:
plus_2 = make_adder(2)
мы привязываем объект integer 2
к n
.
После этого when plus_2
вызывается с использованием аргумента:
plus_2(5)
целочисленный объект 5
будет привязан к x
при выполнении lambda
выражения.
Это поток выполнения во время выполнения. Поскольку во всем этом процессе нет двусмысленности или ошибок, программа работает нормально и выводит 7
результаты .
Теперь, чтобы ответить на ваш вопрос: переменная x
представляет любое значение, переданное plus_2()
в соответствии с вашим именем.