Подтвердить что ты не робот

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

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

a = lambda _:True

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

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

4b9b3361

Ответ 1

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

Python:

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

>>> l("foo")
True

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

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

Ответ 2

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

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

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

dd = collections.defaultdict(lambda: True)

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

Ответ 3

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

Ответ 4

Lambda означает функцию. Вышеприведенный оператор аналогичен написанию

def f(_):
    return True

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

Ответ 5

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

>>>a('123') 
True

Ответ 6

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

a = lambda _:True

Создает функцию с одним входным параметром: _. Подчеркивание - довольно странный выбор имени переменной, но это просто имя переменной. Вы можете использовать _ где угодно, даже если не используете лямбда-функции. Например, вместо....

my_var = 5
print(my_var)

Вы можете написать:

_ = 5
print(_)

Однако была причина, по которой _ использовалось в качестве имени имени параметра вместо чего-то вроде x или input. Мы вернемся к этому через минуту.

Во-первых, нам нужно знать, что ключевое слово lambda создает функцию, аналогичную 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, элемент в перечислении (контейнер, 0):      out_container [idx] = transform (item)   вернуть 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 и _ вместо длинного имени переменной, когда мы хотим что-то короткое, приятное и, вероятно, не захотим использовать его позже.