Лямбда Python с подчеркиванием для аргумента?


85

Что делает следующий код?

a = lambda _:True

Судя по тому, что я прочитал и протестировал в интерактивной подсказке, похоже, что это функция, которая всегда возвращается True.

Я правильно это понимаю? Я надеюсь понять, почему также использовалось подчеркивание ( _).


10
Для тех, кто это лямбда без параметров, синтаксис такойlambda : True
Робино

17
Что - то мне не нравится данное сообщение является то , что вопрос название говорит о функции лямбды «с NO переменных» , но теле вопроса, и почти все из ответов, дают примеры лямбды - функции , имеющей один переменный / аргумент. Эта переменная просто случается иметь странное название _, вместо xили aили любой другой . Если кто-то хочет знать, как написать лямбда-функцию, не принимающую аргументов; вот как: Определить это следующим образом : my_lambda = lambda : 255. Назовите это так: x = my_lambda()вы можете заменить 255на любое возвращаемое значение.
Toothpick Anemone

2
@ToothpickAnemone отличный ответ! В наши дни я в основном использую лямбда без переменных для инициализации defaultdicts. надеюсь, что это будет полезно для людей, читающих эту ветку. ht = {} ht = defaultdict (lambda: 0, ht)
laycat

Ответы:


147

Имя _переменной. Попытайся. (Это имя переменной обычно является именем игнорируемой переменной. Так сказать, заполнитель.)

Python:

>>> l = lambda _: True
>>> l()
<lambda>() missing 1 required positional argument: '_'

>>> l("foo")
True

Итак, эта лямбда требует одного аргумента . Если вам нужна лямбда без аргументов, которая всегда возвращается True, сделайте следующее:

>>> m = lambda: True
>>> m()
True

7
@dopatraman протестировал его с помощью Python 3.6.2под, Mac OS 10.12и он работает.
winklerrr

6
Возможно, вы могли бы добавить информацию о том, что имя переменной _обычно используется, когда сама переменная действительно не нужна. Это что-то вроде «выбрасываемой переменной», просто бесполезного заполнителя.
winklerrr

1
@dopatraman В Ipython _ содержит значение, возвращаемое последним выражением. По этой причине я избегаю использования _. stackoverflow.com/questions/17580289/…
Таро Киритани

7

Подчеркивание - это соглашение Python об именах неиспользуемой переменной (например, инструменты статического анализа не сообщают о ней как о неиспользуемой переменной). В вашем случае лямбда-аргумент не используется, но созданный объект является функцией с одним аргументом, которая всегда возвращает True. Таким образом, ваша лямбда в некоторой степени аналогична постоянной функции в математике.


не только преобразование python, это не зависит от языка, и подчеркивание используется для обозначения того, что переменная является временной или незначительной
Славомир Ленарт

6

похоже, это функция, которая независимо возвращает True.

Да, это функция (или лямбда), которая возвращает True. Подчеркивание , который обычно представляет собой заполнитель для игнорируемого переменной, не является необходимым в данном случае.

Пример использования такой функции (которая почти ничего не делает):

dd = collections.defaultdict(lambda: True)

При использовании в качестве аргумента defaultdict вы можете использовать Trueв качестве общего значения по умолчанию.


4

Лямбда означает функцию. Приведенное выше утверждение аналогично написанию

def f(_):
    return True

Для лямбда должна присутствовать переменная. Таким образом, вы передаете ему переменную с именем _(аналогично вы можете передать x, y..)


3

Подчеркивание _- это допустимый идентификатор, который здесь используется как имя переменной. Он всегда будет возвращаться Trueдля аргумента, переданного функции.

>>>a('123') 
True

Здравствуйте, спасибо за быстрый ответ. так это анонимная функция, которая всегда возвращает истину?
laycat

@laycat; Да. Он всегда будет возвращать истину.
haccks

2

Ниже приводится рассматриваемая строка кода:

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и _вместо длинного имени переменной, когда мы хотим что-то короткое, сладкое и, вероятно, не захотим снова использовать его позже.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.