Python Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: Анонимная функция (лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅) β€” ДокумСнтация Python для сСтСвых ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΎΠ² 3.0

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

АнонимныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ | Python: Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Иногда Π½Π°ΠΌ Π½ΡƒΠΆΠ½Π° функция, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Ρ‘ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΊΡƒΠ΄Π°-Ρ‚ΠΎ (Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка), Π½ΠΎ большС эта функция Π½ΠΈΠ³Π΄Π΅ Π½Π΅ понадобится. Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π½Π°Ρ‚ΡŒ, ΠΏΡ€ΠΈΠ΄ΡƒΠΌΡ‹Π²Π°Π½ΠΈΠ΅ ΠΈΠΌΡ‘Π½ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ β€” ΠΎΠ΄Π½Π° ΠΈΠ· основных ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Но Ссли функция Π½ΡƒΠΆΠ½Π° здСсь ΠΈ сСйчас, Π° большС Π½ΠΈΠ³Π΄Π΅ Π΅Ρ‘ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ придётся, Ρ‚ΠΎ ΠΈ имя Ρ‚Π°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ! Π’Π°ΠΊΠΈΠ΅ ΠΎΠ΄Π½ΠΎΡ€Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ практичСски всС языки, ΡƒΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с функциями ΠΊΠ°ΠΊ со значСниями. Π’ Python ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΎΠ΄Π½ΠΎΡ€Π°Π·ΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ выглядит Ρ‚Π°ΠΊ:

>>> lambda x: x + 1
<function <lambda> at 0x7f56e5798a60>

ΠœΡ‹ сконструировали Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π½ΠΎ имя ΠΎΠ½Π° Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π°, поэтому REPL Π΅Ρ‘ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠ», ΠΊΠ°ΠΊ function <lambda>.

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово lambda Π½Π°Π·Π²Π°Π½ΠΎ Π² Ρ‡Π΅ΡΡ‚ΡŒ лямбда абстракции β€” основного ΠΊΠΈΡ€ΠΏΠΈΡ‡ΠΈΠΊΠ° Лямбда Π˜ΡΡ‡ΠΈΡΠ»Π΅Π½ΠΈΡ, матСматичСского Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π°, часто ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‰Π΅Π³ΠΎΡΡ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ языков программирования. Π’ Лямбда Π˜ΡΡ‡ΠΈΡΠ»Π΅Π½ΠΈΠΈ всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅, поэтому Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… языках Ρ‚ΠΎΠΆΠ΅ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ «Π»ΡΠΌΠ±Π΄Π°ΠΌΠΈ» ΠΈΠ»ΠΈ «Π»ΡΠΌΠ±Π΄Π°-функциями».

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

>>> l = [1, 2, 5, 3, 4]
>>> l.sort(key=lambda x: -x)
>>> l
[5, 4, 3, 2, 1]

ΠœΠ΅Ρ‚ΠΎΠ΄ sort ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° key ссылку Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΡƒΠΊΠ°Π·Π°Π½Π° функция, ΠΌΠ΅Π½ΡΡŽΡ‰Π°Ρ Π·Π½Π°ΠΊ Ρƒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° β€” поэтому список получаСтся отсортирован ΠΎΡ‚ большСго ΠΊ ΠΌΠ΅Π½ΡŒΡˆΠ΅ΠΌΡƒ. Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ»ΡŽΡ‡Π° сама ΠΏΠΎ сСбС встрСчаСтся довольно часто, Π° Π²ΠΎΡ‚ ΠΊΠ»ΡŽΡ‡ΠΈ сортировки Ρ‡Π°Ρ‰Π΅ всСго Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²Ρ‹Π½ΠΎΡΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΈ Π² ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ смысла Π½Π΅Ρ‚ ΠΈ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ здСсь подходят идСально!

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Π’Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² скобки. К этому Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ½ΡƒΡ‚ΡŒ. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ срСдства для описания Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² доступны Π² ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΌΠ΅Ρ€Π΅ β€” ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΈ *args с **kwargs.

А Π΅Ρ‰Ρ‘ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ явно Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚, Π½ΠΎ слово return Π½ΠΈΠ³Π΄Π΅ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ! Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅Π»ΠΎ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” это всСгда ΠΎΠ΄Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ вычислСния ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. Π”Π°, Π² Ρ‚Π΅Π»Π΅ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ получится Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ нСсколько дСйствий ΠΈ Π½Π΅ получится ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ многострочныС конструкции Π²Ρ€ΠΎΠ΄Π΅ for ΠΈ while. Но Π·Π°Ρ‚ΠΎ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ просто Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Π΅Π³ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ слоТно Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ, Ρ€Π°Π·Ρ€Π΅ΡˆΠΈ Π°Π²Ρ‚ΠΎΡ€Ρ‹ «ΠΌΠ½ΠΎΠ³ΠΎΡΡ‚Ρ€ΠΎΡ‡Π½Ρ‹Π΅» лямбды.

Π•Ρ‰Ρ‘ ΠΎΠ΄Π½Π° ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ само объявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ являСтся Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ! Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Ρ‚ΡƒΡ‚ ΠΆΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ, Π½Π΅ заканчивая Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

>>> 1 + (lambda x: x * 5)(8) + 1
42

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ выглядит Π·Π°Π±Π°Π²Π½ΠΎ, Π½ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² Ρ‚Π°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ лямбды Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Ρ€Π΅Π΄ΠΊΠΎ. Π—Π°Ρ‚ΠΎ часто ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ лямбды ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

>>> def caller(arg):
...     return lambda f: f(arg)
...
>>> call_with_five = caller(5)
>>> call_with_five(str)
'5'
>>> call_with_five(lambda x: x + 1)
6

Python Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ — РусскиС Π‘Π»ΠΎΠ³ΠΈ

Π’ Python ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ def для опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ:

def double(x):
    return 2 * x

Помимо опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ описанным Π²Ρ‹ΡˆΠ΅ способом, Python Ρ‚Π°ΠΊΠΆΠ΅ прСдоставляСт ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово lambda, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ позволяСт Π½Π°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π±Π΅Π· ΠΈΠΌΠ΅Π½ΠΈ. Π•Π³ΠΎ Ρ„ΠΎΡ€ΠΌΠ° выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

lambda ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:  Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово lambda ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ это анонимная функция, Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅: ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ стоит ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° послС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ слСдуСт Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово return здСсь Π½Π΅ трСбуСтся.

ΠœΡ‹ пСрСписываСм Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΡƒΡŽ Π΄Π²ΠΎΠΉΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊΠ°ΠΊ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

lambda x: 2 * x

Как Π²Ρ‹ Π½Π°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ? ΠœΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ нСпосрСдствСнно Ρ‚Π°ΠΊ:

>>> (lambda x: 2 * x)(8)
16

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ анонимная функция ΠΏΠΎ сути являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, Π΅Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π° Π·Π°Ρ‚Π΅ΠΌ пСрСмСнная ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

>>> f = lambda x: 2 * x   
>>> f
<function <lambda> at 0x7f835a696578>
>>> f(8)
16
Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ сцСну

Лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ подходят для создания Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΌΠ°Π»Π΅Π½ΡŒΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. НапримСр, ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ Π²Ρ‹ΡˆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ double ΠΌΡ‹, бСзусловно, ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для опрСдСлСния def, Π½ΠΎ использованиС лямбды для Π΅Π΅ создания Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΌ, особСнно ΠΏΡ€ΠΈ использовании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π±ΠΎΠ»Π΅Π΅ высокого порядка.
ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

def func(g, arr):
    return [g(x) for x in arr]
    
def add_one(x):
    return x + 1
   
arr = func(add_one, [1, 2, 3, 4])

ВмСсто этого ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ лямбду:

def func(g, arr):
    return [g(x) for x in arr]

arr = func(lambda x: x + 1, [1, 2, 3, 4])
Ρ€Π΅Π·ΡŽΠΌΠ΅
  • АнонимныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ — это, ΠΏΠΎ сути, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π· ΠΈΠΌΠ΅Π½ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, поэтому Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π΅ ΠΈΠΌΠ΅Π½ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΡ€ΠΈ использовании Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ;
  • АнонимныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ подходят для создания Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ;

синтаксис, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ~ PythonRu

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python. На самом Π΄Π΅Π»Π΅, Ссли Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΡƒΠΌΠ΅Π΅Ρ‚Π΅ с Π½ΠΈΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Ρ‚ΠΎ Π·Π½Π°Π΅Ρ‚Π΅ ΠΈ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ лямбда.

Лямбда-функция Π² Python β€” это просто функция Python. Но это Π½Π΅ΠΊΠΈΠΉ особСнный Ρ‚ΠΈΠΏ с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ возмоТностями. Если Π΅ΡΡ‚ΡŒ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΠΏΠΎΠ³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒΡΡ Π³Π»ΡƒΠ±ΠΆΠ΅ ΠΈ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС, Ρ‚ΠΎ эта ΡΡ‚Π°Ρ‚ΡŒΡ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ посвящСна lambda.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ лямбда Π² Python?

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ Ρ€Π°Π·Π±ΠΎΡ€Ρƒ понятия лямбда Π² Python, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Π΅ΠΌ являСтся обычная функция Python Π½Π° Π±ΠΎΠ»Π΅Π΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅.

Для этого потрСбуСтся Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΡ‹ΡˆΠ»Π΅Π½ΠΈΠ΅. Как Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, всС Π² Python являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ.

НапримСр, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ запускаСм эту ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΡƒΡŽ строку ΠΊΠΎΠ΄Π°

x = 5

БоздаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Python Ρ‚ΠΈΠΏΠ° int, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сохраняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 5. x ΠΆΠ΅ являСтся символом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Ρ‚ΠΈΠΏ x ΠΈ адрСс, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ ссылаСтся. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ type ΠΈ id.

>>> type(x)
<class 'int'>
>>> id(x)
4308964832

Π’ ΠΈΡ‚ΠΎΠ³Π΅ x ссылаСтся Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° int, Π° располоТСн ΠΎΠ½ ΠΏΠΎ адрСсу, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π΅Ρ€Π½ΡƒΠ»Π° функция id.

ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΈ понятно.

А Ρ‡Ρ‚ΠΎ происходит ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

>>> def f(x):
...     return x * x
...

ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠΌ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΠ·Π½Π°Π΅ΠΌ type ΠΈ id ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° f.

>>> def f(x):
...     return x * x
...
>>> type(f)
<class 'function'>
>>> id(f)
4316798080

ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, Π² Python Π΅ΡΡ‚ΡŒ класс function, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ опрСдСлСнная функция f β€” это Π΅Π³ΠΎ экзСмпляр. Π’Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ x Π±Ρ‹Π» экзСмпляром класса integer. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΎ функциях ΠΌΠΎΠΆΠ½ΠΎ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π Π°Π·Π½ΠΈΡ†Π° лишь Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ хранят Π΄Π°Π½Π½Ρ‹Π΅, Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” ΠΊΠΎΠ΄.

Π­Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄Ρ€ΡƒΠ³ΠΈΠΌ функциям ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния.

Рассмотрим простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π³Π΄Π΅ функция f пСрСдаСтся Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

def f(x):
    return x * x

def modify_list(L, fn):
    for idx, v in enumerate(L):
        L[idx] = fn(v)

L = [1, 3, 2]
modify_list(L, f)
print(L)



ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ этот ΠΊΠΎΠ΄, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ дальшС.

Π˜Ρ‚Π°ΠΊ, modify_list β€” это функция, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список L ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ fn Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½Π° ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ список элСмСнт Π·Π° элСмСнтом ΠΈ примСняСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΈΠ· Π½ΠΈΡ….

Π­Ρ‚ΠΎ ΠΎΠ±Ρ‰ΠΈΠΉ способ измСнСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² списка, вСдь ΠΎΠ½ позволяСт ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая займСтся ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. Π’Π°ΠΊ, Ссли ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ modify_list Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ f, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ станСт список, Π³Π΄Π΅ всС значСния Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΎΠ·Π²Π΅Π΄Π΅Π½Ρ‹ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚.

Но ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈ Π»ΡŽΠ±ΡƒΡŽ Π΄Ρ€ΡƒΠ³ΡƒΡŽ, которая ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ список Π΄Ρ€ΡƒΠ³ΠΈΠΌ способом. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° с основами Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ, стоит ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ лямбда. Лямбда Π² Python β€” это просто Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ΠΎΡ‚ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ синтаксис лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python:

lambda arguments: expression

Лямбда ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ любоС количСство Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² (ΠΈΠ»ΠΈ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ), Π½ΠΎ состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ выраТСния. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ присвоСна функция. НапримСр, Ссли Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ f ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²Ρ‹ΡˆΠ΅, Ρ‚ΠΎ это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

>>> f = lambda x: x * x
>>> type(f)
<class 'function'>

Но Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос: Π° Π·Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ссли ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ? Но Π½Π° самом Π΄Π΅Π»Π΅, ΠΎΠ½ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ лишь Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½Π° одноразовая функция. Π’Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΅Ρ‰Π΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΌΠΈ. И, ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ дальшС, Π΅ΡΡ‚ΡŒ масса ситуаций, Π³Π΄Π΅ ΠΎΠ½ΠΈ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½ΡƒΠΆΠ½Ρ‹.

Лямбда с нСсколькими Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с ΠΎΠ΄Π½ΠΈΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Π½Π΅ составляСт Ρ‚Ρ€ΡƒΠ΄Π°.

>>> f = lambda x: x * x
>>> f(5)
25

А Ссли ΠΈΡ… Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ нСсколько, Ρ‚ΠΎ достаточно лишь Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ значСния запятыми. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½Π° функция, которая Π±Π΅Ρ€Π΅Ρ‚ Π΄Π²Π° числовых Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅.

>>> f = lambda x, y: x * y
>>> f(5, 2)
10

ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ! А ΠΊΠ°ΠΊ насчСт лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²?

Лямбда-функция Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²

Допустим, Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², которая Π±Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»Π° True. Π­Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°.

>>> f = lambda: True
>>> f()
True

НСсколько лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Π’ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ вопрос: Π° ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… строк.

ΠžΡ‚Π²Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π΅Π½: Π½Π΅Ρ‚.

Лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python всСгда ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Если ΠΆΠ΅ ΠΈΡ… нСсколько, Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим самыС распространСнныС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Лямбда-функция ΠΈ map

РаспространСнная опСрация со списками Π² Python β€” ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ элСмСнту.

map() β€” это встроСнная функция Python, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π°Ρ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Она Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ примСняСт ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ элСмСнту.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π΅ΡΡ‚ΡŒ список Ρ†Π΅Π»Ρ‹Ρ… чисСл, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ возвСсти Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ map.

>>> L = [1, 2, 3, 4]
>>> list(map(lambda x: x**2, L))
[1, 4, 9, 16]

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² Python3 функция map Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Map, Π° Π² Python2 β€” список.

Π’Π°ΠΊ, вмСсто опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΅Π΅ Π² map Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΌΠΎΠΆΠ½ΠΎ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лямбда для быстрого опрСдСлСния Π΅Π΅ прямо Π²Π½ΡƒΡ‚Ρ€ΠΈ. Π’ этом Π΅ΡΡ‚ΡŒ смысл, Ссли упомянутая функция большС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΊΠΎΠ΄Π΅.

Π’ΠΎΡ‚ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

Лямбда-функция ΠΈ filter

filter() β€” это Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° встроСнная функция, которая Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, функция filter ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ элСмСнты ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, списка) Π½Π° основС ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ критСрия. ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΉ опрСдСляСтся Π·Π° счСт ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Она ΠΆΠ΅ примСняСтся ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ элСмСнту ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Если Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” True, элСмСнт остаСтся. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС β€” отклоняСтся. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ True для Ρ‡Π΅Ρ‚Π½Ρ‹Ρ… чисСл ΠΈ False β€” для Π½Π΅Ρ‡Π΅Ρ‚Π½Ρ‹Ρ…:

def even_fn(x):
  if x % 2 == 0:
    return True
  return False

print(list(filter(even_fn, [1, 3, 2, 5, 20, 21])))



Π‘ лямбда-функциями это всС ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ максимально сТато. Код Π²Ρ‹ΡˆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ‚Π°ΠΊΠΎΠΉ, написанный Π² ΠΎΠ΄Π½Ρƒ строку.

print(list(filter(lambda x: x % 2 == 0, [1, 3, 2, 5, 20, 21])))

И Π² этом сила лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Лямбда-функция ΠΈ сортировка списков

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° списка β€” базовая опСрация Π² Python. Если Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ спискС чисСл ΠΈΠ»ΠΈ строк, Ρ‚ΠΎ процСсс максимально простой. ΠŸΠΎΠ΄ΠΎΠΉΠ΄ΡƒΡ‚ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sort ΠΈ sorted.

Но ΠΈΠ½ΠΎΠ³Π΄Π° имССтся список кастомных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ Π½Π° основС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ key Π² sort ΠΈΠ»ΠΈ sorted. Он ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ.

Ѐункция примСняСтся ΠΊΠΎ всСм элСмСнтам ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” Ρ‚ΠΎ, Π½Π° основС Ρ‡Π΅Π³ΠΎ выполнится сортировка. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π•ΡΡ‚ΡŒ класс Employee.

class Employee:
    def __init__(self, name, age):
        self.name = name
        self.age = age

Π’Π΅ΠΏΠ΅Ρ€ΡŒ создадим экзСмпляры этого класса ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΈΡ… Π² список.

Alex = Employee('Alex', 20)
Amanda = Employee('Amanda', 30)
David = Employee('David', 15)
L = [Alex, Amanda, David]

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π° основС поля age сотрудников. Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ для этого:

L.sort(key=lambda x: x.age)
print([item.name for item in L])


Лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ использовано Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° key вмСсто ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π΅Π΅ опрСдСлСния ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sort.

ΠŸΠ°Ρ€Π° слов ΠΎ выраТСниях ΠΈ инструкциях

Как ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ, лямбда ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (expression) Π² Ρ‚Π΅Π»Π΅.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ Π½Π΅ ΠΎΠ± инструкции (statement).

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ инструкции β€” Π΄Π²Π΅ Ρ€Π°Π·Π½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… часто ΠΏΡƒΡ‚Π°ΡŽΡ‚ΡΡ. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ инструкциСй являСтся строка ΠΊΠΎΠ΄Π°, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°Ρ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ, Π½ΠΎ Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

НапримСр, инструкция if ΠΈΠ»ΠΈ Ρ†ΠΈΠΊΠ»Ρ‹ for ΠΈ while ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ инструкций. Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ попросту Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

А Π²ΠΎΡ‚ выраТСния β€” это значСния. Запросто ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ всС выраТСния Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π° значСния, ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ.

НапримСр:

  • 3 + 5 β€” Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 8
  • 10 > 5 β€” Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ True
  • True and (5 < 3) β€” Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ False

Π’Π΅Π»ΠΎ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠ²Π»ΡΡ‚ΡŒΡΡ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π²Π΅Ρ€Π½Π΅Ρ‚. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ это для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с лямбда-функциями Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.

АнонимныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΡΡΡ‹Π»Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² python

Closures в python с использованиСм functools.partial

from functools import partial

