Лямбда Пітона з підкресленням для аргументу?


84

Що робить наступний код?

a = lambda _:True

З того, що я прочитав і протестував в інтерактивному підказці, здається, це функція, яка повертається завжди True.

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


10
Для тих, хто такий lambda : True
безпараметричний

17
Що - то мені не подобається це повідомлення є те , що питання назва говорить про функції лямбда «з NO змінних» , але тілі питання, і багато хто з відповідей, дають приклади лямбда - функції , що має один змінний / аргумент. Ця змінна просто трапляється мати дивну назву _, замість xабо aабо будь-який інший . Якщо хтось хоче знати, як написати лямбда-функцію, яка не бере аргументів; ось як: Визначити це наступним чином : my_lambda = lambda : 255. Назвіть це так: x = my_lambda()Ви можете замінити 255будь-яке значення, яке вам подобається.
Зубочистка Анемона

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

Відповіді:


143

Ім'я _змінної. Спробуй це. (Це ім'я змінної зазвичай є ім'ям ігнорованої змінної. Заповнювач, так би мовити.)

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 / ...
таро Kiritani

7

Підкреслення - це умова Python для іменування невикористовуваної змінної (наприклад, засоби статичного аналізу не повідомляють про неї як про невикористовувану змінну). У вашому випадку лямбда-аргумент не використовується, але створений об'єкт - це функція з одним аргументом, яка завжди повертається True. Отже, ваша лямбда дещо аналогічна постійній функції в математиці.


не лише перетворення python, це мовний агностик, а підкреслення використовується, щоб вказати, що змінна є тимчасовою або незначною
Sławomir Lenart

6

здається, це функція, яка повертає True незалежно.

Так, це функція (або лямбда), яка повертає True. Підкреслення , який зазвичай представляє собою заповнювач для ігнорованого змінної, НЕ є необхідним в даному випадку.

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

dd = collections.defaultdict(lambda: True)

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


4

Лямбда означає функцію. Вищезазначене те саме, що писати

def f(_):
    return True

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


3

Підкреслення _є дійсним ідентифікатором і використовується тут як ім'я змінної. Він завжди повертається Trueдля аргументу, переданого функції.

>>>a('123') 
True

Привіт, дякую за швидку відповідь. отже, це анонімна функція, яка завжди повертає true?
laycat

@laycat; Так. Це завжди повернеться правдою.
хакі

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замість defsf, коли функція більше не використовуватиметься. Якщо ми не хочемо викликати функцію знову пізніше, тоді немає необхідності давати функції ім’я. Наприклад, розглянемо такий код:

def apply_to_each (transform, in_container): out_container = list () for idx, item in 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.