Что делает следующий код?
a = lambda _:True
Судя по тому, что я прочитал и протестировал в интерактивной подсказке, похоже, что это функция, которая всегда возвращается True
.
Я правильно это понимаю? Я надеюсь понять, почему также использовалось подчеркивание ( _
).
lambda : True
_
, вместоx
илиa
или любой другой . Если кто-то хочет знать, как написать лямбда-функцию, не принимающую аргументов; вот как: Определить это следующим образом :my_lambda = lambda : 255
. Назовите это так:x = my_lambda()
вы можете заменить255
на любое возвращаемое значение.Ответы:
Имя
_
переменной. Попытайся. (Это имя переменной обычно является именем игнорируемой переменной. Так сказать, заполнитель.)Python:
>>> l = lambda _: True >>> l() <lambda>() missing 1 required positional argument: '_' >>> l("foo") True
Итак, эта лямбда требует одного аргумента . Если вам нужна лямбда без аргументов, которая всегда возвращается
True
, сделайте следующее:>>> m = lambda: True >>> m() True
источник
Python 3.6.2
под,Mac OS 10.12
и он работает._
обычно используется, когда сама переменная действительно не нужна. Это что-то вроде «выбрасываемой переменной», просто бесполезного заполнителя.Подчеркивание - это соглашение Python об именах неиспользуемой переменной (например, инструменты статического анализа не сообщают о ней как о неиспользуемой переменной). В вашем случае лямбда-аргумент не используется, но созданный объект является функцией с одним аргументом, которая всегда возвращает
True
. Таким образом, ваша лямбда в некоторой степени аналогична постоянной функции в математике.источник
Да, это функция (или лямбда), которая возвращает True. Подчеркивание , который обычно представляет собой заполнитель для игнорируемого переменной, не является необходимым в данном случае.
Пример использования такой функции (которая почти ничего не делает):
dd = collections.defaultdict(lambda: True)
При использовании в качестве аргумента defaultdict вы можете использовать
True
в качестве общего значения по умолчанию.источник
Лямбда означает функцию. Приведенное выше утверждение аналогично написанию
def f(_): return True
Для лямбда должна присутствовать переменная. Таким образом, вы передаете ему переменную с именем
_
(аналогично вы можете передатьx
,y
..)источник
Подчеркивание
_
- это допустимый идентификатор, который здесь используется как имя переменной. Он всегда будет возвращатьсяTrue
для аргумента, переданного функции.>>>a('123') True
источник
Ниже приводится рассматриваемая строка кода:
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
и_
вместо длинного имени переменной, когда мы хотим что-то короткое, сладкое и, вероятно, не захотим снова использовать его позже.источник