i = 0
f0 = partial(callback, i)
i = 1
f1 = partial(callback, i)

f0()
# 0
f1()
# 1

partial ΠΏΠΎΡ…ΠΎΠΆ Π½Π° lambda, Π½ΠΎ ΠΎΠ±Π΅Ρ€Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π² arg. НС оцСнивая Π΅Π³ΠΎ, ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚.

ΠžΠ±Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²

Yes partial ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π°ΠΌ ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ любоС количСство Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π° ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ ΠΊΠ²Π°Ρ€Π³ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌΡƒ частичному ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ дСйствовал Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ ΠΎΠ½ Π²Ρ‹Π·Ρ‹Π²Π°Π» ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ…

def callback(val1, val2):
   print "{0} {1}".format(val1, val2)

i = 0
x = 8
f0 = partial(callback, i)
f0(x)
# 0 8

По сути, Π²Ρ‹ Π·Π°Π²Π΅Ρ€Π½ΡƒΠ»ΠΈ callback(val1, val2) Π² callback(val2) , Π° val1 ΡƒΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Π² качСствС закрытия.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ³ΠΎ эффСкта с использованиСм lambda

Π’ случаС, Ссли Π²Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ lambda, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ это становится ΡƒΡ€ΠΎΠ΄Π»ΠΈΠ²Ρ‹ΠΌ ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ частичным…

f0 = (lambda val1: lambda val2: callback(val1, val2))(i)

Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ области видимости Π²ΠΎ внСшнюю ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° эту ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ lambda. Π“ΠΎΠ³ΠΎΡ‚.

Врассировки ΠΈΠ· ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ: частичныС vs lambda vs Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π‘ ΠΏΡ€ΠΈΡ‚ΠΎΠΊΠΎΠΌ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² я ΠΏΠΎΠ΄ΡƒΠΌΠ°Π», Ρ‡Ρ‚ΠΎ ΠΈΠ·Π»ΠΎΠΆΡƒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ частичноС, Π° Π½Π΅ lambda, ΠΈΠ»ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ/внСшнСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ я имСю Π² Π²ΠΈΠ΄Ρƒ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. functools.partial исправляСт ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ трассировку, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅, ΠΊΠΎΠ³Π΄Π° ваша обСрнутая функция Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅…

Рассмотрим эту Π²Π΅Ρ€ΡΠΈΡŽ, которая ΠΏΠΎΠ΄Π½ΠΈΠΌΠ΅Ρ‚ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ноль:

def callback(val1, val2):
    return val1 / val2

ΠΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Π½Π°Ρ€ΡƒΠΆΠ½ΠΎΠ΅/Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅

def wrapper(fn, val1):
    def wrapped(val2):
            return fn(val1, val2)
    return wrapped

f0 = wrapper(callback, i)
f0(0)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in wrapped
  File "<stdin>", line 2, in callback
ZeroDivisionError: integer division or modulo by zero

lambda Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅

f0 = (lambda val1: lambda val2: callback(val1, val2))(i)
f0(0)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
  File "<stdin>", line 2, in callback
ZeroDivisionError: integer division or modulo by zero

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ для functools.partial

f0 = partial(callback, i)
f0(0)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in callback
ZeroDivisionError: integer division or modulo by zero

4 ΠŸΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Ρ… ΠΏΡ€ΠΈΠ΅ΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с функциями Python, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π½Π΅ Π·Π½Π°Ρ‚ΡŒ | by АндрСй Π¨Π°Π³ΠΈΠ½ | NOP::Nuances of Programming

Π—Π½Π°Π΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ Ρ€Π°ΡΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ массив ΠΈΠ»ΠΈ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ? ΠŸΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌ Π²Π°ΡˆΠ΅ΠΌΡƒ вниманию Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Ρ… ΠΏΡ€ΠΈΠ΅ΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с функциями Python.

Π£ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΅ΡΡ‚ΡŒ нСсколько прСимущСств:

  • Π—Π΄Π΅ΡΡŒ Π½Π΅Ρ‚ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ очСрСдности задания Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π˜ΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ имя, Π° Π½Π΅ позиция.
  • Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΡ€ΠΈΠ΄Π°ΡŽΡ‚ большС ясности. НС глядя Π½Π° саму Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, часто Π±Ρ‹Π²Π°Π΅Ρ‚ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎ названию Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ, для Ρ‡Π΅Π³ΠΎ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, всС это Π²Π°ΠΌ ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΠΎ. Но Π·Π½Π°Π΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ ΠΎ возмоТности ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹? ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ это описано Π² PEP 3202. Если Π²ΠΊΡ€Π°Ρ‚Ρ†Π΅, Ρ‚ΠΎ всС сводится ΠΊ использованию Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠΈ ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π΄Π°Π½ Π² качСствС ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Или сразу ΠΏΠ΅Ρ€Π΅Π΄ всСми, ΠΈ Ρ‚ΠΎΠ³Π΄Π° всС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π΄Π°Π½Ρ‹ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹:

>>> def f(*, a, b):
... print(a, b)
...
>>> f(1, 2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: f() takes 0 positional
arguments but 2 were given
>>> f(a=1, b=2)
1 2
>>>

НСкоторыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ задСйствованиС Π΄Π»ΠΈΠ½Π½ΠΎΠ³ΠΎ списка Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². И хотя этого слСдуСт всячСски ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ классы Π΄Π°Π½Π½Ρ‹Ρ…), Π½Π΅ всСгда всС зависит ΠΎΡ‚ нас. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях Π»ΡƒΡ‡ΡˆΠ΅ΠΉ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ созданиС словаря со всСми ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΅Π³ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это ΠΏΡ€ΠΈΠ΄Π°Π΅Ρ‚ ΠΊΠΎΠ΄Ρƒ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ для восприятия Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ Π²ΠΈΠ΄.

РаспаковываСтся ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ для использования с ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ прСфикса **:

>>> def f(a, b):
... print(a, b)
...
>>> args = { "a": 1, "b": 2 }
>>> f(**args)
1 2

Аналогично ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ одинарная Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠ° * для распаковывания массива ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΅Π³ΠΎ содСрТимого Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² качСствС ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²:

>>> def f(a, b, c):
... print(a, b, c)
...
>>> l = [1, 2, 3]
>>> f(*l)
1 2 3

Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ β€” это ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ Π²ΠΎΠΊΡ€ΡƒΠ³ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠ΅Π½ΡΡŽΡ‚ Π΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. Π•ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² использования Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΈ Π²Ρ‹ навСрняка ΡƒΠΆΠ΅ задСйствовали ΠΈΡ… Ρ€Π°Π½ΡŒΡˆΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ Ρ‚ΠΈΠΏΠ° Flask.

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ наш собствСнный Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€. Π­Ρ‚ΠΎ ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ каТСтся, ΠΈ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΎΠ½ пригодится:

def print_argument(func):
def wrapper(the_number):
print("Argument for", func.__name__, "is", the_number)
return func(the_number)

return wrapper

@print_argument
def add_one(x):
return x + 1

print(add_one(1))

Π’Π½ΡƒΡ‚Ρ€ΠΈ print_argument ΠΌΡ‹ опрСдСляСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΡƒ. Π­Ρ‚Π° функция Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΈ имя Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π—Π°Ρ‚Π΅ΠΌ происходит Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ самой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ Π΅Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ функция Π²Ρ‹Π·Ρ‹Π²Π°Π»Π°ΡΡŒ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ @print_argument ΠΌΡ‹ примСняСм Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. На всякий случай Π·Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ этот Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈ для Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚ΠΎΠΆΠ΅.

Π’ качСствС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° нашСго малСнького скрипта Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ:

Argument for add_one is 1
2

Иногда функциям Π½Π΅ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ ΠΈΠΌΠ΅Π½. НапримСр, ΠΊΠΎΠ³Π΄Π° ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ функция Π±ΡƒΠ΄Π΅Ρ‚ использована Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·. Для Ρ‚Π°ΠΊΠΈΡ… случаСв Π² Python прСдусмотрСны Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ лямбда-функциями).

Лямбда-функция назначаСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ получаСтся Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹ΠΉ способ опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

>>> def add_one(x): return 2*x
>>> add_one(3)
4

Π•Ρ‰Π΅ интСрСснСС становится, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях функция ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. Π’Ρ‹ навСрняка Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ map функция примСняСтся ΠΊΠΎ всСм элСмСнтам ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ лямбду ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ map:

>>> numbers = [1, 2, 3, 4]
>>> times_two = map(lambda x: x * 2, numbers)
>>> list(times_two)
[2, 4, 6, 8]
>>>

ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ шаблон, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ часто Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ. Когда Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ элСмСнту ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, использованиС map() Π² сочСтании с лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ являСтся Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹ΠΌ ΠΈ эффСктивным.

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅:

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ нас Π² Telegram, VK ΠΈ ЯндСкс.Π”Π·Π΅Π½

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python. Π§Π°ΡΡ‚ΡŒ 2.

Β 

АнонимныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

АнонимныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ лямбда-выраТСния – Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½ΠΎΡƒ-Ρ…Π°Ρƒ Python, Ρ‚Π°ΠΊΠΈΠ΅ конструкции Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½Ρ‹ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… языков, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Haskell ΠΈΠ»ΠΈ Lisp. Появились ΠΎΠ½ΠΈ, благодаря Π΄Π΅ΡΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΎΠ² Алонзо Π§Π΅Ρ€Ρ‡Π° ΠΈ Алана Π’ΡŒΡŽΡ€ΠΈΠ½Π³Π°.

Python Π½Π΅ являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ языком программирования, Π½ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ элСмСнты Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… языков встроСны Π² Π½Π΅Π³ΠΎ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ разбСрСмся, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠ΅ лямбда-выраТСния ΠΈ ΠΊΠ°ΠΊ с Π½ΠΈΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Как ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΈΠ· названия β€œΠ°Π½ΠΎΠ½ΠΈΠΌΠ½Π°Ρ функция”, лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎΠΌ смыслС являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ отсутствуСт имя:

def simple_sqr(x):
    return x*x


lambda_sqr = lambda x: x*x

print(lambda_sqr(5)) #25
print(simple_sqr(6)) #36

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ написали ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡƒΡŽ, def-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²ΠΎΠ΄ΠΈΡ‚ число Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ справСдливо Π²ΠΎΠ·Ρ€Π°Π·ΠΈΡ‚ΡŒ, сказав, Ρ‡Ρ‚ΠΎ Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚Π΅ здСсь Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π΅ΡΡ‚ΡŒ simple_sqr ΠΈ lambda_sqr, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ присваиваСтся странная конструкция. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ являСтся нСсколько Π½Π°Π΄ΡƒΠΌΠ°Π½Π½Ρ‹ΠΌ, Ссли Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² PyCharm, Ρ‚ΠΎ услуТливая срСда Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚: β€œPEP 8: do not assign a lambda expression, use a def”, Ρ‡Ρ‚ΠΎ Π² прямом смыслС ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π΅ Π½Π°Π΄ΠΎ ΠΌΡƒΠ΄Ρ€ΠΈΡ‚ΡŒ с лямбда-выраТСниями, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡƒΡŽ def-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Однако Π½Π° Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΡ… синтаксис:

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово: lambda

АргумСнт (Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ): x

Π’Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (дСйствиС Π½Π°Π΄ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ): x*x

БобствСнно, ΠΏΠΎ Ρ‚Π°ΠΊΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ строятся всС Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько, Π² Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ нСльзя ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ return. Но логичСскиС выраТСния Π² Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… функциях всС ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ лямбда-выраТСния для опрСдСлСния чСтности/нСчСтности числа:

print((lambda x: 'even' if x % 2 == 0 else 'odd')(5)) #odd
print((lambda x: 'even' if x % 2 == 0 else 'odd')(4)) #even

Π’Π°ΠΊ Π² Ρ‡Π΅ΠΌ ΠΆΠ΅ прСимущСство лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π½Π°Π΄ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ функциями? Π˜Ρ… Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ, ΠΏΠ΅Ρ€Π²ΠΎΠ΅ – это сокращСниС строчСк ΠΊΠΎΠ΄Π° Π΄ΠΎ ΠΎΠ΄Π½ΠΎΠΉ, Π½ΠΎ это сниТаСт Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°, особСнно для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ². Π’Ρ‚ΠΎΡ€Ρ‹ΠΌ прСимущСством являСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лямбда-выраТСния Π½Π° Π»Π΅Ρ‚Ρƒ, сразу ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡ… Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ элСмСнтами Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования, ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ· Π½ΠΈΡ… ΠΏΠΎΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅.

Ѐункция map()

Ѐункция map(function, iterator) ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² сСбя Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° – Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Ρ‹ Π² соотвСтствии с этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ map ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π΅Π½ ΠΏΡ€ΠΈ создании Π½ΠΎΠ²ΠΎΠ³ΠΎ списка Π½Π° основС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ, Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΠΌ список символов Π² список чисСл. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ°ΠΊ Ρ€Π°Π·-Ρ‚Π°ΠΊΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π°ΠΌ прСимущСство лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΌΡ‹ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ список, возводя ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ число Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚, ΠΈ всС это ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΠΎΠ΄Π½Ρƒ строку, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

str_list = ['1', '2', '3', '4', '5'] #рассмотрим список с элСмСнтами Ρ‚ΠΈΠΏΠ° string

int_list = list(map(int, str_list)) #ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ ΠΈΡ… Π² int

print(int_list) #[1, 2, 3, 4, 5]

sqr_list = list(map(lambda x: x*x, int_list)) #Π²ΠΎΠ·Π²Π΅Π΄Π΅ΠΌ ΠΈΡ… Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚

print(sqr_list) #[1, 4, 9, 16, 25]

print(list(map(lambda x: x*x, list(map(int, str_list)))))#Π²Ρ‹ΡˆΠ΅ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² ΠΎΠ΄Π½Ρƒ строку

Π’Π°ΠΊΠΆΠ΅ Π·Π°ΠΌΠ΅Ρ‡Ρƒ, Ρ‡Ρ‚ΠΎ Π² map ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ нСсколько элСмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹, Π½ΠΎ map Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ дСйствиС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ элСмСнту.

Ѐункция reduce()

Ѐункция reduce(function, iterator) ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° map Π·Π° ΠΎΠ΄Π½ΠΈΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ СдинствСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. На основС этого опрСдСлСния ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Π² ΠΊΠ°ΠΊΠΈΡ… ΠΆΠ΅ ситуациях функция reduce ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ сумму ΠΈΠ»ΠΈ Π½Π°ΠΉΡ‚ΠΈ максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… условиях:

from functools import reduce
print(sqr_list) #[1, 4, 9, 16, 25, 36]
print(reduce(lambda x, y: x + y, sqr_list)) #91 

Бинтаксис reduce ΠΏΠΎΡ…ΠΎΠΆ Π½Π° map, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ значСния ΠΈ Π½Π΅ΠΊΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» для ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Π—Π°ΠΌΠ΅Ρ‡Ρƒ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reduce Π½Π΅ являСтся стандартной ΠΈ для Π΅Π΅ использования Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ functools.

Ѐункция filter()

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· названия, filter(function, iterator) – Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅Ρ‚ элСмСнты ΠΏΠΎ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ условиям, синтаксис filter Ρ‚Π°ΠΊΠΆΠ΅ совпадаСт с map, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‚ΡƒΠ΄Π° условия, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ значСния ΠΈ сами значСния. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΌΡ‹ ΠΈΡ‰Π΅ΠΌ Π² строкС слова с количСством символов большС 5:

str = 'We learn python with ai-Simple'
new_list = str.split() #['We', 'learn', 'python', 'with', 'ai-Simple']
print(list(filter(lambda x: len(x) > 5, new_list))) #['python', 'ai-Simple']

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ
ΠŸΠΎΡΠ΅Ρ‚ΠΈΡ‚Π΅Π»ΠΈ, находящиСся Π² Π³Ρ€ΡƒΠΏΠΏΠ΅ Гости, Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΊ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python для самых ΠΌΠ°Π»Π΅Π½ΡŒΠΊΠΈΡ… β€” Π§Π°ΡΡ‚ΡŒ 1 β€” Lambda Ѐункция

Π― Ρ€Π΅ΡˆΠΈΠ» Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ эту ΡΠ΅Ρ€ΠΈΡŽ статСй, ΠΈΠ±ΠΎ ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Ρ‚ΡŒΡΡ с Ρ‚ΠΎΠΉ стСной нСпонимания, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ столкнулся ΠΊΠΎΠ³Π΄Π°-Ρ‚ΠΎ я.

Π’Π΅Π΄ΡŒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ статСй написаны Ρ‚Π°ΠΊΠΈ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ‡Ρ‚ΠΎ, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π² Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ (Π΄Π°Π»Π΅Π΅ ЀП), Ρ‚Π΅Π±Π΅ Π½Π°Π΄ΠΎ ΡƒΠΆΠ΅ Π·Π½Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π² ЀП. Π­Ρ‚Ρƒ ΡΡ‚Π°Ρ‚ΡŒΡŽ я старался Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ максимально просто β€” Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ понятно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Ρ‘ ΡΡƒΡ‚ΡŒ ΠΌΠΎΠ³ ΡƒΠ»ΠΎΠ²ΠΈΡ‚ΡŒ ΠΌΠΎΠΉ плСмянник, школьник, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сСйчас Π΄Π΅Π»Π°Π΅Ρ‚ свои ΠΏΠ΅Ρ€Π²Ρ‹Π΅ шаги Π² Python.

НСбольшоС ввСдСниС

Для Π½Π°Ρ‡Π°Π»Π°, Π΄Π°Π²Π°ΠΉΡ‚Π΅ разбСрСмся, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π² Ρ‡Π΅ΠΌ Π΅Π³ΠΎ особСнности, Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½ΠΎ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π³Π΄Π΅ ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Бтоп… А Π·Π°Ρ‡Π΅ΠΌ? Об этом написаны Ρ‚ΠΎΠ½Π½Ρ‹ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ², Π΄Π° ΠΈ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ судя ΠΏΠΎ всСму эта информация Π½Π΅ особо Π½ΡƒΠΆΠ½Π°. Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ написана для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ Π² ΠΊΠΎΠ΄Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ написан Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ стилС. Но Ссли Π²Ρ‹ всС-Ρ‚Π°ΠΊΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² истории Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈ Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ, Ρ‚ΠΎ ΡΠΎΠ²Π΅Ρ‚ΡƒΡŽ Π²Π°ΠΌ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎ Ρ‚Π°ΠΊΠΈΡ… Π²Π΅Ρ‰Π°Ρ…, ΠΊΠ°ΠΊ

  • Чистая Ѐункция
  • Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΊΡ€Π°Ρ‚ΠΊΠΎ разбСрСмся Π² этих Π΄Π²ΡƒΡ… понятиях ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ.

Чистая Ѐункция β€” Ѐункция которая являСтся Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΈ Π½Π΅ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΠΌΠΈ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌΠΈ эффСктами.

Π’ΠΎ Π΅ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎΠ±Ρ‹ функция являлась чистой ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ β€” Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΌ Π½Π°Π±ΠΎΡ€Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

def sum(a,b):
  return a+b

print(sum(3,6))
print(sum(3,6))
print(sum(3,6))

