Ниже приводится рассматриваемая строка кода:
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