Нижче наведено рядок коду, про який йдеться:
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і _замість довгої назви змінної, коли хочемо щось коротке, солодке і, мабуть, не захочемо використовувати знову пізніше.
lambda : True