>>>9
>>>9
>>>9

И ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π΅ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ:

from datetime import date

todays_weekday = date.today().weekday()
def sum(a,b):
  if todays_weekday == 1:
    result = a+b
    print(f'sum is {result} and result class is {type(result)}')
  else:
    result = str(a+b)
    print(f'sum is {result} and result class is {type(result)}')

sum(4,5)
todays_weekday = 4
sum(4,5)

>>>sum is 9 and result class is <class 'int'>
>>>sum is 9 and result class is <class 'str'>

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ смСнС дня Π½Π΅Π΄Π΅Π»ΠΈ (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ являСтся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ) функция Π²Ρ‹Π΄Π°Π΅Ρ‚ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.

Π‘Π°ΠΌΡ‹ΠΉ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π΅ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ это random:

import random
print(random.random())
print(random.random())
print(random.random())

>>>0.5002395668892657
>>>0.8837128676460416
>>>0.5308851462814731

Π’Ρ‚ΠΎΡ€ΠΎΠ΅ Π²Π°ΠΆΠ½ΠΎΠ΅ качСство чистой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ это отсутствиС ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов.

ПокаТСм наглядно:

my_list = [32,3,50,2,29,43]

def sort_by_sort(li):
  li.sort()
  print(li)

sort_by_sort(my_list)
print(my_list)

>>>[2, 3, 29, 32, 43, 50]
>>>[2, 3, 29, 32, 43, 50]

Ѐункция sort_by_sort ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ измСняСт исходный список элСмСнтов ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎ Π² консоль.

my_list = [32,3,50,2,29,43]

def sort_by_sorted(li):
  return sorted(li)

print(sort_by_sorted(my_list))
print(my_list)

>>>[2, 3, 29, 32, 43, 50]
>>>[32, 3, 50, 2, 29, 43]

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΈ ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° функция sort_by_sorted Π½Π΅ мСняСт исходного массива ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π΅ выводя Π΅Π³ΠΎ Π² консоль ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.

ЧистыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΈ Ρ‚Π΅ΠΌ Ρ‡Ρ‚ΠΎ:

  • Они ΠΏΡ€ΠΎΡ‰Π΅ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ
  • Они ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ
  • Они ΠΏΡ€ΠΎΡ‰Π΅ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ
  • Они Π½Π΅ зависят ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ Π² ΠΊΠ°ΠΊΠΎΠΌ порядкС ΠΈΡ… Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ΠΌ Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ чистыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка β€” Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ функция, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π°Ρ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π°Ρ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² качСствС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π€Π’ΠŸ:

def func(num):
  return num**2

def higher_order_func(fun, num):
  return fun(num)+fun(num)

print(func(4))
print(higher_order_func(func,4))

>>>16
>>>32

Π‘ основами Ρ‡ΡƒΡ‚ΡŒ Ρ‡ΡƒΡ‚ΡŒ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΡˆΠ°Π³Ρƒ.

Π˜Ρ‚Π°ΠΊ, Π½Π°Ρ‡Π½Π΅ΠΌ

Для Π½Π°Ρ‡Π°Π»Π° Π½Π°Π΄ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ β€” Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΎΠΎΠ±Ρ‰Π΅. Π›ΠΈΡ‡Π½ΠΎ я знаю Π΄Π²Π΅ самыС часто ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌΡ‹Π΅ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡ‹ Π² повсСднСвном ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ β€” это ООП ΠΈ ЀП.

Если ΡƒΠΏΡ€ΠΎΡ‰Π°Ρ‚ΡŒ совсСм ΠΈ ΠΎΠ±ΡŠΡΡΠ½ΡΡ‚ΡŒ Π½Π° ΠΏΠ°Π»ΡŒΡ†Π°Ρ…, Ρ‚ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ эти Π΄Π²Π΅ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  • ООП β€” это ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ ΠžΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ β€” ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ, ΠΏΡ€ΠΈ использовании ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² качСствС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.
  • По Ρ‚Π°ΠΊΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ЀП β€” ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ, ΠΏΡ€ΠΈ использовании ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠΌ функциям Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ функциями… ΠžΡ‚Π²Π΅Ρ‚ скрыт Π² самом Π½Π°Π·Π²Π°Π½ΠΈΠΈ.

Как Π³ΠΎΠ²ΠΎΡ€ΠΈΠ» ΠΌΠΎΠΉ Π»ΡŽΠ±ΠΈΠΌΡ‹ΠΉ ΡƒΡ‡ΠΈΡ‚Π΅Π»ΡŒ

zverok

Π’ΠΈΠΊΡ‚ΠΎΡ€ Π¨Π΅ΠΏΠ΅Π»Π΅Π²: «Вся Ρ€Π°Π±ΠΎΡ‚Π° Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ β€” это Ρ€Π°Π±ΠΎΡ‚Π° с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Взял ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅, поигрался с Π½ΠΈΠΌΠΈ ΠΈ Π²Π΅Ρ€Π½ΡƒΠ» ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ.Β»

Π­Ρ‚ΠΎ относится ΠΈ ΠΊ ЀП β€” взял ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅, взял ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, поигрался с Π½ΠΈΠΌΠΈ ΠΈ Π²Ρ‹Π΄Π°Π» Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅.

НС стану Ρ€Π°ΡΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ всё, ΠΈΠ½Π°Ρ‡Π΅ это Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΎΠΎΠΎΡ‡Π΅Π½ΡŒ Π΄ΠΎΠ»Π³ΠΎ. ЦСль Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ β€” ΠΏΠΎΠΌΠΎΡ‡ΡŒ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, Π° Π½Π΅ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΈ Ρ‡Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, поэтому Ρ‚ΡƒΡ‚ ΠΌΡ‹ рассмотрим основныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· ЀП.

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ своСм ЀП (ΠΊΠ°ΠΊ я Π΅Π³ΠΎ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽ) β€” это просто ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠ΅ написаниС ΠΊΠΎΠ΄Π°. Π›ΡŽΠ±ΠΎΠΉ ΠΊΠΎΠ΄, написанный Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ стилС, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ довольно Π»Π΅Π³ΠΊΠΎ пСрСписан Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ стилС Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΠΈ качСства, Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎ. ЦСль ЀП Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ простой, понятный ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π»Π΅Π³Ρ‡Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ мСньшС памяти, Π½Ρƒ ΠΈ ΠΊΡƒΠ΄Π° ΠΆΠ΅ Π±Π΅Π· этого β€” разумССтся, главная вСчная ΠΌΠΎΡ€Π°Π»ΡŒ программирования β€” DRY (Don’t Repeat Yourself β€” НС повторяйся).

БСйчас ΠΌΡ‹ с Π²Π°ΠΌΠΈ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΎΠ΄Π½Ρƒ ΠΈΠ· основных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, которая примСняСтся Π² ЀП β€” Lambda Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΡΡ‚Π°Ρ‚ΡŒΡΡ… ΠΌΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ Ρ‚Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ Map, Zip, Filter ΠΈ Reduce.

Lambda функция

Lambda β€” это инструмСнт Π² python ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования для Π²Ρ‹Π·ΠΎΠ²Π° Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Многим это скорСС всСго Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ скаТСт ΠΈ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ прояснит Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, поэтому я расскаТу Π²Π°ΠΌ просто ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ lambda Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

ВсС ΠΎΡ‡Π΅Π½ΡŒ просто.

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€. НапримСр, Π½Π°ΠΌ Π½Π°Π΄ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ которая Π±Ρ‹ считала ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ ΠΊΡ€ΡƒΠ³Π° ΠΏΡ€ΠΈ извСстном радиусС.

Π€ΠΎΡ€ΠΌΡƒΠ»Π° ΠΏΠ»ΠΎΡ‰Π°Π΄ΠΈ ΠΊΡ€ΡƒΠ³Π° это

S = pi*(r**2)

Π³Π΄Π΅

S β€” это ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ ΠΊΡ€ΡƒΠ³Π°

pi β€” матСматичСская константа равная 3.14 ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Math

r β€” радиус ΠΊΡ€ΡƒΠ³Π° β€” СдинствСнная пСрСмСнная ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΡ„ΠΎΡ€ΠΌΠΈΠΌ это всС Π² python:

import math #ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ math

pi_const = round(math.pi, 2) #округляСм pi Π΄ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π·Π½Π°ΠΊΠ° послС запятой ΠΈΠ½Π°Ρ‡Π΅ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ 3.141592653589793 Π° Π½Π°ΠΌ это Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ

# ПишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ которая Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ ΠΊΡ€ΡƒΠ³Π° ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ радиусу Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ записи
def area_of_circle_simple(radius):
  return pi_const*(radius**2)

print(area_of_circle_simple(5))
print(area_of_circle_simple(12))
print(area_of_circle_simple(26))
>>>78.5
>>>452.16
>>>2122.64

Π’Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ, Π½ΠΎ это всё ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΊΡƒΠ΄Π° ΠΊΡ€ΡƒΡ‡Π΅, Ссли Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ это Ρ‡Π΅Ρ€Π΅Π· lambda:

import math #ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ math

pi_const = round(math.pi, 2) #округляСм pi Π΄ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π·Π½Π°ΠΊΠ° 
# послС запятой ΠΈΠ½Π°Ρ‡Π΅ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ 
# ΠΊΠ°ΠΊ 3.141592653589793 Π° Π½Π°ΠΌ это Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ

print((lambda radius: pi_const*(radius**2))(5))
print((lambda radius: pi_const*(radius**2))(12))
print((lambda radius: pi_const*(radius**2))(26))

>>>78.5
>>>452.16
>>>2122.64

Π§Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΎ понятнСС, Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π΅Ρ‘, Π½ΠΈΠ³Π΄Π΅ Π½Π΅ объявляя, ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅.

Лямбда функция Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ


print((lambda ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ‡Π΅Ρ€Π΅Π· Π·Π°ΠΏΡΡ‚ΡƒΡŽ : Ρ‡Ρ‚ΠΎ Ρ‚ΠΎ с Π½ΠΈΠΌΠΈ дСлаСтся)(ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹))

>>>ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ находится послС двоСточия строкой Π²Ρ‹ΡˆΠ΅

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с двумя Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ. НапримСр, Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ объСм конуса ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅:

V = (height*pi_const*(radius**2))/3

Π—Π°ΠΏΠΈΡˆΠ΅ΠΌ это всС Π² python:

import math #ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ math

pi_const = round(math.pi, 2) #округляСм pi Π΄ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π·Π½Π°ΠΊΠ° послС запятой ΠΈΠ½Π°Ρ‡Π΅ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ 3.141592653589793 Π° Π½Π°ΠΌ это Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ

#Π€ΠΎΡ€ΠΌΡƒΠ»Π° объСма конуса Π² классичСской Ρ„ΠΎΡ€ΠΌΠ΅ записи
def cone_volume(height, radius):
  volume = (height*pi_const*(radius**2))/3
  return volume

print(cone_volume(3, 10))

>>>314.0

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠ°ΠΊ это Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Π² lambda Ρ„ΠΎΡ€ΠΌΠ΅:

import math #ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ math

pi_const = round(math.pi, 2) #округляСм pi Π΄ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π·Π½Π°ΠΊΠ° послС запятой ΠΈΠ½Π°Ρ‡Π΅ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ 3.141592653589793 Π° Π½Π°ΠΌ это Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ

print((lambda height, radius : (height*pi_const*(radius**2))/3)(3, 10))

>>>314.0

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… здСсь Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ. Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° посчитаСм объСм усСчСнного конуса, Π³Π΄Π΅ Ρƒ нас ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ 3 Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

ОбъСм усСчСнного конуса считаСтся ΠΏΠΎ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅:

V = (pi_const*height*(r1**2 + r1*r2 + r2**2))/3

И Π²ΠΎΡ‚, ΠΊΠ°ΠΊ это Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Π² python классичСски:

import math #ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ math

pi_const = round(math.pi, 2) #округляСм pi Π΄ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π·Π½Π°ΠΊΠ° послС запятой ΠΈΠ½Π°Ρ‡Π΅ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ 3.141592653589793 Π° Π½Π°ΠΌ это Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ

#Π€ΠΎΡ€ΠΌΡƒΠ»Π° объСма усСчСнного конуса Π² классичСской записи
def cone_volume(h,r1,r2):
  return (pi_const * h * (r1 ** 2 + r1 * r2 + r2 ** 2))/3

print(cone_volume(12, 8, 5))
print(cone_volume(15, 10, 6))
print(cone_volume(20, 12, 9))

>>>1620.24
>>>3077.20
>>>6970.8

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ это Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ с lambda:

import math #ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ math

pi_const = round(math.pi, 2) #округляСм pi Π΄ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π·Π½Π°ΠΊΠ° послС запятой ΠΈΠ½Π°Ρ‡Π΅ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ 3.141592653589793 Π° Π½Π°ΠΌ это Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ

print((lambda height, radius1, radius2 : (height*pi_const*(radius1**2 + radius1*radius2 + radius2**2))/3)(12, 8, 5))
print((lambda height, radius1, radius2 : (height*pi_const*(radius1**2 + radius1*radius2 + radius2**2))/3)(15, 10, 6))
print((lambda height, radius1, radius2 : (height*pi_const*(radius1**2 + radius1*radius2 + radius2**2))/3)(20, 12, 9))

>>>1620.24
>>>3077.20
>>>6970.8

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ lambda функция, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ Π΅Ρ‰Ρ‘ ΠΊΠΎΠ΅-Ρ‡Ρ‚ΠΎ интСрСсноС, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ lambda Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ для вас вСсьма Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΌ β€” Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΡƒ.

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹Π΅ списки Π² python с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ lambda довольно Π³Π»ΡƒΠΏΠΎ β€” это Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ бряцаниС мускулами Ρ‚Π°ΠΌ, Π³Π΄Π΅ ΠΎΠ½ΠΎ совсСм Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ.

Ну ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎ допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ список (Π½Π΅ Π²Π°ΠΆΠ½ΠΎ состоящий ΠΈΠ· строк ΠΈΠ»ΠΈ чисСл) ΠΈ Π½Π°ΠΌ Π½Π°Π΄ΠΎ Π΅Π³ΠΎ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ β€” Ρ‚ΡƒΡ‚ ΠΆΠ΅ ΠΏΡ€ΠΎΡ‰Π΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sorted(). И Π² ΠΏΡ€Π°Π²Π΄Ρƒ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° это.

new_int_list = [43,23,56,75,12,32] # Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ список чисСл
print(sorted(new_int_list)) # Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ список чисСл
new_string_list = ['zum6z', 'yybt0', 'h2uwq', '2k9f9', 'hin9h', 'b0p0m'] # Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ список строк
print(sorted(new_string_list)) # Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ список строк

>>>[12, 23, 32, 43, 56, 75]
>>>['2k9f9', 'b0p0m', 'h2uwq', 'hin9h', 'yybt0', 'zum6z']

Π’ Ρ‚Π°ΠΊΠΈΡ… ситуациях, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ sorted() (Π½Ρƒ ΠΈΠ»ΠΈ sort(), Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ список Π½Π° мСстС Π±Π΅Π· создания Π½ΠΎΠ²ΠΎΠ³ΠΎ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² исходный).

Но Ρ‡Ρ‚ΠΎ, Ссли Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ список словарСй ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡Π°ΠΌ? Π’ΡƒΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ запись ΠΊΠ°ΠΊ Π² классичСском стилС, Ρ‚Π°ΠΊ ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ. Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ список ΠΊΠ½ΠΈΠ³ всСлСнной ПСсни Π›ΡŒΠ΄Π° ΠΈ ПламСни с Π΄Π°Ρ‚Π°ΠΌΠΈ ΠΈΡ… ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΉ ΠΈ количСством страниц Π² Π½ΠΈΡ….

Как всСгда, Π½Π°Ρ‡Π½Π΅ΠΌ с классичСской записи.

# Π‘ΠΎΠ·Π΄Π°Π»ΠΈ список ΠΈΠ· словарСй ΠΊΠ½ΠΈΠ³
asoiaf_books = [
  {'title' : 'Game of Thrones', 'published' : '1996-08-01', 'pages': 694},
  {'title' : 'Clash of Kings', 'published' : '1998-11-16', 'pages': 761},
  {'title' : 'Storm of Swords', 'published' : '2000-08-08', 'pages': 973},
  {'title' : 'Feast for Crows', 'published' : '2005-10-17', 'pages': 753},
  {'title' : 'Dance with Dragons', 'published' : '2011-07-12', 'pages': 1016}
]

# Ѐункция ΠΏΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡŽ названия ΠΊΠ½ΠΈΠ³ΠΈ
def get_title(book):
    return book.get('title')

# Ѐункция ΠΏΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡŽ Π΄Π°Ρ‚Ρ‹ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠ½ΠΈΠ³ΠΈ
def get_publish_date(book):
    return book.get('published')

# Ѐункция ΠΏΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡŽ количСства страниц Π² ΠΊΠ½ΠΈΠ³Π΅
def get_pages(book):
    return book.get('pages')

# Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎ названию
asoiaf_books.sort(key=get_title)
for book in asoiaf_books:
  print(book)
print('-------------')
# Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎ Π΄Π°Ρ‚Π°ΠΌ
asoiaf_books.sort(key=get_publish_date)
for book in asoiaf_books:
  print(book)
print('-------------')
# Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎ количСству страниц
asoiaf_books.sort(key=get_pages)
for book in asoiaf_books:
  print(book)

>>>{'title': 'Clash of Kings', 'published': '1998-11-16', 'pages': 761}
>>>{'title': 'Dance with Dragons', 'published': '2011-07-12', 'pages': 1016}
>>>{'title': 'Feast for Crows', 'published': '2005-10-17', 'pages': 753}
>>>{'title': 'Game of Thrones', 'published': '1996-08-01', 'pages': 694}
>>>{'title': 'Storm of Swords', 'published': '2000-08-08', 'pages': 973}
>>>-------------
>>>{'title': 'Game of Thrones', 'published': '1996-08-01', 'pages': 694}
>>>{'title': 'Clash of Kings', 'published': '1998-11-16', 'pages': 761}
>>>{'title': 'Storm of Swords', 'published': '2000-08-08', 'pages': 973}
>>>{'title': 'Feast for Crows', 'published': '2005-10-17', 'pages': 753}
>>>{'title': 'Dance with Dragons', 'published': '2011-07-12', 'pages': 1016}
>>>-------------
>>>{'title': 'Game of Thrones', 'published': '1996-08-01', 'pages': 694}
>>>{'title': 'Feast for Crows', 'published': '2005-10-17', 'pages': 753}
>>>{'title': 'Clash of Kings', 'published': '1998-11-16', 'pages': 761}
>>>{'title': 'Storm of Swords', 'published': '2000-08-08', 'pages': 973}
>>>{'title': 'Dance with Dragons', 'published': '2011-07-12', 'pages': 1016}

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ это всС Ρ‡Π΅Ρ€Π΅Π· lambda Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

