Ниже приводится рассматриваемая строка кода:
a = lambda _:True
Это создает функцию , имеющую один параметр ввода: _
. Подчеркивание - довольно странный выбор имени переменной, но это всего лишь имя переменной. Вы можете использовать _
где угодно, даже если не используете лямбда-функции. Например, вместо ....
my_var = 5
print(my_var)
Вы могли написать:
_ = 5
print(_)
Однако была причина, по _
которой в качестве имени параметра использовалось имя, а не что-то вроде x
или input
. Мы вернемся к этому через минуту.
Во-первых, нам нужно знать, что лямбда-ключевое слово создает функцию, аналогичную def
, но с другим синтаксисом. Определение лямбда-функции a = lambda _:True
похоже на запись:
def a(_):
return True
Он создает функцию a
с входным параметром _
и возвращает ее True
. Можно было бы так же легко написать a = lambda x:True
, используя x
вместо подчеркивания. Однако соглашение заключается в использовании _
в качестве имени переменной, когда мы не собираемся использовать эту переменную. Учтите следующее:
for _ in range(1, 11):
print('pear')
Обратите внимание, что индекс цикла никогда не используется внутри тела цикла. Мы просто хотим, чтобы цикл выполнялся определенное количество раз. Как winklerrr
уже было написано, «имя переменной _
[...] похоже на« выбрасываемую переменную », просто заполнитель, который бесполезен».
Аналогично, с a = lambda x: True
входной параметр не используется внутри тела функции. На самом деле не имеет значения, что является входным аргументом, если он есть. Автор этой лямбда-функции написал _
вместо чего-то вродеx
, чтобы указать, что переменная не будет использоваться.
Обратите внимание , что лямбда действительно имеет аргумент; Итак, написание
a()
, вызовет ошибку.
Если вам нужна лямбда без аргументов, напишите что-нибудь вроде этого:
bar = lambda: True
Теперь вызов bar()
без аргументов будет работать нормально. Лямбда, не принимающая аргументов, не всегда должна возвращать одно и то же значение:
import random
process_fruit = lambda : random.random()
Приведенная выше лямбда-функция более сложна, чем просто нечто, всегда возвращающее одну и ту же константу.
Одна из причин, по которой программисты иногда используют lambda
ключевое слово вместо, def
- это особенно короткие и простые функции. Обратите внимание, что lambda
определение обычно может поместиться все в одной строке, тогда как с помощью оператора def сделать то же самое сложно. Еще одна причина использовать lambda
вместоdef
sf, когда функция больше не будет использоваться. Если мы не хотим снова вызывать функцию позже, то нет необходимости давать функции имя. Например, рассмотрим следующий код:
def apply_to_each (transform, in_container): out_container = list () для idx, элемент в enumerate (container, 0): out_container [idx] = transform (item) return out_container
Теперь мы делаем следующий вызов:
squares = apply_to_each(lambda x: x**2 range(0, 101))
Обратите внимание, что lambda x: x**2
метка не указана. Это потому, что мы, вероятно, больше не будем называть его позже, это было просто что-то короткое и простое, что нам нужно было временно.
Тот факт, что лямбда-функциям не нужно давать имя, является источником другого имени для их описания: «анонимные функции».
Также обратите внимание, что лямбда-операторы похожи на вызов функции, поскольку они возвращают ссылку на функцию, которую они создают. Следующее является незаконным:
apply_to_each(def foo(x): x**2 , range(0, 101))
Тогда как apply_to_each(lambda x: x**2 range(0, 101))
это нормально.
Итак, мы используем lambda
вместо def
и _
вместо длинного имени переменной, когда мы хотим что-то короткое, сладкое и, вероятно, не захотим снова использовать его позже.
lambda : True