неопределенная переменная в лямбда-выражении - PullRequest
0 голосов
/ 10 апреля 2019

У меня проблемы с пониманием следующей функции.

def make_adder(n):
    return lambda x: x + n

plus_2 = make_adder(2)

plus_2(5)
>>> 7

Что представляет собой функция x в этой функции и как это не приводит к ошибке, поскольку x не определено?

Ответы [ 4 ]

1 голос
/ 10 апреля 2019

Символ x представляет параметр, который получает лямбда-выражение, поэтому он стоит перед ":".

Когда вы выполняете вызов plus_2 = make_adder(2), лямбда-выражение заменяет n параметромфункция (2), так что теперь plus_2 равно lambda x: x + 2.Когда вы вызываете plus_2(5), вычисляется лямбда-выражение, подставляя x с параметром функции (5), так что в результате получается 5 + 2 = 7;

1 голос
/ 10 апреля 2019

Вы определяете функцию, которая при n возвращает функцию , которая принимает аргумент x и возвращает x + n.Это называется функцией высшего порядка.Это не приводит к ошибке, потому что вы явно возвращаете другую функцию, которая ожидает аргумент.

0 голосов
/ 10 апреля 2019

В строке ниже:

plus_2 = make_adder(2)

мы связываем целочисленный объект 2 с n.

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

plus_2(5)

целочисленный объект 5 будет привязан к x при выполнении выражения lambda.

Это поток выполнения во время выполнения.Поскольку во всем этом процессе нет двусмысленности или ошибок, программа работает нормально и выдает 7.

Теперь, чтобы ответить на ваш вопрос: переменная x представляет любое значение, переданное plus_2()согласно вашему названию.

0 голосов
/ 10 апреля 2019

Лямбда-функции потрясающие. Они позволяют определять встроенные функции высшего порядка. Общий формат 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...