# Π‘ΠΎΠ·Π΄Π°Π»ΠΈ список ΠΈΠ· словарСй ΠΊΠ½ΠΈΠ³
asoiaf_books = [
  {'title' : 'Game of Thrones', 'published' : '1996-08-01', 'pages': 694},
  {'title' : 'Clash of Kings', 'published' : '1998-11-16', 'pages': 761},
  {'title' : 'Storm of Swords', 'published' : '2000-08-08', 'pages': 973},
  {'title' : 'Feast for Crows', 'published' : '2005-10-17', 'pages': 753},
  {'title' : 'Dance with Dragons', 'published' : '2011-07-12', 'pages': 1016}
]

# Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎ названию
for book in sorted(asoiaf_books, key=lambda book: book.get('title')):
  print(book)

print('-------------')

# Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎ Π΄Π°Ρ‚Π°ΠΌ
for book in sorted(asoiaf_books, key=lambda book: book.get('published')):
  print(book)

print('-------------')

# Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎ количСству страниц
for book in sorted(asoiaf_books, key=lambda book: book.get('pages')):
  print(book)

>>>{'title': 'Clash of Kings', 'published': '1998-11-16', 'pages': 761}
>>>{'title': 'Dance with Dragons', 'published': '2011-07-12', 'pages': 1016}
>>>{'title': 'Feast for Crows', 'published': '2005-10-17', 'pages': 753}
>>>{'title': 'Game of Thrones', 'published': '1996-08-01', 'pages': 694}
>>>{'title': 'Storm of Swords', 'published': '2000-08-08', 'pages': 973}
>>>-------------
>>>{'title': 'Game of Thrones', 'published': '1996-08-01', 'pages': 694}
>>>{'title': 'Clash of Kings', 'published': '1998-11-16', 'pages': 761}
>>>{'title': 'Storm of Swords', 'published': '2000-08-08', 'pages': 973}
>>>{'title': 'Feast for Crows', 'published': '2005-10-17', 'pages': 753}
>>>{'title': 'Dance with Dragons', 'published': '2011-07-12', 'pages': 1016}
>>>-------------
>>>{'title': 'Game of Thrones', 'published': '1996-08-01', 'pages': 694}
>>>{'title': 'Feast for Crows', 'published': '2005-10-17', 'pages': 753}
>>>{'title': 'Clash of Kings', 'published': '1998-11-16', 'pages': 761}
>>>{'title': 'Storm of Swords', 'published': '2000-08-08', 'pages': 973}
>>>{'title': 'Dance with Dragons', 'published': '2011-07-12', 'pages': 1016}

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, lambda функция Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для сортировки ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹Ρ… списков ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ.

Если Π²Ρ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ вСсь этот ΠΊΠΎΠ΄ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, написав Π΅Π³ΠΎ сами, Ρ‚ΠΎ я ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ с этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π²Ρ‹ смоТСтС ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π½Ρ‹Π½Π΅ Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ lambda выраТСния, ΠΈ смоТСтС ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡ… Π² Ρ€Π°Π±ΠΎΡ‚Π΅.

Но Π³Π΄Π΅ ΠΆΠ΅ Ρ‚ΡƒΡ‚ Ρ‚Π° самая экономия мСста, Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ памяти? Экономится максимум ΠΏΠ°Ρ€Π° строк.

И Π²ΠΎΡ‚ Ρ‚ΡƒΡ‚ ΠΌΡ‹ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ интСрСсным Π²Π΅Ρ‰Π°ΠΌ.

ΠšΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅, Π³Π΄Π΅ ΠΌΡ‹ обсудим map Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

UPD: По многочислСнным ΠΏΡ€ΠΎΡΡŒΠ±Π°ΠΌ, расставил Π·Π½Π°ΠΊΠΈ прСпинания.

Python Lambda (анонимная) Ѐункция

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python?

Π’ Python анонимная функция — это функция, которая опрСдСляСтся Π±Π΅Π· ΠΈΠΌΠ΅Π½ΠΈ.

Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова def Π² Python, Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова lambda .

Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ лямбда-функциями.


Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python?

Лямбда-функция Π² Python ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ синтаксис.

Бинтаксис лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python

лямбда-Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹: Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 

Лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ любоС количСство Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ оцСниваСтся ΠΈ возвращаСтся. Лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.


ΠŸΡ€ΠΈΠΌΠ΅Ρ€ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² python

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая ΡƒΠ΄Π²Π°ΠΈΠ²Π°Π΅Ρ‚ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

  # ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° для дСмонстрации использования лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
double = лямбда x: x * 2

ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (двойная (5))  

Π’Ρ‹Ρ…ΠΎΠ΄

  10  

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ лямбда x: x * 2 — это лямбда-функция.Π—Π΄Π΅ΡΡŒ x — это Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Π° x * 2 — это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ вычисляСтся ΠΈ возвращаСтся.

Π£ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅Ρ‚ названия. Он Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ присвоСн ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ double . Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ это ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Выписка

двойной = лямбда x: x * 2 

ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ:

def double (x):
   Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ x * 2 

ИспользованиС лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python

ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½Π° бСзымянная функция Π½Π° ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Π’ Python ΠΌΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΅Π³ΠΎ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка (Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²). Лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ вмСстС со встроСнными функциями, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ filter () , map () ΠΈ Ρ‚. Π”.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования с filter ()

Ѐункция filter () Π² Python ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ список.

Ѐункция вызываСтся со всСми элСмСнтами Π² спискС, ΠΈ возвращаСтся Π½ΠΎΠ²Ρ‹ΠΉ список, содСрТащий элСмСнты, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… функция ΠΎΡ†Π΅Π½ΠΈΠ²Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True .

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ filter () для Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ‚Π½Ρ‹Ρ… чисСл ΠΈΠ· списка.

  # ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° для Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ‚Π½Ρ‹Ρ… элСмСнтов ΠΈΠ· списка
my_list = [1, 5, 4, 6, 8, 11, 3, 12]

new_list = список (Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ (лямбда x: (x% 2 == 0), my_list))

ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (Π½ΠΎΠ²Ρ‹ΠΉ_лист)  

Π’Ρ‹Ρ…ΠΎΠ΄

  [4, 6, 8, 12]  

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования с map ()

Ѐункция map () Π² Python ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ список.

Ѐункция вызываСтся со всСми элСмСнтами Π² спискС, ΠΈ возвращаСтся Π½ΠΎΠ²Ρ‹ΠΉ список, содСрТащий элСмСнты, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ map () для удвоСния всСх элСмСнтов Π² спискС.

  # ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° для удвоСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π² спискС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ map ()

my_list = [1, 5, 4, 6, 8, 11, 3, 12]

new_list = список (ΠΊΠ°Ρ€Ρ‚Π° (лямбда x: x * 2, my_list))

ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (Π½ΠΎΠ²Ρ‹ΠΉ_лист)  

Π’Ρ‹Ρ…ΠΎΠ΄

  [2, 10, 8, 12, 16, 22, 6, 24]  

Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Python.Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² лямбда-выраТСния | Π‘Π°Π΄Ρ€Π°Ρ… ΠŸΡŒΠ΅Ρ€, Π΄ΠΎΠΊΡ‚ΠΎΡ€ философии

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ — ваТная Ρ‡Π°ΡΡ‚ΡŒ программирования. Один ΠΈΠ· способов ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ — Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. НапримСр, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΎΡ†Π΅Π½ΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ слоТСниС, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π’ этом постС ΠΌΡ‹ обсудим, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ / встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

ΠŸΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΠΌ!

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρƒ нас Π΅ΡΡ‚ΡŒ однострочная функция, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ цСлочислСнными значСниями:

 def subtract (x, y): 
return x - y

Если ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с x = 10 ΠΈ y = 7 , ΠΈ распСчатав Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ:

 print ("Difference:", Π²Ρ‹Ρ‡Π΅ΡΡ‚ΡŒ (10, 7)) 

Π’Π°ΠΊ ΠΊΠ°ΠΊ это простая функция, которая Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ ΠΎΡ†Π΅Π½ΠΊΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ выраТСния «xy», ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΎ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ:

 subtract_value = lambda x, y: x - y 

Лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ содСрТит ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово Β«lambdaΒ», Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ x ΠΈ y, Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ.Если ΠΌΡ‹ вСрнСмся ΠΊ Π½Π°ΡˆΠ΅ΠΌΡƒ исходному ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

 def subtract (x, y): 
return x - y

ΠœΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ эти выраТСния выглядят ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ΅. Бамая большая Ρ€Π°Π·Π½ΠΈΡ†Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² отсутствии ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова def, return ΠΈ ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² нашСм лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с x = 10 ΠΈ y = 7 Π² качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…:

 print ("Difference:", subtract_value (10,7)) 

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ лямбда-выраТСния ΠΊ Π±ΠΎΠ»Π΅Π΅ интСрСсным опСрациям, Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ сортировка ΠΈ сокращСниС Π΄Π°Π½Π½Ρ‹Ρ…. .Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ список создатСлСй языков программирования:

 names = [ ' Guido van Rossum ',  'Bjarne Stroustrup', 'James Gosling', 'Rasmus Lerdorf'] 

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ‘sorted () ‘вмСстС с лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° списка Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΠΎΠΌ порядкС ΠΏΠΎ Ρ„Π°ΠΌΠΈΠ»ΠΈΠΈ:

 print (sorted (names, key = lambda name: name.split () [- 1] .lower ())) 

Π­Ρ‚ΠΎ Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ограничСния лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ†Π΅Π½ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ выраТСния, Ρ‚Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠ°ΠΊ итСрация, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΈ условныС выраТСния, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ нСльзя.НСсмотря Π½Π° это, лямбда-выраТСния ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ вмСсто однострочных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ†Π΅Π½ΠΈΠ²Π°ΡŽΡ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ выраТСния.

Π•Ρ‰Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… функциях. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ†Π΅Π»ΠΎΠ΅ число x = 5 ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая складываСт x ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число, y:

 x = 5 
add = lambda y: x + y

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с y = 24:

 print ("Addition:", add (24)) 

Если ΠΌΡ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ x Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ:

 x = 5 
add = lambda y: x + y
print ( Β«Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅:Β», Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ (24))
x = 10
print (Β«Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅:Β», Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ (24))

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ x, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, являСтся свободной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, связанной Π²ΠΎ врСмя выполнСния, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ x Ρ€Π°Π²Π½ΠΎ Ρ‡Ρ‚ΠΎ Π±Ρ‹ это Π½ΠΈ Π±Ρ‹Π»ΠΎ Π²ΠΎ врСмя выполнСния.Π§Ρ‚ΠΎΠ±Ρ‹ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ опрСдСлСния, Π² этом случаС Π·Π°Ρ…Π²Π°Ρ‚ x = 5, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ x ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:

 x = 5 
add = lambda y, x = x: x + y
print ( Β«Π‘Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅:Β», Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ (24))
x = 10
print (Β«Π‘Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅:Β», Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ (24))

ΠœΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. На этом я ΠΎΡΡ‚Π°Π½ΠΎΠ²Π»ΡŽΡΡŒ, Π½ΠΎ я ΠΏΡ€ΠΈΠ·Ρ‹Π²Π°ΡŽ вас ΠΏΠΎΠΈΠ³Ρ€Π°Ρ‚ΡŒ с ΠΊΠΎΠ΄ΠΎΠΌ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.

Подводя ΠΈΡ‚ΠΎΠ³, Π² этом постС ΠΌΡ‹ обсудили, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.Если Ρƒ вас Π΅ΡΡ‚ΡŒ сцСнарий Python, содСрТащий мноТСство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ†Π΅Π½ΠΈΠ²Π°ΡŽΡ‚ однострочныС выраТСния, часто ΠΏΡ€ΠΎΡ‰Π΅ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ лямбда-выраТСниями. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ обсудили, ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² нашСм лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ Π½Π°ΠΌ Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ опрСдСлСния. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎΠ± Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… функциях, я Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ The Python Cookbook . Π― надСюсь, Ρ‡Ρ‚ΠΎ Π²Ρ‹ нашли этот пост интСрСсным / ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ. Код Π² этом постС доступСн Π½Π° GitHub.Бпасибо Π·Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅!

Лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово def ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python, ΠΊΠ°ΠΊ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅. ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово lambda ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для опрСдСлСния Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Python.
ΠžΠ±Ρ‹Ρ‡Π½ΠΎ такая функция ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для ΠΎΠ΄Π½ΠΎΡ€Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ использования.

 лямбда [Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹]: Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅
 

Лямбда-функция ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ноль ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² послС символа : .ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ выполняСтся Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ послС : .

  ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ = лямбда x: x * x
  

Π’Ρ‹ΡˆΠ΅ лямбда-функция начинаСтся с ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова lambda , Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ x .
Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ x * x послС : Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ сторонС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ x * x .Вся лямбда-функция lambda x: x * x назначаСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ square , Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π΅ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.
Имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ становится ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π΅ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΡˆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

  def ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ (x):
    Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ x * x  

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ лямбда-функция Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚.

  >>> greet = lambda name: print ('ΠŸΡ€ΠΈΠ²Π΅Ρ‚', имя)
>>> ΠΏΡ€ΠΈΠ²Π΅Ρ‚ ('Π‘Ρ‚ΠΈΠ²')
ΠŸΡ€ΠΈΠ²Π΅Ρ‚ Π‘Ρ‚ΠΈΠ²
  

Лямбда-функция ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π² Ρ‚Π΅Π»Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ условныС выраТСния, Ρ†ΠΈΠΊΠ»Ρ‹ ΠΈ Ρ‚. Π”.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ лямбда-функция содСрТит нСсколько ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

  >>> сумма = лямбда x, y, z: x + y + z
>>> сумма (5, 10, 15)
30
  

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ лямбда-функция ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ любоС количСство ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

  >>> сумма = лямбда * x: x [0] + x [1] + x [2] + x [3]
>>> сумма (5, 10, 15, 20)
50
  

Лямбда-функция Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

  >>> greet = lambda: print ('ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€!')
>>> ΠΏΡ€ΠΈΠ²Π΅Ρ‚ ()
ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€!
  

Анонимная функция

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΅Π΅ ΠΊΠ°ΠΊ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π½Π΅ присваивая Π΅Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

  >>> (лямбда x: x * x) (5)
25
  

Π’Ρ‹ΡˆΠ΅ лямбда x: x * x опрСдСляСт Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΅Π΅ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² скобках (лямбда x: x * x) (5) .

Π’ Python Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ пСрвоклассными Π³Ρ€Π°ΠΆΠ΄Π°Π½Π°ΠΌΠΈ, Π° это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ, ΠΊΠ°ΠΊ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹.

Лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² качСствС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π½Π΅ присваивая Π΅Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΊΠ°ΠΊ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

  >>> def dosomething (fn):
print ('АргумСнт Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:')
fn ()
>>> dosomething (lambda: print ('Hello World')) # ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
АргумСнт Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:
ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€
>>> myfn = lambda: print ('ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€')
>>> dosomething (myfn) # ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
  

Π’Ρ‹ΡˆΠ΅ функция dosomething () опрСдСляСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ fn , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вызываСтся ΠΊΠ°ΠΊ функция Π²Π½ΡƒΡ‚Ρ€ΠΈ dosomething () . dosomething (lambda: print ('Hello World')) Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ dosomething () с Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.

Python ΠΈΠΌΠ΅Π΅Ρ‚ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ map (), filter () ΠΈ reduce () ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π²Π°ΠΆΠ½Ρ‹ΠΌΠΈ инструмСнтами Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования. ВсС ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Ѐункция Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΈΠ»ΠΈ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ.

  >>> sqrList = map (lambda x: x * x, [1, 2, 3, 4]) # ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
>>> ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ (sqrList)
1
>>> ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ (sqrList)
4
>>> ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ (sqrList)
9
>>> ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ (sqrList)
16
>>> ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ (sqrList)
25
  

лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Python: руководство для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…!

Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ Π±Ρ‹Π»Π° ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π° Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Data Science Blogathon

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ ΠΎΠ± Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… функциях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π°ΠΊΠΆΠ΅ извСстны ΠΊΠ°ΠΊ Лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ .Π’Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅, ΠΈΡ… синтаксис ΠΈ способы ΠΈΡ… использования (с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ). Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ обсудим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Π΅ΠΌΡ‹:

  • Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ ΠΈΠ»ΠΈ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python?
  • Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python?
  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Python
  • ИспользованиС лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Python
  • Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ?
  • Когда Π½Π΅ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ?
  • Лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² map (), filter () ΠΈ reduce ()

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ изобраТСния: Google Images

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python?

Π’ Python анонимная функция ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π±Π΅Π· Ρ€Π΅ΠΏΡƒΡ‚Π°Ρ†ΠΈΠΈ.

ΠŸΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово def Π² Python, Π½ΠΎ ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово lambda.

Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ .

Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python?

Лямбда-функция Π² Python ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ синтаксис.

Бинтаксис лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python:

 лямбда-Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹: Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ любоС количСство Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ вычисляСтся, Π° Π·Π°Ρ‚Π΅ΠΌ возвращаСтся. ΠœΡ‹ использовали лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая ΡƒΠ΄Π²Π°ΠΈΠ²Π°Π΅Ρ‚ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅Ρ‚ Π½Π° Π΄Π²Π°) Π²Ρ…ΠΎΠ΄Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° для ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ†ΠΈΠΈ использования лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

 double = лямбда x: x * 2
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (двойная (10)) 

Π’Ρ‹Ρ…ΠΎΠ΄:

 20 

ПояснСниС кода:

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄Π΅ лямбда x: x * 2 — это лямбда-функция.ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΈΡ… x являСтся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ, Π° x * 2 — Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ оцСниваСтся ΠΈ возвращаСтся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ.

Π£ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅Ρ‚ названия. Он Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ double. Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π½Π°Π·ΠΎΠ²Π΅ΠΌ это стандартной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ. Выписка

 двойной = лямбда x: x * 2 

ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½:

 def double (x):
Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ x * 2 

ИспользованиС лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Python

ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ трСбуСтся бСзымянная функция Π½Π° ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ вашСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Π’ Python ΠΌΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка (Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²).

НапримСр, Π­Ρ‚ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ вмСстС со встроСнными функциями, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ filter (), map (), ΠΈ reduce () ΠΈ Ρ‚. Π”., ΠšΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ обсудим ΠΏΠΎΠ·ΠΆΠ΅ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅.

Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ?

Как Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅, лямбда-выраТСния ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ функциям Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°.Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ смыслС ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ лямбда-выраТСния ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΉ синтаксис для написания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΡ… ΠΎΠ΄Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

Однако Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лямбды, Π° ΠΊΠΎΠ³Π΄Π° ΠΈΡ… слСдуСт ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ. Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ… внСшнСго Π²ΠΈΠ΄Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ Python ΠΏΡ€ΠΈ написании лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

Один ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнных Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² использования лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ — это Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Python ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡƒ (ΠΈΠ»ΠΈ ΡΡ‚ΠΈΠ»ΡŒ) программирования, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ.

Он позволяСт Π²Π°ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠ°Ρ€Ρ‚Π΅, Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π΅ ΠΈ Ρ‚. Π”.). Π’ Ρ‚Π°ΠΊΠΈΡ… случаях использованиС лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π΄Π°Π΅Ρ‚ прСвосходныС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ благодаря созданию ΠΎΠ΄Π½ΠΎΡ€Π°Π·ΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π΅Π΅ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°.

Когда Π½Π΅ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ?

