неопределенная переменная в лямбда-выражении

#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() в соответствии с вашим именем.