Π’ производствСнной срСдС Π²Π°ΠΌ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ слСдуСт ΠΏΠΈΡΠ°Ρ‚ΡŒ слоТныС лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ°ΠΌ, ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌ ваш ΠΊΠΎΠ΄, Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ слоТно Π΅Π³ΠΎ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Ρ‚ΡŒ. Если Π²Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ создаСтС слоТныС однострочныС выраТСния, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π»ΡƒΡ‡ΡˆΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ простой ΠΊΠΎΠ΄ часто Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ слоТный.

Лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π΅ ()

Ѐункция Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Ρ‹Π±ΠΎΡ€Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… элСмСнтов ΠΈΠ· ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ элСмСнтов. ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ Π² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, являСтся ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ списками, Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ, ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°ΠΌΠΈ ΠΈ Ρ‚. Π”.

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Π½Ρ‹, основаны Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΈ. ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ 2 ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

  • Ѐункция, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π°Ρ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ.
  • ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ (любой ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ списки, ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ ΠΈ Ρ‚. Π”.)

НапримСр,

 ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ = [10,2,8,7,5,4,3,11,0, 1]
filter_answer = filter (лямбда x: x> 6, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ)
print (список (filter_answer)) 

Π’Ρ‹Ρ…ΠΎΠ΄:

 [10, 8, 7, 11] 

ПояснСниС кода:

  • Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ ΠΌΡ‹ опрСдСляСм ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ списка, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ числа.
  • Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ объявляСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ с ΠΈΠΌΠ΅Π½Π΅ΠΌ filter_answer, которая ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ значСния, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ filter ().
  • Лямбда-функция, которая запускаСтся для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта списка ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ истину, Ссли ΠΎΠ½ большС 6.
  • ВывСсти Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°.

Лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΊΠ°Ρ€Ρ‚Π΅ ()

Ѐункция ΠΊΠ°Ρ€Ρ‚Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для использования ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Как ΠΈ filter (), ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ 2 ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

  • Ѐункция, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π°Ρ порядок выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ элСмСнтами.
  • Одна ΠΈΠ»ΠΈ нСсколько ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ.

НапримСр,

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Ρ‹ чисСл Π² Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌ спискС:

 ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ = [10,2,8,7,5,4,11]
squared_result = map (лямбда x: x * x, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ)
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (список (ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚_Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚)) 

Π’Ρ‹Ρ…ΠΎΠ΄:

 [100, 4, 64, 49, 25, 16, 121] 

ПояснСниС кода:

  • Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ опрСдСляСм список, содСрТащий ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠΌΠ΅Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ числа.
  • ΠœΡ‹ объявляСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ с ΠΈΠΌΠ΅Π½Π΅ΠΌ squared_result, которая ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½Ρ‹Π΅ значСния.
  • Лямбда-функция запускаСтся для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта списка ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ этого числа.
  • РаспСчатайтС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΊΠ°Ρ€Ρ‚Ρ‹.

Лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² reduce ()

Ѐункция сокращСния, такая ΠΊΠ°ΠΊ map (), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для использования ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ элСмСнтом Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Однако Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ отличаСтся ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°Ρ€Ρ‚Ρ‹.Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ reduce () для вычислСния Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…:

Π¨Π°Π³-1: Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ двумя основными элСмСнтами ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Π¨Π°Π³ 2: Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

Π¨Π°Π³-3: Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ с сохранСнным Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ элСмСнтом Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Π¨Π°Π³ 4: ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΠΉΡ‚Π΅, ΠΏΠΎΠΊΠ° Π½Π΅ останутся всС элСмСнты.

Π’Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

  • Ѐункция, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π°Ρ порядок выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ
  • ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ (любой ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ списки, ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ ΠΈ Ρ‚. Π”.)

НапримСр,

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создадим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ всСх элСмСнтов, прСдставлСнных Π² спискС, Π·Π°Π΄Π°Π½Π½ΠΎΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ.

 ΠΈΠ· functools import reduce
ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ = [1,2,3,4,5,6]
product = reduce (лямбда x, y: x * y, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ)
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚) 

Π’Ρ‹Ρ…ΠΎΠ΄:

 720 

ПояснСниС кода:

  • Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ сокращСниС ΠΈΠ· модуля functools.
  • Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ опрСдСляСм ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ списка с ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ числа.
  • ΠœΡ‹ объявляСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ с ΠΈΠΌΠ΅Π½Π΅ΠΌ product, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.
  • Лямбда-функция пошагово запускаСтся для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта списка ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ этого числа согласно ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ.
  • ВывСсти Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ.

На этом нашС обсуТдСниС заканчиваСтся!

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ

НадСюсь, Π²Π°ΠΌ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΠ»Π°ΡΡŒ ΡΡ‚Π°Ρ‚ΡŒΡ.

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠ²ΡΠ·Π°Ρ‚ΡŒΡΡ со ΠΌΠ½ΠΎΠΉ, поТалуйста, ΡΠ²ΡΠΆΠΈΡ‚Π΅ΡΡŒ со ΠΌΠ½ΠΎΠΉ Π½Π° ЭлСктронная ΠΏΠΎΡ‡Ρ‚Π°

Π’Π°ΡˆΠΈ прСдлоТСния ΠΈ сомнСния ΠΏΡ€ΠΈΠ²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ΡΡ здСсь, Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π². Бпасибо, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ мою ΡΡ‚Π°Ρ‚ΡŒΡŽ!

НоситСли, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅, Π½Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ Analytics Vidhya ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΠΎ ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ Π°Π²Ρ‚ΠΎΡ€Π°.

Python Лямбда


Лямбда-функция — это нСбольшая анонимная функция.

Лямбда-функция ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ любоС количСство Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.


Бинтаксис

лямбда Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ : Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ выполняСтся ΠΈ возвращаСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ 10 ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ a , ΠΈ
Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

x = лямбда a: a + 10
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (x (5))

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉ сам »

Лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ любоС количСство Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π£ΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π½Π° Π½Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚
b ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ
Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

x = лямбда a, b: a * b
print (x (5, 6))

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉ сам »

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π‘ΡƒΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ a ,
b ΠΈ c ΠΈ
Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ
Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

x = лямбда a, b, c: a + b + c
print (x (5, 6,
2))

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉ сам »



Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ?

Π‘ΠΈΠ»Π° лямбда Π»ΡƒΡ‡ΡˆΠ΅ проявляСтся, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΈΡ… ΠΊΠ°ΠΊ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅.
функция Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Допустим, Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΈ этот Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚
Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΎ Π½Π° нСизвСстноС число:

def myfunc (n):
Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ лямбда a: a * n

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ это ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая всСгда ΡƒΠ΄Π²Π°ΠΈΠ²Π°Π΅Ρ‚
Π½ΠΎΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ отправляСтС:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ myfunc (n):
Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ лямбда a: a * n

mydoubler = myfunc (2)

print (mydoubler (11))

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉ сам »

Или ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ‚ΠΎ ΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая всСгда ΡƒΡ‚Ρ€Π°ΠΈΠ²Π°Π΅Ρ‚
Π½ΠΎΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ отправляСтС:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ myfunc (n):
Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ лямбда a: a * n

mytripler = myfunc (3)

print (mytripler (11))

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉ сам »

Или ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ±Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ
ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ myfunc (n):
Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ лямбда a: a * n

mydoubler = myfunc (2)
mytripler = myfunc (3)

print (mydoubler (11))

ΠΏΡ€ΠΈΠ½Ρ‚ (mytripler (11))

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉ сам »

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° анонимная функция трСбуСтся Π½Π° ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.



Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Python — настоящий Python

Π’ синтаксис Python ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… языков, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Java, C # ΠΈ Π΄Π°ΠΆΠ΅ C ++, Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² Ρ‚Π°ΠΊΠΈΡ… языках, ΠΊΠ°ΠΊ LISP ΠΈΠ»ΠΈ сСмСйство языков ML, Haskell, OCaml ΠΈ F #, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ лямбды ΠΊΠ°ΠΊ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ.

Лямбда-выраТСния Python — это нСбольшиС Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ строгий, Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ сТатый синтаксис, Ρ‡Π΅ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Python.

Π­Ρ‚ΠΎ руководство ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΎ Π² основном для ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Ρ… программистов Π½Π° Python, Π½ΠΎ ΠΎΠ½ΠΎ доступно для всСх Π»ΡŽΠ±ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Ρ… людСй, ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ лямбда-исчислСниСм.

ВсС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ Π² это руководство, Π±Ρ‹Π»ΠΈ протСстированы с Python 3.7.

Лямбда-исчислСниС

Лямбда-выраТСния Π² Python ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования Π±Π΅Ρ€ΡƒΡ‚ своС Π½Π°Ρ‡Π°Π»ΠΎ Π² лямбда-исчислСнии, ΠΌΠΎΠ΄Π΅Π»ΠΈ вычислСний, ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π΅Π½Π½ΠΎΠΉ Алонзо Π§Π΅Ρ€Ρ‡Π΅ΠΌ. Π’Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, ΠΊΠΎΠ³Π΄Π° Π±Ρ‹Π»ΠΎ Π²Π²Π΅Π΄Π΅Π½ΠΎ лямбда-исчислСниС ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ это Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ концСпция, которая вошла Π² экосистСму Python.

Π˜ΡΡ‚ΠΎΡ€ΠΈΡ

Алонзо Π§Π΅Ρ€Ρ‡ Ρ„ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π» лямбда-исчислСниС, язык, основанный Π½Π° чистой абстракции, Π² 1930-Ρ… Π³ΠΎΠ΄Π°Ρ….Лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ лямбда-абстракциями, Ρ‡Ρ‚ΠΎ являСтся прямой ссылкой Π½Π° модСль абстракции ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ творСния Алонзо Π§Ρ‘Ρ€Ρ‡Π°.

Лямбда-исчислСниС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ вычислСния. Он являСтся ΠΏΠΎΠ»Π½Ρ‹ΠΌ ΠΏΠΎ Π’ΡŒΡŽΡ€ΠΈΠ½Π³Ρƒ, Π½ΠΎ, Π²ΠΎΠΏΡ€Π΅ΠΊΠΈ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π’ΡŒΡŽΡ€ΠΈΠ½Π³Π°, ΠΎΠ½ чист ΠΈ Π½Π΅ сохраняСт Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ состояния.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ языки Π±Π΅Ρ€ΡƒΡ‚ своС Π½Π°Ρ‡Π°Π»ΠΎ Π² матСматичСской Π»ΠΎΠ³ΠΈΠΊΠ΅ ΠΈ лямбда-исчислСнии, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ языки программирования ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π½Π° состоянии модСль вычислСний, ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π΅Π½Π½ΡƒΡŽ Аланом Π’ΡŒΡŽΡ€ΠΈΠ½Π³ΠΎΠΌ.Π”Π²Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ вычислСний, лямбда-исчислСниС ΠΈ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π’ΡŒΡŽΡ€ΠΈΠ½Π³Π°, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Ρ‹ Π΄Ρ€ΡƒΠ³ Π² Π΄Ρ€ΡƒΠ³Π°. Π­Ρ‚Π° ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ извСстна ΠΊΠ°ΠΊ Π³ΠΈΠΏΠΎΡ‚Π΅Π·Π° Π§Π΅Ρ€Ρ‡Π°-Π’ΡŒΡŽΡ€ΠΈΠ½Π³Π°.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ языки Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Ρ„ΠΈΠ»ΠΎΡΠΎΡ„ΠΈΡŽ лямбда-исчислСния, примСняя Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π΅Ρ‚ Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡŽ, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΈ чистоту (отсутствиС состояния ΠΈ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов). ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… языков Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Haskell, Lisp ΠΈΠ»ΠΈ Erlang.

Напротив, машина Π’ΡŒΡŽΡ€ΠΈΠ½Π³Π° ΠΏΡ€ΠΈΠ²Π΅Π»Π° ΠΊ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Π½Π° Ρ‚Π°ΠΊΠΈΡ… языках, ΠΊΠ°ΠΊ Fortran, C ΠΈΠ»ΠΈ Python.

Π˜ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΡΡ‚ΠΈΠ»ΡŒ состоит ΠΈΠ· программирования с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², шаг Π·Π° шагом ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΌΠΈ инструкциями. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ способствуСт ΠΌΡƒΡ‚Π°Ρ†ΠΈΠΈ ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ управлСния состояниСм.

Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π² ΠΎΠ±ΠΎΠΈΡ… сСмСйствах ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡŽΠ°Π½ΡΡ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ языки Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ OCaml, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности ΠΏΡ€ΠΎΠ½ΠΈΠΊΠ»ΠΈ Π² ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ сСмСйство языков, Π² частности, с Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Java ΠΈΠ»ΠΈ Python.

Python ΠΏΠΎ своСй сути Π½Π΅ являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ языком, Π½ΠΎ ΠΎΠ½ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ принял Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ. Π’ январС 1994 Π³ΠΎΠ΄Π° Π² язык Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ map () , filter () , reduce () ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ лямбда .

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Π’ΠΎΡ‚ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Ρ‚ΡŒ Π²Π°ΠΌ Π°ΠΏΠΏΠ΅Ρ‚ΠΈΡ‚ ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ Python, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΡΡ‚ΠΈΠ»ΡŽ.

Ѐункция ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, функция, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ свой Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, выраТаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ стандартного опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Python с использованиСм ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова def ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

>>>

  >>> def identity (x):
... Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ x
  

identity () ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ x ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅.

Напротив, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ лямбда-ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Python, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ состоит ΠΈΠ·:

  • ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово: лямбда
  • Бвязанная пСрСмСнная: x
  • ΠšΡƒΠ·ΠΎΠ²: x

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ : Π’ контСкстС этой ΡΡ‚Π°Ρ‚ΡŒΠΈ связанная пСрСмСнная являСтся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Напротив, свободная пСрСмСнная Π½Π΅ связана ΠΈ Π½Π° Π½Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π² Ρ‚Π΅Π»Π΅ выраТСния. Бвободная пСрСмСнная ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ константой ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π²ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΉ области Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ слоТный ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая добавляСт 1 ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Π²Ρ‹ΡˆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ, Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ Π΅Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки:

>>>

  >>> (лямбда x: x + 1) (2)
3
  

РСдукция — это стратСгия лямбда-исчислСния для вычислСния значСния выраТСния.Π’ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠ½ состоит ΠΈΠ· Π·Π°ΠΌΠ΅Π½Ρ‹ связанной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ x Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ 2 :

.

  (лямбда x: x + 1) (2) = лямбда 2: 2 + 1
                     = 2 + 1
                     = 3
  

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ лямбда-функция являСтся Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Ρ‚ΡŒ имя. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

>>>

  >>> add_one = лямбда x: x + 1
>>> add_one (2)
3
  

Π’Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Π°Ρ лямбда-функция эквивалСнтна записи:

  def add_one (x):
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ x + 1
  

ВсС эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚.Π’Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ лямбд Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π½Π΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ с нСсколькими Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ (Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°) Π²Ρ‹Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π² лямбдах Python ΠΏΡƒΡ‚Π΅ΠΌ пСрСчислСния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ раздСлСния ΠΈΡ… запятой (, ), Π½ΠΎ Π±Π΅Π· Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки:

>>>

  >>> full_name = lambda first, last: f'ПолноС имя: {first.title ()} {last.title ()} '
>>> ΠΏΠΎΠ»Π½ΠΎΠ΅_имя ('Π³ΠΈΠ΄ΠΎ', 'Π²Π°Π½ россум')
'ПолноС имя: Π“Π²ΠΈΠ΄ΠΎ Π’Π°Π½ Россум'
  

Лямбда-функция, назначСнная для full_name , ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° : ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈ послСдний .Как ΠΈ оТидалось, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ лямбда пСрСчисляСт Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π±Π΅Π· ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ выполняСтся Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ обычная функция Python, с ΠΊΡ€ΡƒΠ³Π»Ρ‹ΠΌΠΈ скобками Π²ΠΎΠΊΡ€ΡƒΠ³ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

АнонимныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ взаимозамСняСмо Π² зависимости ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° языка программирования ΠΈ ΠΊΡƒΠ»ΡŒΡ‚ΡƒΡ€Ρ‹:

  • АнонимныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
  • Лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
  • Лямбда-выраТСния
  • Лямбда-абстракции
  • Лямбда-Ρ„ΠΎΡ€ΠΌΠ°
  • Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹

Π’ ΠΎΡΡ‚Π°Π²ΡˆΠ΅ΠΉΡΡ части ΡΡ‚Π°Ρ‚ΡŒΠΈ послС этого Ρ€Π°Π·Π΄Π΅Π»Π° Π²Ρ‹ Π² основном Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒΡΡ с Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠΌ лямбда-функция .

Π’ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎΠΌ смыслС анонимная функция — это функция Π±Π΅Π· ΠΈΠΌΠ΅Π½ΠΈ. Π’ Python анонимная функция создаСтся с ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом lambda . Говоря Π±ΠΎΠ»Π΅Π΅ свободно, Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ присвоСно ΠΈΠ»ΠΈ Π½Π΅Ρ‚ имя. Рассмотрим Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с двумя Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ лямбда , Π½ΠΎ Π½Π΅ ΡΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ЛямбдС Π½Π΅ присвоСно имя:

>>>

  >>> лямбда x, y: x + y
  

Π’Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Π°Ρ функция опрСдСляСт лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ… сумму.

Помимо прСдоставлСния Π²Π°ΠΌ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ связи ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Python ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ справляСтся с этой Ρ„ΠΎΡ€ΠΌΠΎΠΉ, ΠΎΠ½Π° Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ-Π»ΠΈΠ±ΠΎ практичСскому использованию. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π΅ Python:

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, прСдоставляСмая Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π½ΠΈΠ΅ ( _ ). Π‘ΠΌ. ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ Π½ΠΈΠΆΠ΅ для получСния Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Python. Π‘Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ _ Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π΅ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌ эффСктом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π²Ρ‹ воспользовались.Π’ ΠΌΠΎΠ΄ΡƒΠ»Π΅ Python Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ лямбда имя ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ лямбда Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ПозТС Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π²Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ этими двумя ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°ΠΌΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ : Π’ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π΅ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ΅ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π½ΠΈΠ΅ ( _ ) привязано ΠΊ послСднСму вычислСнному Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ _ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния ΠΎΠ± использовании этого ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ символа Π² Python см. Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Β«Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ подчСркивания Π² PythonΒ».

Π”Ρ€ΡƒΠ³ΠΎΠΉ шаблон, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ JavaScript, — это Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Python. Π­Ρ‚ΠΎ называСтся Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (IIFE, произносится ΠΊΠ°ΠΊ Β«iffyΒ»). Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

>>>

  >>> (лямбда x, y: x + y) (2, 3)
5
  

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π²Ρ‹ΡˆΠ΅ лямбда-функция опрСдСляСтся ΠΈ Π·Π°Ρ‚Π΅ΠΌ сразу вызываСтся с двумя Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ( 2 ΠΈ 3 ). Он Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 5 , ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся суммой Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

Π’ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π² этом руководствС этот Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ аспСкт лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ сосрСдоточСния внимания Π½Π° лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π² Python ΠΊΠ°ΠΊ Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΌ способС опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Python Π½Π΅ поощряСт использованиС Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Он просто являСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ лямбда-выраТСния, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ‚Π΅Π»Π° Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ с функциями Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΎΠ΄Π½Ρƒ ΠΈΠ»ΠΈ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΎΠ΄Π½Ρƒ ΠΈΠ»ΠΈ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Лямбда-функция ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка, принимая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ»ΠΈ лямбда) Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΊΠ°ΠΊ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π½Π°Π΄ΡƒΠΌΠ°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

>>>

  >>> high_ord_func = лямбда x, func: x + func (x)
>>> high_ord_func (2, лямбда x: x * x)
6
>>> high_ord_func (2, лямбда x: x + 3)
7
  

Python прСдоставляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка ΠΊΠ°ΠΊ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ map () , filter () , functools.reduce () , Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ sort () , sorted () , min () ΠΈ max () . Π’Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ вмСстС с функциями Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка Python Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ использованиС лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉΒ».

Лямбда-выраТСния Python ΠΈ рСгулярныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π­Ρ‚Π° Ρ†ΠΈΡ‚Π°Ρ‚Π° ΠΈΠ· FAQ ΠΏΠΎ Π΄ΠΈΠ·Π°ΠΉΠ½Ρƒ ΠΈ истории Python, каТСтся, Π·Π°Π΄Π°Π΅Ρ‚ Ρ‚ΠΎΠ½ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ ΠΎΠ±Ρ‰ΠΈΡ… ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΉ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ использования лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Python:

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ лямбда-Ρ„ΠΎΡ€ΠΌ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… языках, Π³Π΄Π΅ ΠΎΠ½ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, лямбда-выраТСния Python ΡΠ²Π»ΡΡŽΡ‚ΡΡ лишь сокращСнной записью, Ссли Π²Π°ΠΌ лСнь ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.(Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ)

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π½Π΅ позволяйтС этому ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΡŽ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ вас ΠΎΡ‚ использования лямбда Python . На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ³Π»Π°ΡΠΈΡ‚ΡŒΡΡ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ лямбда-функция - это функция с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ синтаксичСским сахаром, ΡΠΎΠΊΡ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ для опрСдСлСния ΠΈΠ»ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΎΠ±Ρ‰ΠΈΠ΅ Ρ‡Π΅Ρ€Ρ‚Ρ‹ ΠΈ Ρ‚ΠΎΠ½ΠΊΠΈΠ΅ различия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ функциями Python ΠΈ лямбда-функциями.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π—Π΄Π΅ΡΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π΄Π°Ρ‚ΡŒΡΡ вопросом, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°Π΅Ρ‚ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΏΡ€ΠΈΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΎΠ΄Π½ΠΎΠΉ строкой return : ΠΏΠΎΠ΄ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ.Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ Python Π²ΠΈΠ΄ΠΈΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° return, ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, построСнной ΠΊΠ°ΠΊ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ( лямбда ).

ΠœΠΎΠ΄ΡƒΠ»ΡŒ dis прСдоставляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Π°Π½Π°Π»ΠΈΠ·Π° Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Python, сгСнСрированного компилятором Python:

>>>

  >>> ΠΈΠΌΠΏΠΎΡ€Ρ‚
>>> add = лямбда x, y: x + y
>>> Π²Π²Π΅Π΄ΠΈΡ‚Π΅ (Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ)
<класс 'функция'>
>>> dis.dis (Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ)
  1 0 LOAD_FAST 0 (x)
              2 LOAD_FAST 1 (Π³)
              4 BINARY_ADD
              6 RETURN_VALUE
>>> Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ
<функция <лямбда> Π² 0x7f30c6ce9ea0>
  

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ dis () прСдоставляСт Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ для чтСния Π²Π΅Ρ€ΡΠΈΡŽ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Python, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ инструкции, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ посмотрим Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚:

>>>

  >>> ΠΈΠΌΠΏΠΎΡ€Ρ‚
>>> def add (x, y): Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ x + y
>>> Π²Π²Π΅Π΄ΠΈΡ‚Π΅ (Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ)
<класс 'функция'>
>>> dis.dis (Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ)
  1 0 LOAD_FAST 0 (x)
              2 LOAD_FAST 1 (Π³)
              4 BINARY_ADD
              6 RETURN_VALUE
>>> Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ
<функция Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² 0x7f30c6ce9f28>
  

Π‘Π°ΠΉΡ‚-ΠΊΠΎΠ΄, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Python, ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ² для ΠΎΠ±Π΅ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.Но Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅: имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ - , Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ с def , Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ лямбда-функция Python отобраТаСтся ΠΊΠ°ΠΊ лямбда .

ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ Π² контСкстС лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Python Π½Π΅ прСдоставил имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ . Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ слСдуСт ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΈ ΠΏΡ€ΠΈ трассировкС отобраТаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ <лямбда> :

.
>>>

  >>> div_zero = лямбда x: x / 0
>>> div_zero (2)
ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ (послСдний Π²Ρ‹Π·ΠΎΠ² послСдний):
    Π€Π°ΠΉΠ» "", строка 1, Π² 
    Π€Π°ΠΉΠ» "", строка 1, Π² 
ZeroDivisionError: дСлСниС на ноль
  

ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, возникшСго Π²ΠΎ врСмя выполнСния лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΠΊΠ°ΠΊ <лямбда> .

Π’ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ:

>>>

  >>> def div_zero (x): Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ x / 0
>>> div_zero (2)
ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ (послСдний Π²Ρ‹Π·ΠΎΠ² послСдний):
    Π€Π°ΠΉΠ» "", строка 1, Π² 
    Π€Π°ΠΉΠ» "", строка 1, Π² div_zero
ZeroDivisionError: дСлСниС на ноль
  

ΠžΠ±Ρ‹Ρ‡Π½Π°Ρ функция Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π½ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎΠΉ трассировкС, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° Π΄Π°Π΅Ρ‚ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ div_zero .

Бинтаксис

Как Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ…, лямбда-Ρ„ΠΎΡ€ΠΌΠ° прСдставляСт синтаксичСскиС отличия ΠΎΡ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ частности, лямбда-функция ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ характСристики:

  • Он ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ выраТСния ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² сСбя ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹.
  • ЗаписываСтся ΠΊΠ°ΠΊ ΠΎΠ΄Π½Π° строка исполнСния.
  • Он Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ².
  • ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ (IIFE).

НСт выписки

Лямбда-функция Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ².SyntaxError: нСдопустимый синтаксис

Π­Ρ‚ΠΎΡ‚ Π½Π°Π΄ΡƒΠΌΠ°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для утвСрТдСния , Ρ‡Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ x ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 2 . Но ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ SyntaxError ΠΏΡ€ΠΈ синтаксичСском Π°Π½Π°Π»ΠΈΠ·Π΅ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ assert Π² Ρ‚Π΅Π»Π΅ лямбда .

Одно Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ лямбда-функция Python прСдставляСт собой ΠΎΠ΄Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Π₯отя Π² Ρ‚Π΅Π»Π΅ лямбда Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ нСскольким строкам, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки ΠΈΠ»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡΡ‚Ρ€ΠΎΡ‡Π½ΡƒΡŽ строку, ΠΎΠ½ΠΎ остаСтся ΠΎΠ΄Π½ΠΈΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ:

>>>

  >>> (лямбда x:
... (x% 2 ΠΈ Β«Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎΠ΅Β» ΠΈΠ»ΠΈ Β«Ρ‡Π΅Ρ‚Π½ΠΎΠ΅Β»)) (3)
'странный'
  

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ возвращаСтся строка Β«Π½Π΅Ρ‡Π΅Ρ‚Π½Ρ‹ΠΉΒ», , Ссли лямбда-Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π½Π΅Ρ‡Π΅Ρ‚Π½Ρ‹ΠΉ, ΠΈ Β«Ρ‡Π΅Ρ‚Π½Ρ‹ΠΉΒ», , Ссли Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‡Π΅Ρ‚Π½Ρ‹ΠΉ. Он Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π΅ строки, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки, Π½ΠΎ остаСтся ΠΎΠ΄Π½ΠΈΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ.

ΠžΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΡ Ρ‚ΠΈΠΏΠ°

Если Π²Ρ‹ Π½Π°Ρ‡Π°Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ подсказки Ρ‚ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ доступны Π² Python, Ρƒ вас Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° вСская ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π΅ΡΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ лямбда-функциям Python.ΠžΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ Ρ‚ΠΈΠΏΠΎΠ² Python (Руководство), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ подсказках Ρ‚ΠΈΠΏΠΎΠ² Python ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ Ρ‚ΠΈΠΏΠΎΠ². Π’ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅Ρ‚ эквивалСнта для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ:

  def full_name (first: str, last: str) -> str:
    return f '{first.title ()} {last.title ()}'
  

Ошибка любого Ρ‚ΠΈΠΏΠ° с full_name () ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π° Ρ‚Π°ΠΊΠΈΠΌΠΈ инструмСнтами, ΠΊΠ°ΠΊ mypy ΠΈΠ»ΠΈ pyre , Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ SyntaxError с эквивалСнтной лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π²ΠΎ врСмя выполнСния:

>>>

  >>> lambda first: str, last: str: first.title () + "" + last.title () -> str
  Π€Π°ΠΉΠ» "", строка 1
    лямбда сначала: str, last: str: first.title () + "" + last.title () -> str

SyntaxError: нСдопустимый синтаксис
  

Подобно ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π² лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ° Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ SyntaxError Π²ΠΎ врСмя выполнСния.

IIFE

Π’Ρ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² выполнСния Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

>>>

  >>> (лямбда x: x * x) (3)
9
  

Π’Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Python эта функция, вСроятно, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅.Π­Ρ‚ΠΎ прямоС слСдствиС Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ лямбда-функция вызываСтся Π² Ρ‚ΠΎΠΌ Π²ΠΈΠ΄Π΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°. НапримСр, это позволяСт ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ лямбда-выраТСния Python Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΠΎΠ»Π΅Π΅ высокого порядка, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ map () , filter () ΠΈΠ»ΠΈ functools.reduce () , ΠΈΠ»ΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

АргумСнты

Как ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ def , лямбда-выраТСния Python ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ всС Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Бюда входят:

  • ΠŸΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹
  • Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ (ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова)
  • ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² (часто обозначаСтся ΠΊΠ°ΠΊ varargs )
  • ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова
  • АргумСнты Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹, доступныС Π²Π°ΠΌ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² лямбда-выраТСниям:

>>>

  >>> (лямбда x, y, z: x + y + z) (1, 2, 3)
6
>>> (лямбда x, y, z = 3: x + y + z) (1, 2)
6
>>> (лямбда x, y, z = 3: x + y + z) (1, y = 2)
6
>>> (лямбда * Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹: сумма (Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹)) (1,2,3)
6
>>> (лямбда ** kwargs: sum (kwargs.values ​​())) (ΠΎΠ΄ΠΈΠ½ = 1, Π΄Π²Π° = 2, Ρ‚Ρ€ΠΈ = 3)
6
>>> (лямбда x, *, y = 0, z = 0: x + y + z) (1, y = 2, z = 3)
6
  

Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹

Π’ Python Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ — это рСализация шаблона, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ классу. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это выраТаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ синтаксиса @decorator ΠΏΠ΅Ρ€Π΅Π΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ. Π’ΠΎΡ‚ Π½Π°Π΄ΡƒΠΌΠ°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

  def some_decorator (f):
    def обСртывания (* args):
        print (f "Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ '{f .__ name__}'")
        Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ f (Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹)
    Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π½Ρ‹Π΅ ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ

@some_decorator
def Decorated_function (x):
    print (f "Π‘ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ '{x}'")
  

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ some_decorator () — это функция, которая добавляСт ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊ Decorated_function () , Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² decor_function ("Python") ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ:

  Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Β«Decorated_functionΒ»
Π‘ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Python
  

Decorated_function () ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Β«PythonΒ» , Π½ΠΎ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ добавляСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Β«Decorated_functionΒ» .

К лямбдС ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€. Π₯отя Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΡ€Π°ΡΠΈΡ‚ΡŒ лямбда синтаксисом @decorator , Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ — это просто функция, поэтому ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

  1 # ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π°
 2def trace (f):
 3 def wrap (* args, ** kwargs):
 4 print (f "[TRACE] func: {f .__ name__}, args: {args}, kwargs: {kwargs}")
 5 Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ f (* args, ** kwargs)
 6
 7 возвратная ΠΏΠ»Π΅Π½ΠΊΠ°
 8
 9 # ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π° ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
10 @ слСд
11def add_two (x):
12 Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ x + 2
13
14 # Π’Ρ‹Π·ΠΎΠ² Π΄Π΅ΠΊΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
15add_two (3)
16
17 # ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π° ΠΊ лямбдС
18print ((слСд (лямбда x: x ** 2)) (3))
  

add_two () , ΡƒΠΊΡ€Π°ΡˆΠ΅Π½Π½Ρ‹ΠΉ @trace Π² строкС 11, вызываСтся с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ 3 Π² строкС 15.Напротив, Π² строкС 18 сразу задСйствуСтся лямбда-функция, которая встраиваСтся Π² Π²Ρ‹Π·ΠΎΠ² trace () , Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π°. Когда Π²Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

  [TRACE] func: add_two, args: (3,), kwargs: {}
[TRACE] func: <лямбда>, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹: (3,), kwargs: {}
9
  

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, ΠΊΠ°ΠΊ, ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ, имя лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ отобраТаСтся ΠΊΠ°ΠΊ , Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ add_two Ρ‡Π΅Ρ‚ΠΊΠΎ идСнтифицируСтся для Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’Π°ΠΊΠΎΠ΅ ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ΠΈΠ΅ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для Ρ†Π΅Π»Π΅ΠΉ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ повСдСния лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Π² контСкстС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка ΠΈΠ»ΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с map () :

.

  список (ΠΊΠ°Ρ€Ρ‚Π° (трассировка (лямбда x: x * 2), Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ (3)))
  

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ map () — это лямбда, ΡƒΠΌΠ½ΠΎΠΆΠ°ΡŽΡ‰Π°Ρ свой Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π½Π° 2 . Π­Ρ‚Π° лямбда ΡƒΠΊΡ€Π°ΡˆΠ΅Π½Π° слСдом () . ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

  [TRACE] Π’Ρ‹Π·ΠΎΠ²  с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ (0,) ΠΈ kwargs {}
[TRACE] Π’Ρ‹Π·ΠΎΠ²  с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ (1,) ΠΈ kwargs {}
[TRACE] Π’Ρ‹Π·ΠΎΠ²  с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ (2,) ΠΈ kwargs {}
[0, 2, 4]
  

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ [0, 2, 4] — это список, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° (3) .А ΠΏΠΎΠΊΠ° рассмотрим Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ (3) , эквивалСнтный списку [0, 1, 2] .

Π’Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΊΠ°Ρ€Ρ‚Ρƒ () Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π½Π° ΠΊΠ°Ρ€Ρ‚Π΅.

Лямбда Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ, Π½ΠΎ это Π½Π΅ рСкомСндуСтся. Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ PEP 8, Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π°Ρ… Python, ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с Primer on Python Decorators.

Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅

Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ — это функция, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ каТдая свободная пСрСмСнная, всС ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, привязана ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ Π²ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΉ области этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.ЀактичСски, замыкания ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ срСду, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚, ΠΈ поэтому ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Ρ‹ ΠΈΠ· любого мСста.

ΠŸΠΎΠ½ΡΡ‚ΠΈΡ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ связаны, хотя лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ замыканиями Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ замыканиями. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… языках Π΅ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ конструкции для замыкания ΠΈΠ»ΠΈ лямбда (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Groovy с Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΌ Π±Π»ΠΎΠΊΠΎΠΌ ΠΊΠΎΠ΄Π° Π² качСствС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Closure) ΠΈΠ»ΠΈ лямбда-выраТСния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Java с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ закрытия).

Π’ΠΎΡ‚ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, построСнноС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Python:

  1def outer_func (x):
 2 Π³ΠΎΠ΄Π° = 4
 3 def inner_func (z):
 4 print (f "x = {x}, y = {y}, z = {z}")
 5 Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ x + y + z
 6 Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚Π΅ inner_func
 7
 8 для i в диапазонС (3):
 9 Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ = external_func (я)
10 print (f "Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ({i + 5}) = {Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ (i + 5)}")
  

outer_func () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ inner_func () , Π²Π»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая вычисляСт сумму Ρ‚Ρ€Π΅Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²:

  • x пСрСдаСтся Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ outer_func () .
  • y — пСрСмСнная, локальная для outer_func () .
  • z — это Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π² inner_func () .

Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ повСдСния outer_func () ΠΈ inner_func () , outer_func () вызываСтся Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π° Π² Ρ†ΠΈΠΊΠ»Π΅ for , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

  Ρ… = 0, Ρƒ = 4, Π³ = 5
Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ (5) = 9
Ρ… = 1, Ρƒ = 4, Π³ = 6
Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ (6) = 11
Ρ… = 2, Ρƒ = 4, Π³ = 7
Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ (7) = 13
  

Π’ строкС 9 ΠΊΠΎΠ΄Π° inner_func () , Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ outer_func () , привязан ΠΊ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΡŽ ΠΈΠΌΠ΅Π½ΠΈ .Π’ строкС 5 inner_func () Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ x ΠΈ y , ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ доступ ΠΊ своСй срСдС внСдрСния, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ закрытия ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с двумя свободными ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ x ΠΈ y. .

Аналогично, лямбда Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ. Π’ΠΎΡ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Python:

  1def outer_func (x):
 2 Π³ΠΎΠ΄Π° = 4
 3 Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ лямбда z: x + y + z
 4
 5 для i в диапазонС (3):
 6 Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ = external_func (i)
 7 print (f "Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ({i + 5}) = {Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ (i + 5)}")
  

Когда Π²Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

 Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅  (5) = 9
Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ (6) = 11
Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ (7) = 13
  

Π’ строкС 6 outer_func () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ лямбду ΠΈ присваиваСт Π΅Π΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ .Π’ строкС 3 Ρ‚Π΅Π»ΠΎ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ссылаСтся Π½Π° x ΠΈ y . ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ y доступна Π²ΠΎ врСмя опрСдСлСния, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ x опрСдСляСтся Π²ΠΎ врСмя выполнСния, ΠΊΠΎΠ³Π΄Π° вызываСтся outer_func () .

Π’ этой ситуации ΠΈ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Π°Ρ функция, ΠΈ лямбда Π²Π΅Π΄ΡƒΡ‚ сСбя ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ лямбда-выраТСния ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΠΌΠ°Π½Ρ‡ΠΈΠ²Ρ‹ΠΌ ΠΈΠ·-Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π΅Π³ΠΎ ΠΎΡ†Π΅Π½ΠΊΠΈ (врСмя опрСдСлСния ΠΈ врСмя выполнСния).

ВрСмя ΠΎΡ†Π΅Π½ΠΊΠΈ

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуациях, связанных с Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ, ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Python Π² качСствС замыкания ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ.Π­Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ понимания, ΠΊΠΎΠ³Π΄Π° свободныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ связаны Π² контСкстС лямбда. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ использованиСм ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ лямбда-выраТСния Python.

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ сцСнарий, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

>>>

  1 >>> def wrap (n):
 2 ... def f ():
 3 ... ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (n)
 4 ... Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ f
 5 ...
 6 >>> числа = 'ΠΎΠ΄ΠΈΠ½', 'Π΄Π²Π°', 'Ρ‚Ρ€ΠΈ'
 7 >>> funcs = []
 8 >>> для n Ρ†ΠΈΡ„Ρ€Π°ΠΌΠΈ:
 9 ... Ρ„ΡƒΠ½ΠΊΡ†.Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ (ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ (n))
10 ...
11 >>> для f Π² функциях:
12 ... f ()
13 ...
14one
15Π΄Π²Π°
16Ρ‚Ρ€ΠΈ
  

Π’ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ n оцСниваСтся Π²ΠΎ врСмя опрСдСлСния, Π² строкС 9, ΠΊΠΎΠ³Π΄Π° функция добавляСтся Π² список: funcs.append (wrap (n)) .

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Ρ‚ΠΎΠΉ ΠΆΠ΅ Π»ΠΎΠ³ΠΈΠΊΠΈ с лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, наблюдаСм Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅:

>>>

  1 >>> числа = 'ΠΎΠ΄ΠΈΠ½', 'Π΄Π²Π°', 'Ρ‚Ρ€ΠΈ'
 2 >>> funcs = []
 3 >>> для n Ρ†ΠΈΡ„Ρ€Π°ΠΌΠΈ:
 4... funcs.append (лямбда: print (n))
 5 ...
 6 >>> для f Π² функциях:
 7 ... f ()
 8 ...
 9Ρ‚Ρ€ΠΈ
10Ρ‚Ρ€ΠΈ
11Ρ‚Ρ€ΠΈ
  

НСоТиданный Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ свободная пСрСмСнная n , ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ, связана Π²ΠΎ врСмя выполнСния лямбда-выраТСния. Лямбда-функция Python Π² строкС 4 — это Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ n , ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ΠΏΡ€ΠΈΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ Π²ΠΎ врСмя выполнСния. Π’ΠΎ врСмя выполнСния ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f Π² строкС 7 Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ n Ρ€Π°Π²Π½ΠΎ three .

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π²ΠΎ врСмя опрСдСлСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

>>>

  1 >>> числа = 'ΠΎΠ΄ΠΈΠ½', 'Π΄Π²Π°', 'Ρ‚Ρ€ΠΈ'
 2 >>> funcs = []
 3 >>> для n Ρ†ΠΈΡ„Ρ€Π°ΠΌΠΈ:
 4 ... funcs.append (лямбда n = n: print (n))
 5 ...
 6 >>> для f Π² функциях:
 7 ... f ()
 8 ...
 9one
10Π΄Π²Π°
11Ρ‚Ρ€ΠΈ
  

Лямбда-функция Python Π²Π΅Π΄Π΅Ρ‚ сСбя ΠΊΠ°ΠΊ обычная функция Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, лямбда-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ n ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ внСшниС n Π² качСствС значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.Лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Python ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ лямбда x = n: print (x) ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Лямбда-функция Python вызываСтся Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² строкС 7 ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ n , установлСнноС Π²ΠΎ врСмя опрСдСлСния.

ВСстированиС лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

лямбда-выраТСния Python ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ функциям. МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ unittest , Ρ‚Π°ΠΊ ΠΈ doctest .

unittest

ΠœΠΎΠ΄ΡƒΠ»ΡŒ unittest ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Python Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ функциям:

  ΠΈΠΌΠΏΠΎΡ€Ρ‚Π½Ρ‹ΠΉ unittest

addtwo = лямбда x: x + 2

класс LambdaTest (unittest.ΠŸΡ€Π΅Ρ†Π΅Π΄Π΅Π½Ρ‚):
    def test_add_two (сам):
        self.assertEqual (addtwo (2), 4)

    def test_add_two_point_two (сам):
        self.assertEqual (addtwo (2.2), 4.2)

    def test_add_three (сам):
        # Π”ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΡ‚Π΅Ρ€ΠΏΠ΅Ρ‚ΡŒ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ
        self.assertEqual (addtwo (3), 6)

Ссли __name__ == '__main__':
    unittest.main (многословиС = 2)
  

LambdaTest опрСдСляСт тСстовый ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с трСмя ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ тСстирования, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… выполняСт тСстовый сцСнарий для addtwo () , Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ лямбда-функция.Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Python lambda_unittest.py , содСрТащСго LambdaTest , Π΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

  $ ΠΏΠΈΡ‚ΠΎΠ½ lambda_unittest.py
test_add_three (__main __. LambdaTest) ... FAIL
test_add_two (__main __. LambdaTest) ... Ρ…ΠΎΡ€ΠΎΡˆΠΎ
test_add_two_point_two (__main __. LambdaTest) ... Ρ…ΠΎΡ€ΠΎΡˆΠΎ

================================================== ====================
ΠžΠ’ΠšΠΠ—: test_add_three (__main __. LambdaTest)
-------------------------------------------------- --------------------
ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ (послСдний Π²Ρ‹Π·ΠΎΠ² послСдний):
  Π€Π°ΠΉΠ» "lambda_unittest.py ", строка 18, Π² test_add_three
    self.assertEqual (addtwo (3), 6)
AssertionError: 5! = 6

-------------------------------------------------- --------------------
Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ 3 тСста Π·Π° 0,001 с

Π’Π«ΠŸΠžΠ›ΠΠ•ΠΠž (ΠΎΡ‚ΠΊΠ°Π·ΠΎΠ² = 1)
  

Как ΠΈ оТидалось, Ρƒ нас Π΅ΡΡ‚ΡŒ Π΄Π²Π° ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹Ρ… тСстовых ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΈ ΠΎΠ΄ΠΈΠ½ сбой для test_add_three : Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ 5 , Π½ΠΎ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±Ρ‹Π» 6 . Π­Ρ‚ΠΎΡ‚ сбой Π²Ρ‹Π·Π²Π°Π½ ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠΉ ошибкой Π² ​​тСстовом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. ИзмСнСниС ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° с 6 Π½Π° 5 ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚ всС тСсты LambdaTest .

доктСст

ΠœΠΎΠ΄ΡƒΠ»ΡŒ doctest ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Python ΠΈΠ· строки Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ для выполнСния тСстов. Π₯отя синтаксис лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Python Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΡƒΡŽ строку Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ , ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ строку элСмСнту __doc__ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΉ лямбда:

  addtwo = лямбда x: x + 2
addtwo .__ doc__ = "" "Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ 2 ΠΊ числу.
    >>> addtwo (2)
    4
    >>> addtwo (2.2)
    4.2
    >>> addtwo (3) # Π”ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΡ‚Π΅Ρ€ΠΏΠ΅Ρ‚ΡŒ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ
    6
    "" "

Ссли __name__ == '__main__':
    ΠΈΠΌΠΏΠΎΡ€Ρ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²
    doctest.testmod (verbose = True)
  

doctest Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° лямбда addtwo () описываСт Ρ‚Π΅ ΠΆΠ΅ тСстовыС случаи, Ρ‡Ρ‚ΠΎ ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.

Когда Π²Ρ‹ выполняСтС тСсты Ρ‡Π΅Ρ€Π΅Π· doctest.testmod () , Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

  $ ΠΏΠΈΡ‚ΠΎΠ½ lambda_doctest.py
ΠŸΡ‹Ρ‚Π°ΡŽΡ‰ΠΈΠΉΡΡ:
    addtwo (2)
ОТидая:
    4
Ok
ΠŸΡ‹Ρ‚Π°ΡŽΡ‰ΠΈΠΉΡΡ:
    addtwo (2.2)
ОТидая:
    4.2
Ok
ΠŸΡ‹Ρ‚Π°ΡŽΡ‰ΠΈΠΉΡΡ:
    addtwo (3) # Π”ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΡ‚Π΅Ρ€ΠΏΠ΅Ρ‚ΡŒ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ
ОТидая:
    6
************************************************* ********************
Π€Π°ΠΉΠ» "lambda_doctest.py", строка 16, Π² __main __. Addtwo
НСудачный ΠΏΡ€ΠΈΠΌΠ΅Ρ€:
    addtwo (3) # Π”ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΡ‚Π΅Ρ€ΠΏΠ΅Ρ‚ΡŒ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ
ОТидал:
    6
Π•ΡΡ‚ΡŒ:
    5
1 ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ Π½Π΅ ΠΏΡ€ΠΎΡˆΠ΅Π» тСстов:
    __Π³Π»Π°Π²Π½Ρ‹ΠΉ__
************************************************* ********************
По 1 ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Ρƒ Π±Ρ‹Π»ΠΈ сбои:
   1 ΠΈΠ· 3 Π² __main __. Addtwo
3 тСста ΠΏΠΎ 2 задания.
2 ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Ρ‹ ΠΈ 1 Π½Π΅ ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½.
*** ВСст Π½Π΅ ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½ *** 1 сбой. 

НСудачный тСст являСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ сбоя, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ объяснялся ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… тСстов Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ docstring ΠΊ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ Python Ρ‡Π΅Ρ€Π΅Π· присвоСниС __doc__ для докумСнтирования лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π₯отя это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, синтаксис Python Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для строки Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‡Π΅ΠΌ для лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Для ΠΈΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±Π·ΠΎΡ€Π° ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ³ΠΎ тСстирования Π² Python Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΠŸΡ€ΠΈΡΡ‚ΡƒΠΏΠ°Ρ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ с тСстированиСм Π² Python.

ЗлоупотрСблСния лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ

НСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅, Ссли ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ написаны Π² контСкстС ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Python, Π±Ρ‹Π»ΠΈ Π±Ρ‹ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΊΠ°ΠΊ злоупотрСблСния.

Если Π²Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚, это, вСроятно, ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Π°Ρ функция Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚. Π‘Ρ‚Ρ€ΠΎΠΊΠ° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ для лямбда-выраТСния ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π° являСтся Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ. ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Ρ‚ΡŒ Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ лямбда-функция Python Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, — Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ красный Ρ„Π»Π°Π³.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² использования лямбда-выраТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… слСдуСт ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ. Π­Ρ‚ΠΈΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ситуации, ΠΊΠΎΠ³Π΄Π° Π² контСкстС лямбда-выраТСния Python ΠΊΠΎΠ΄ дСмонстрируСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаблон:

  • Он Π½Π΅ соотвСтствуСт руководству ΠΏΠΎ ΡΡ‚ΠΈΠ»ΡŽ Python (PEP 8)
  • Π­Ρ‚ΠΎ Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΎ ΠΈ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ.
  • Π­Ρ‚ΠΎ излишнС ΡƒΠΌΠ½ΠΎ Π·Π° счСт Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΠΉ читаСмости.

Π’Ρ‹Π·ΠΎΠ² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π² лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Python Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ вас Π΄Π²Π°ΠΆΠ΄Ρ‹ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ.Π•ΡΡ‚ΡŒ нСсколько ΡƒΠΌΠ½Ρ‹Ρ… способов ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это, Π½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ Π΄Π°ΠΆΠ΅ Ρ‚Π°ΠΊΠΈΡ… Π²Π΅Ρ‰Π΅ΠΉ:

>>>

  >>> def throw (ex): ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ ex
>>> (лямбда: throw (Exception ('ΠŸΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠ»ΠΎΡ…ΠΎΠ΅'))) ()
ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ (послСдний Π²Ρ‹Π·ΠΎΠ² послСдний):
    Π€Π°ΠΉΠ» "", строка 1, Π² 
    Π€Π°ΠΉΠ» "", строка 1, Π² 
    Π€Π°ΠΉΠ» "", строка 1, Π² throw
Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅: ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠ»ΠΎΡ…ΠΎΠ΅.
  

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π² лямбда-Ρ‚Π΅Π»Π΅ Python синтаксичСски Π½Π΅Π²Π΅Ρ€Π΅Π½, ΠΎΠ±Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ состоит Π² абстрагировании Π²Ρ‹Π·ΠΎΠ²Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ throw () .Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ использования этого Ρ‚ΠΈΠΏΠ° ΠΎΠ±Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ. Если Π²Ρ‹ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ с этим Ρ‚ΠΈΠΏΠΎΠΌ ΠΊΠΎΠ΄Π°, Π²Π°ΠΌ слСдуСт ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ Π΅Π³ΠΎ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

Π—Π°Π³Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΉ ΡΡ‚ΠΈΠ»ΡŒ

Как ΠΈ Π² любом Π΄Ρ€ΡƒΠ³ΠΎΠΌ языкС программирования, Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ ΠΊΠΎΠ΄ Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ·-Π·Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ стиля. Лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ·-Π·Π° ΠΈΡ… краткости ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΏΠΎΡΠΎΠ±ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ написанию ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ лямбда-выраТСния содСрТит нСсколько Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ стиля:

>>>

  >>> (lambda _: list (map (lambda _: _ // 2, _))) ([1,2,3,4,5,6,7,8,9,10] )
[0, 1, 1, 2, 2, 3, 3, 4, 4, 5]
  

Π—Π½Π°ΠΊ подчСркивания ( _ ) ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ явно.Но Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ‚Ρ€ΠΈ _ относятся ΠΊ Ρ€Π°Π·Π½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ. ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ этого лямбда-ΠΊΠΎΠ΄Π° ΠΌΠΎΠ³Π»ΠΎ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Π·Π²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅:

>>>

  >>> (lambda some_list: list (map (lambda n: n // 2,
                                some_list))) ([1,2,3,4,5,6,7,8,9,10])
[0, 1, 1, 2, 2, 3, 3, 4, 4, 5]
  

По ΠΎΠ±Ρ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠ·Π½Π°Π½ΠΈΡŽ, это всС Π΅Ρ‰Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ. По-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ прСимущСство лямбда , обычная функция Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ этого ΠΊΠΎΠ΄Π°, распрСдСляя Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΏΠΎ нСскольким строкам ΠΈ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

>>>

  >>> def div_items (some_list):
      div_by_two = лямбда n: n // 2
      Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΊΠ°Ρ€Ρ‚Ρƒ (div_by_two, some_list)
>>> список (div_items ([1,2,3,4,5,6,7,8,9,10])))
[0, 1, 1, 2, 2, 3, 3, 4, 4, 5]
  

Π­Ρ‚ΠΎ всС Π΅Ρ‰Π΅ Π½Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎ, Π½ΠΎ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π²Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ способ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΈ, Π² частности, лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Python Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌΠΈ.Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ лямбдам» Π²Ρ‹ Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ΡΡŒ Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ map () ΠΈ лямбда Π½Π° составныС части списков ΠΈΠ»ΠΈ выраТСния-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹. Π­Ρ‚ΠΎ Ρ€Π΅Π·ΠΊΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°.

ΠšΠ»Π°ΡΡΡ‹ Python

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅, Π½ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса ΠΊΠ°ΠΊ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Python. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ прСдставляСт собой ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π·Π°ΠΊΠΎΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Python, Π½ΠΎ дСмонстрируСт Π½Π΅Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Python, основанный Π½Π° лямбда . НапримСр, вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ __str__ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ лямбда .Аналогично, brand ΠΈ Π³ΠΎΠ΄ — это свойства, Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ вмСсто ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ»ΠΈ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ²:

  класс ΠΠ²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒ:
    "" "ΠΠ²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒ с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ ΠΊΠ°ΠΊ лямбда-функциями." ""
    def __init __ (я, Π±Ρ€Π΅Π½Π΄, Π³ΠΎΠ΄):
        self.brand = Π±Ρ€Π΅Π½Π΄
        self.year = Π³ΠΎΠ΄

    brand = property (лямбда self: getattr (self, '_brand'),
                     лямбда self, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅: setattr (self, '_brand', value))

    Π³ΠΎΠ΄ = свойство (лямбда-я: getattr (self, '_year'),
                    лямбда self, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅: setattr (self, '_year', value))

    __str__ = лямбда self: f '{self.brand} {self.year} '# 1: ошибка E731

    honk = lambda self: print ('Honk!') # 2: ошибка E731
  

Запуск Ρ‚Π°ΠΊΠΎΠ³ΠΎ инструмСнта, ΠΊΠ°ΠΊ flake8 , инструмСнта обСспСчСния соблюдСния ΠΏΡ€Π°Π²ΠΈΠ» стиля, ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ошибки для __str__ ΠΈ honk :

  E731 Π½Π΅ Π½Π°Π·Π½Π°Ρ‡Π°ΡŽΡ‚ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ def
  

Π₯отя flake8 Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ использования лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Python Π² свойствах, ΠΈΡ… Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΎΠ½ΠΈ ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Ρ‹ ошибкам ΠΈΠ·-Π·Π° использования Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… строк, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ '_brand' ΠΈ '_year '.

ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ рСализация __str__ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  def __str __ (сам):
    return f '{self.brand} {self.year}'
  

ΠΌΠ°Ρ€ΠΊΠ° Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  @property
def brand (self):
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ self._brand

@ brand.setter
def brand (self, value):
    self._brand = Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
  

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π² контСкстС ΠΊΠΎΠ΄Π°, написанного Π½Π° Python, ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅ отдаСтся рСгулярным функциям лямбда-выраТСниям.Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях лямбда-синтаксис Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.

НадлСТащСС использованиС лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

Лямбды Π² Python, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠΌ споров. Π’ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΎΡ‚ΠΈΠ² лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² Python:

  • ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ
  • НавязываниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΡ‹ΡˆΠ»Π΅Π½ΠΈΡ
  • ВяТСлый синтаксис с ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом лямбда

НСсмотря Π½Π° ΠΆΠ°Ρ€ΠΊΠΈΠ΅ споры, ставящиС ΠΏΠΎΠ΄ сомнСниС простоС сущСствованиС этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python, лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ свойствами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ†Π΅Π½Π½ΠΎΡΡ‚ΡŒ для языка Python ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ².

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ сцСнарии, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… использованиС лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ умСстно, Π½ΠΎ ΠΈ поощряСтся Π² ΠΊΠΎΠ΄Π΅ Python.

ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ конструкции

Лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ рСгулярно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ со встроСнными функциями map () ΠΈ filter () , Π° Ρ‚Π°ΠΊΠΆΠ΅ functools.reduce () , прСдставлСнными Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ functools . Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡΠΌΠΈ использования этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с лямбда-выраТСниями Π² качСствС ΡΠΎΠΏΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ…:

>>>

  >>> список (map (lambda x: x.upper (), ['кошка', 'собака', 'ΠΊΠΎΡ€ΠΎΠ²Π°']))
["КОШКА", "Π‘ΠžΠ‘ΠΠšΠ", "ΠšΠžΠ ΠžΠ’Π"]
>>> list (filter (lambda x: 'o' in x, ['cat', 'dog', 'cow']))
['собака', 'ΠΊΠΎΡ€ΠΎΠ²Π°']
>>> ΠΈΠ· ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° functools ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ
>>> reduce (lambda acc, x: f '{acc} | {x}', ['кошка', 'собака', 'ΠΊΠΎΡ€ΠΎΠ²Π°'])
'кошка | собака | ΠΊΠΎΡ€ΠΎΠ²Π°'
  

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ придСтся ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΏΠΎΡ…ΠΎΠΆΠΈΠΉ Π½Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, хотя ΠΈ с Π±ΠΎΠ»Π΅Π΅ Ρ€Π΅Π»Π΅Π²Π°Π½Ρ‚Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Π²Π°ΠΆΠ½ΠΎ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ эти конструкции. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Ρƒ этих конструкций Π΅ΡΡ‚ΡŒ эквивалСнтныС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Π±ΠΎΠ»Π΅Π΅ питоничСскими.Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ лямбдам» Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ лямбды Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅, Π±ΠΎΠ»Π΅Π΅ идиоматичСскиС Ρ„ΠΎΡ€ΠΌΡ‹.

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python — это Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΊΠ»ΡŽΡ‡ Π² качСствС ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. ΠΊΠ»ΡŽΡ‡ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ лямбда . Π­Ρ‚Π° функция Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ влияСт Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, управляСмый самой ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ. Π’ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

  • sort () : ΠΌΠ΅Ρ‚ΠΎΠ΄ списка
  • отсортировано () , ΠΌΠΈΠ½. () , макс. () : встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
  • nlargest () ΠΈ nsmallest () : Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΊΡƒΡ‡ΠΈ heapq

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ список ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², прСдставлСнных Π² Π²ΠΈΠ΄Π΅ строк.ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ прСдставляСт собой объСдинСниС строки , ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΈ числа. Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° этого списка с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sorted () ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ лСксикографичСский порядок, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ элСмСнты Π² спискС ΡΠ²Π»ΡΡŽΡ‚ΡΡ строками.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ сортировки, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ лямбду для ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊΠ»ΡŽΡ‡ , Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ сортировкС Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ число, связанноС с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ:

>>>

  >>> ids = ['id1', 'id2', 'id30', 'id3', 'id22', 'id100']
>>> print (sorted (ids)) # ЛСксикографичСская сортировка
['id1', 'id100', 'id2', 'id22', 'id3', 'id30']
>>> sorted_ids = sorted (ids, key = lambda x: int (x [2:])) # ЦСлочислСнная сортировка
>>> ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (sorted_ids)
['id1', 'id2', 'id3', 'id22', 'id30', 'id100']
  

Π€Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса

UI-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Tkinter, wxPython ΠΈΠ»ΠΈ.NET Windows Forms с IronPython ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для сопоставлСния дСйствий Π² ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° события ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса.

Наивная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Tkinter Π½ΠΈΠΆΠ΅ дСмонстрируСт использованиС лямбда , Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ Reverse :

  ΠΈΠΌΠΏΠΎΡ€Ρ‚ tkinter as tk
import sys

ΠΎΠΊΠ½ΠΎ = tk.Tk ()
window.grid_columnconfigure (0, вСс = 1)
window.title ("Лямбда")
window.geometry ("300x100")
label = tk.Label (window, text = "Лямбда-исчислСниС")
label.grid (столбСц = 0, строка = 0)
ΠΊΠ½ΠΎΠΏΠΊΠ° = Ρ‚ΠΊ.Кнопка(
    ΠΎΠΊΠ½ΠΎ,
    text = "ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ",
    command = lambda: label.configure (text = label.cget ("тСкст") [:: - 1]),
)
button.grid (столбСц = 0, строка = 1)
window.mainloop ()
  

ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Reverse запускаСтся событиС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ запускаСт лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, мСняя ΠΌΠ΅Ρ‚ΠΊΡƒ с Lambda Calculus Π½Π° suluclaC adbmaL *:

И wxPython, ΠΈ IronPython Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ .NET ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ схоТий ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ событий. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ лямбда — это ΠΎΠ΄ΠΈΠ½ ΠΈΠ· способов ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий срабатывания, Π½ΠΎ для Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ†Π΅Π»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ΠΎΠ½ оказываСтся самодостаточным ΠΈ ΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лямбда , ΠΊΠΎΠ³Π΄Π° количСство Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»ΠΎ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ wxPython, ΠΏΡ€ΠΎΡ‡Ρ‚ΠΈΡ‚Π΅ ΡΡ‚Π°Ρ‚ΡŒΡŽ Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Python с графичСским интСрфСйсом ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ wxPython.

Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python

Когда Π²Ρ‹ ΠΈΠ³Ρ€Π°Π΅Ρ‚Π΅ с ΠΊΠΎΠ΄ΠΎΠΌ Python Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π΅, лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Python часто становятся Π±Π»Π°Π³ΠΎΠΌ. Π›Π΅Π³ΠΊΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±Ρ‹ΡΡ‚Ρ€ΡƒΡŽ ΠΎΠ΄Π½ΠΎΡΡ‚Ρ€ΠΎΡ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для изучСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ увидят свСт Π²Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°.Лямбды, написанныС Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π΅ для быстрого обнаруТСния, ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° ΠΌΠ°ΠΊΡƒΠ»Π°Ρ‚ΡƒΡ€Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ послС использования.

Ρ‚Π°ΠΉΠΌΠΈΡ‚

Π’ Ρ‚ΠΎΠΌ ΠΆΠ΅ Π΄ΡƒΡ…Π΅, Ρ‡Ρ‚ΠΎ ΠΈ экспСримСнты с ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ Python, ΠΌΠΎΠ΄ΡƒΠ»ΡŒ timeit прСдоставляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ измСрСния Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠ΄Π°. timeit.timeit () , Π² частности, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, пСрСдавая Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠ΄ Python Π² строкС. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

>>>

  >>> ΠΈΠ· timeit import timeit
>>> timeit ("factorial (999)", "from math import factorial", number = 10)
0.0013087529951008037
  

Когда ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ пСрСдаСтся Π² Π²ΠΈΠ΄Π΅ строки, timeit () трСбуСтся ΠΏΠΎΠ»Π½Ρ‹ΠΉ контСкст. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это обСспСчиваСтся Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ устанавливаСт срСду, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ для основной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, для синхронизации. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ NameError .

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ — ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лямбда :

>>>

  >>> ΠΈΠ· матСматичСского ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π°
>>> timeit (лямбда: Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» (999), число = 10)
0.0012704220062005334
  

Π­Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ‡ΠΈΡ‰Π΅, ΡƒΠ΄ΠΎΠ±ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΠ΅Π΅ ΠΈ быстрСС вводится Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€. Π₯отя врСмя выполнСния Π±Ρ‹Π»ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ мСньшС для вСрсии лямбда , ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ нСбольшоС прСимущСство для вСрсии string . ВрСмя выполнСния настройки ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΈΠ· ΠΎΠ±Ρ‰Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

ΠŸΠ°Ρ‚Ρ‡ для обСзьян

Для тСстирования ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° воспроизводимыС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, Π΄Π°ΠΆΠ΅ Ссли Π²ΠΎ врСмя Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ выполнСния Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния оТидаСтся, Ρ‡Ρ‚ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ случайными.

Допустим, Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π²ΠΎ врСмя выполнСния ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ случайныС значСния. Но Π²ΠΎ врСмя выполнСния тСстирования Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ постоянно ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ прСдсказуСмыС значСния. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ лямбда Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ исправлСниС ΠΎΠ±Π΅Π·ΡŒΡΠ½Ρ‹:

  ΠΈΠ· contextlib import contextmanager
сСкрСты ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°

def gen_token ():
    "" "Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ случайный Ρ‚ΠΎΠΊΠ΅Π½." ""
    return f'TOKEN_ {secrets.token_hex (8)} '

@contextmanager
def mock_token ():
    "" "ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ контСкста, Ρ‡Ρ‚ΠΎΠ±Ρ‹ обСзьяна исправляла сСкрСты.token_hex
    функция Π²ΠΎ врСмя тСстирования.
    "" "
    default_token_hex = сСкрСты.token_hex
    secretts.token_hex = lambda _: 'feedfacecafebeef'
    ΡƒΡ€ΠΎΠΆΠ°ΠΉ
    secretts.token_hex = default_token_hex

def test_gen_key ():
    "" "ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ случайный Ρ‚ΠΎΠΊΠ΅Π½." ""
    с mock_token ():
        assert gen_token () == f "Π’ΠžΠšΠ•Π _ {'feedfacecafebeef'}"

test_gen_key ()
  

ДиспСтчСр контСкста ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ исправлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Π΅Π·ΡŒΡΠ½Ρ‹ ΠΎΡ‚ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ( сСкрСтов , Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅).Лямбда-функция, назначСнная для secrets.token_hex () , замСняСт ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, возвращая статичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Π­Ρ‚ΠΎ позволяСт прСдсказуСмо Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² зависимости ΠΎΡ‚ token_hex () . ΠŸΠ΅Ρ€Π΅Π΄ Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ ΠΈΠ· диспСтчСра контСкста ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ token_hex () восстанавливаСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ области тСстирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ повСдСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ token_hex () .

Π‘Ρ€Π΅Π΄Ρ‹ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ³ΠΎ тСстирования

, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ unittest ΠΈ pytest , выводят эту ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ Π½Π° Π±ΠΎΠ»Π΅Π΅ высокий ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ слоТности.

Π‘ pytest , всС Π΅Ρ‰Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΌ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ , Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ становится Π±ΠΎΠ»Π΅Π΅ элСгантным ΠΈ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹ΠΌ:

  сСкрСты ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°

def gen_token ():
    return f'TOKEN_ {secrets.token_hex (8)} '

def test_gen_key (ΠΏΠ°Ρ‚Ρ‡ ΠΎΠ±Π΅Π·ΡŒΡΠ½Ρ‹):
    monkeypatch.setattr ('secrets.token_hex', lambda _: 'feedfacecafebeef')
    assert gen_token () == f "Π’ΠžΠšΠ•Π _ {'feedfacecafebeef'}"
  

Π‘ ΠΏΡ€ΠΈΠ±ΠΎΡ€ΠΎΠΌ pytest monkeypatch , сСкрСтов.token_hex () пСрСзаписываСтся лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, feedfacecafebeef , Ρ‡Ρ‚ΠΎ позволяСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ тСст. ΠŸΡ€ΠΈΡΠΏΠΎΡΠΎΠ±Π»Π΅Π½ΠΈΠ΅ pytest monkeypatch позволяСт Π²Π°ΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ объСм пСрСопрСдСлСния. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹Π·ΠΎΠ² secrets.token_hex () Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… тСстах Π±Π΅Π· использования исправлСний ΠΎΠ±Π΅Π·ΡŒΡΠ½Ρ‹ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ тСста pytest Π΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

  $ pytest test_token.py -v
============================= НачинаСтся тСстовая сСссия ================== ============
ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° Linux - Python 3.7.2, pytest-4.3.0, py-1.8.0, pluggy-0.9.0
cachedir: .pytest_cache
ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³: / home / andre / AB / tools / bpython, inifile:
собрано 1 ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚

test_token.py::test_gen_key ΠŸΠ ΠžΠ™Π”Π•Π [100%]

=========================== 1 ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½ΠΎ Π·Π° 0,01 сСкунды ================== =========
  

ВСст ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ gen_token () Π±Ρ‹Π» задСйствован, ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π±Ρ‹Π»ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΌΠΈ Π² контСкстС тСста.

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ лямбдам

Π₯отя Π΅ΡΡ‚ΡŒ вСскиС ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лямбда , Π΅ΡΡ‚ΡŒ случаи, ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ использованиС осуТдаСтся. Π˜Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊΠΈΠ΅ Π΅ΡΡ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹?

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ map () , filter () ΠΈ functools.reduce () , ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Ρ‹ Π² Π±ΠΎΠ»Π΅Π΅ элСгантныС Ρ„ΠΎΡ€ΠΌΡ‹ с нСбольшими хитростями творчСства, Π² частности, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ списков ΠΈΠ»ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ списков, ΠΏΡ€ΠΎΡ‡Ρ‚ΠΈΡ‚Π΅ ΡΡ‚Π°Ρ‚ΡŒΡŽ Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ списков Π² Python.Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ выраТСниях Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°, ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ yield Π² Python.

ΠšΠ°Ρ€Ρ‚Π°

ВстроСнная функция map () ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ примСняСт Π΅Π΅ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΈΠ· элСмСнтов своСго Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ . ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ ΡΠ²Π»ΡΡŽΡ‚ΡΡ строки, списки ΠΈ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ. Для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с Iterables ΠΈ Iterators.

map () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ.НапримСр, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ список строк Π² Π½ΠΎΠ²Ρ‹ΠΉ список с Π·Π°Π³Π»Π°Π²Π½Ρ‹ΠΌΠΈ Π±ΡƒΠΊΠ²Π°ΠΌΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ map () , ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

>>>

  >>> list (map (lambda x: x.capitalize (), ['cat', 'dog', 'cow']))
["Кошка", "Π‘ΠΎΠ±Π°ΠΊΠ°", "ΠšΠΎΡ€ΠΎΠ²Π°"]
  

Π’Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ list () , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ map () , Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ список, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π΅ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ Python.

ИспользованиС понимания списка устраняСт Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ опрСдСлСния ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

>>>

  >>> [x.capitalize () вмСсто x Π² ['кошка', 'собака', 'ΠΊΠΎΡ€ΠΎΠ²Π°']]
["Кошка", "Π‘ΠΎΠ±Π°ΠΊΠ°", "ΠšΠΎΡ€ΠΎΠ²Π°"]
  

Π€ΠΈΠ»ΡŒΡ‚Ρ€

ВстроСнная функция filter () , Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° классичСская Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ конструкция, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π° Π² ΡΠΎΡΡ‚Π°Π²Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ списка. Он ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ Π² качСствС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Он строит ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, содСрТащий всС элСмСнты Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π°. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅Ρ‚ всС Ρ‡Π΅Ρ‚Π½Ρ‹Π΅ числа Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ спискС Ρ†Π΅Π»Ρ‹Ρ… чисСл:

>>>

  >>> Ρ‡Π΅Ρ‚Π½ΠΎΠ΅ = лямбда x: x% 2 == 0
>>> список (Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ (Π΄Π°ΠΆΠ΅, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ (11)))
[0, 2, 4, 6, 8, 10]
  

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ filter () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ встроСнный Ρ‚ΠΈΠΏ list , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт список с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°.

РСализация, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ понимания списка, Π΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

>>>

  >>> [x для x в диапазонС (11), Ссли x% 2 == 0]
[0, 2, 4, 6, 8, 10]
  

ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ

Начиная с Python 3, reduce () ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΠ»Π°ΡΡŒ ΠΈΠ· встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ модуля functools . Как ΠΈ map () ΠΈ filter () , Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΡΠ²Π»ΡΡŽΡ‚ΡΡ соотвСтствСнно Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ. Он Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π² качСствС Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² качСствС Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ аккумулятора.Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ reduce () примСняСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ возвращаСтся, ΠΊΠΎΠ³Π΄Π° итСрация исчСрпана.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ reduce () ΠΊ списку ΠΏΠ°Ρ€ ΠΈ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ сумму ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ это:

>>>

  >>> import functools
>>> ΠΏΠ°Ρ€Ρ‹ = [(1, 'a'), (2, 'b'), (3, 'c')]
>>> functools.reduce (лямбда-совпадСниС, ΠΏΠ°Ρ€Π°: совпадСниС + ΠΏΠ°Ρ€Π° [0], ΠΏΠ°Ρ€Ρ‹, 0)
6
  

Π‘ΠΎΠ»Π΅Π΅ идиоматичСский ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ с использованиСм выраТСния Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sum () Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

>>>

  >>> ΠΏΠ°Ρ€Ρ‹ = [(1, 'a'), (2, 'b'), (3, 'c')]
>>> sum (x [0] для x ΠΏΠΎΠΏΠ°Ρ€Π½ΠΎ)
6
  

НСмного Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π±ΠΎΠ»Π΅Π΅ чистоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ устраняСт Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ явного доступа ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ элСмСнту ΠΏΠ°Ρ€Ρ‹ ΠΈ вмСсто этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ распаковку:

>>>

  >>> ΠΏΠ°Ρ€Ρ‹ = [(1, 'a'), (2, 'b'), (3, 'c')]
>>> сумма (x вмСсто x, _ ΠΏΠΎΠΏΠ°Ρ€Π½ΠΎ)
6
  

ИспользованиС подчСркивания ( _ ) — это соглашСниС Python, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Ρ‹.

sum () ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, поэтому Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки.

Лямбды питоничСскиС ΠΈΠ»ΠΈ Π½Π΅Ρ‚?

PEP 8, руководство ΠΏΠΎ ΡΡ‚ΠΈΠ»ΡŽ ΠΊΠΎΠ΄Π° Python, гласит:

ВсСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ def вмСсто ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° присваивания, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ связываСт лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ. (Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ)

Π­Ρ‚ΠΎ Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лямбда, ΠΏΡ€ΠΈΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ ΠΊ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ, Π² основном Ρ‚Π°ΠΌ, Π³Π΄Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ большС прСимущСств.PEP 8 Π½Π΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ использования лямбда . Как Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ…, лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, бСзусловно, ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, хотя ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ способ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° этот вопрос состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ идСально подходят для Pythonic, Ссли большС Π½Π΅Ρ‚ доступных Pythonic. Π― избСгаю опрСдСлСния Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«PythonicΒ», оставляя Π²Π°ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π»ΡƒΡ‡ΡˆΠ΅ всСго соотвСтствуСт Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΌΡ‹ΡˆΠ»Π΅Π½ΠΈΡŽ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²Π°ΡˆΠ΅ΠΌΡƒ Π»ΠΈΡ‡Π½ΠΎΠΌΡƒ ΡΡ‚ΠΈΠ»ΡŽ программирования ΠΈΠ»ΠΈ ΡΡ‚ΠΈΠ»ΡŽ программирования вашСй ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.

Помимо ΡƒΠ·ΠΊΠΈΡ… Ρ€Π°ΠΌΠΎΠΊ Python lambda , Как Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ красивый ΠΊΠΎΠ΄ Python с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PEP 8 — ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ рСсурс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ стиля ΠΊΠΎΠ΄Π° Π² Python.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Python lambda ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅:

  • ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ лямбды Python ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
  • Π’Ρ‹Π±ΠΈΡ€Π°ΠΉΡ‚Π΅ с ΡƒΠΌΠΎΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ лямбдами ΠΈΠ»ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ функциями Python
  • Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ использования лямбд
  • ИспользованиС лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ с функциями Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка ΠΈΠ»ΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌΠΈ функциями Python

Если Ρƒ вас Π΅ΡΡ‚ΡŒ ΡΠΊΠ»ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ ΠΊ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ²Π΅ΡΠ΅Π»ΠΈΡ‚ΡŒΡΡ, исслСдуя ΡƒΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΈΡ€ лямбда-исчислСния.

Лямбды Python ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° соль. Π©Π΅ΠΏΠΎΡ‚ΠΊΠ° Π² спамС, Π²Π΅Ρ‚Ρ‡ΠΈΠ½Π΅ ΠΈ яйцах усилит вкус, Π½ΠΎ слишком ΠΌΠ½ΠΎΠ³ΠΎ — испортит блюдо.

ΠŸΠ΅Ρ€Π²Π°Ρ Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π’Ρ€Π΅Ρ‚ΠΈΠΉ Forth
0 1 2 3 6
1 4 5 6 120

ΠŸΠ΅Ρ€Π²Π°Ρ Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π’Ρ€Π΅Ρ‚ΠΈΠΉ Forth
0 1 4 9 36
1 16 25 36 14400