Π Π°Π·Π½ΠΎΠ΅

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° python: Python/Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° python β€” Π’ΠΈΠΊΠΈΡƒΡ‡Π΅Π±Π½ΠΈΠΊ

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

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Python. Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠ°ΠΊ питонячий Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΡΡ‚ΠΈΠ»ΡŒ / Π₯Π°Π±Ρ€

  • ΠžΠ±Ρ‰Π΅Π΅ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅
  • ЀП
    • Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ЀП
    • ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ЀП
    • ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Ρ‹
    • ВстроСнноС ЀП ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Python
    • Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Xoltar Toolkit
    • Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° returns
    • Π›ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π°
  • Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹
    • Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹
    • Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹
    • Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ vs ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹
    • Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΊΠ°ΠΊ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½
    • ΠšΠΎΠ½Ρ†Π΅ΠΏΡ‚ yield from
    • ΠœΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… (ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, броадкастинг)
    • ΠŸΡ€ΠΈΠΌΠ΅Ρ€ трСйсинга Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°
    • Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ инструмСнты Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹
    • Π’Ρ‹Π²ΠΎΠ΄Ρ‹
    • Π›ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π°
  • Π˜Ρ‚ΠΎΠ³ΠΈ

Говоря ΠΎ Python, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ ΠΈ ООП ΡΡ‚ΠΈΠ»ΡŒ программирования, ΠΎΠ΄Π½Π°ΠΊΠΎ это Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ стили Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹. Π’ ΠΏΡ€Π΅Π·Π΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π½ΠΈΠΆΠ΅ ΠΌΡ‹ рассмотрим Π΅Ρ‰Ρ‘ ΠΏΠ°Ρ€Ρƒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² β€” Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ². ПослСдниС, Π² Ρ‚ΠΎΠΌ числС, ΠΏΡ€ΠΈΠ²Π΅Π»ΠΈ ΠΊ появлСнию сопрограмм, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ ΠΏΠΎΠΌΠΎΠ³Π»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ Π² Python. Π‘ΠΎΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ выходят Π·Π° Ρ€Π°ΠΌΠΊΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄Π°, поэтому, Ссли интСрСсно, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ ΠΎΠ± этом ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. Π›ΠΈΡ‡Π½ΠΎ я Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΊΠ½ΠΈΠ³Ρƒ «Fluent Python», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ начинаСтся ΠΎΡ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΏΠ»Π°Π²Π½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Ρ‚Π΅ΠΌΡ‹ ΠΎ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ…, сопрограммах ΠΈ асинхронности.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ЀП

Говоря ΠΎ ЀП сразу слСдуСт ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ всСгда ЀП, Ρ‡Π°Ρ‰Π΅ всСго это всСго лишь ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ ΡΡ‚ΠΈΠ»ΡŒ программирования. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ½ΡΡ‚ΡŒ ЀП β€” Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅, ΠΈ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π½Π°ΠΌ Π² этом тСорСтичСскиС знания.

Π’Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ Π΄Π²Π΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡ‹ программирования: импСративная ΠΈ дСкларативная.

Π˜ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° вопрос β€œΠšΠ°ΠΊ?”. Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… этой ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡ‹ Π²Ρ‹ Π·Π°Π΄Π°Π΅Ρ‚Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния сохраняСтся Π² ячСйках памяти, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ впослСдствии.

Π”Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° вопрос β€œΠ§Ρ‚ΠΎ?”. Π—Π΄Π΅ΡΡŒ Π²Ρ‹ описываСтС Π·Π°Π΄Π°Ρ‡Ρƒ, Π΄Π°Π΅Ρ‚Π΅ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ, Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½ΠΎ Π½Π΅ опрСдСляСтС, ΠΊΠ°ΠΊ этот ΠΎΡ‚Π²Π΅Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½. КаТдая ΠΈΠ· этих ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Π±ΠΎΠ»Π΅Π΅ спСцифичСскиС ΠΌΠΎΠ΄Π΅Π»ΠΈ.

Π’ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ²ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ наибольшСС распространСниС ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠ΅ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏΡ‹ β€œΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ программированиС” ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏΡ‹ β€œΠ΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ программированиС”.

Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ основноС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ сосрСдоточСно Π½Π° Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ – Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ / Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ / ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ΠΈ. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° вСдётся пошагово, ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ β€œΡΠ²Π΅Ρ€Ρ…Ρƒ вниз”. НаиболСС распространСнным языком, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ использованиС ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΊ программирования являСтся язык C, Π² Π½Π΅ΠΌ, основными ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ (ООП) ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° прСдставляСтся Π² Π²ΠΈΠ΄Π΅ совокупности ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… являСтся экзСмпляром ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ класса, классы ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ наслСдования. ООП базируСтся Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ…: инкапсуляция, наслСдованиС, ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ, абстракция. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ языков, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ вСсти Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π² этой ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ C#, Java.

Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ – процСсс вычислСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ трактуСтся ΠΊΠ°ΠΊ вычислСниС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² матСматичСском ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ послСдних (Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ). Π―Π·Ρ‹ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ эту ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡƒ – Haskell, Lisp.

Π―Π·Ρ‹ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ отнСсти Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ΅ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ свойств. Если язык Π½Π΅ являСтся чисто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ, Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ эти свойства, Ρ‚ΠΎ Π½Π° Π½Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ говорят, Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ стилС.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ЀП

  • Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса (First Class Object).

    Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ с функциями Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ β€” ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡ… Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄Ρ€ΡƒΠ³ΠΈΠΌ функциям, ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈ Ρ‚.ΠΏ.
  • ИспользованиС рСкурсии Π² качСствС основной структуры контроля ΠΏΠΎΡ‚ΠΎΠΊΠ° управлСния. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… языках Π½Π΅ сущСствуСт ΠΈΠ½ΠΎΠΉ конструкции Ρ†ΠΈΠΊΠ»Π°, ΠΊΡ€ΠΎΠΌΠ΅ рСкурсии.
  • АкцСнт Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ списков (lists, ΠΎΡ‚ΡΡŽΠ΄Π° Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Lisp β€” LISt Processing). Бписки с рСкурсивным ΠΎΠ±Ρ…ΠΎΠ΄ΠΎΠΌ подсписков часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² качСствС Π·Π°ΠΌΠ΅Π½Ρ‹ Ρ†ΠΈΠΊΠ»ΠΎΠ².
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка (High Order Functions). Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка – Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

    Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Python Π²Ρ…ΠΎΠ΄ΠΈΡ‚ достаточно ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ map. Она ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ Iterable ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, примСняСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ элСмСнту Iterable ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Iterator ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ всС ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ послС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ элСмСнты.

  • Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ β€œΡ‡ΠΈΡΡ‚Ρ‹ΠΌΠΈβ€ (Pure Functions) – Ρ‚.Π΅. Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов (ΠΈΠ½ΠΎΠ³Π΄Π° говорят: Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ сайд-эффСктов).

    Π’ Python это Π½Π΅ выполняСтся. НСобходимо ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ функция Π±Ρ‹Π»Π° чистой.

  • АкцСнт Π½Π° Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ вычислСно, Π° Π½Π΅ Π½Π° Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Ρ‹

НС всС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Ρ‹ Π½ΠΈΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ для понимания Π΄ΠΎΠΊΠ»Π°Π΄Π°, Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ для понимания ЀП (спасибо ΠΎΠ΄Π½ΠΎΠΌΡƒ Π΄Ρ€ΡƒΠ³Ρƒ Π·Π° ΠΈΡ… ΠΏΠΎΠ΄Π±ΠΎΡ€ΠΊΡƒ)

  • Бсылочная ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ.

    Бсылочная ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ β€” свойство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ любоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΎ вычислСнным ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π±Π΅Π· измСнСния повСдСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Бсылочная ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ позволяСт ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π±Π΅Π· измСнСния ΠΈΡ… повСдСния.

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

    • Π”Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅.

      ДСтСрминированная функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ для ΠΎΠ΄Π½ΠΈΡ… ΠΈ Ρ‚Π΅Ρ… ΠΆΠ΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

    • ЧистыС.

      Чистая функция трансформируСт Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΈ Π½Π΅ взаимодСйствуСт с ΠΌΠΈΡ€ΠΎΠΌ Π²Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ. ВсС чистыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹, Π½ΠΎ Π½Π΅ всС Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ чисты.

    • Π’ΠΎΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅.

      Π’ΠΎΡ‚Π°Π»ΡŒΠ½Π°Ρ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°.

      Π’ΠΎΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ всСгда Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ΡΡ ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

  • ΠšΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ β€” ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ

  • Π‘Π°ΠΉΠ΄ эффСкт.

    Π‘Π°ΠΉΠ΄ эффСкт Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ выраТСния Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ большСС, Ρ‡Π΅ΠΌ вычислСниС значСния. Π‘Π°ΠΉΠ΄ эффСкты β€” взаимодСйствия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ выраТСния. РаспространённыС сайд эффСкты Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² сСбя доступ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, доступ ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ, доступ ΠΊ сСти, систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ измСняСмой памяти ΠΈΠ»ΠΈ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ любоС ΠΈΠ· Π²Ρ‹ΡˆΠ΅ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Ρ… дСйствий.

  • ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ.

    ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ β€” ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ языков программирования, которая позволяСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ мноТСство Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌ. Рассмотрим ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²ΠΈΠ΄ΠΎΠ² ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ°.

    • ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ.

      ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ, ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌ, являСтся ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… языков программирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎ количСствСнно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ»ΠΈ нСскольким ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ Ρ‚ΠΈΠΏΠ°. Π’Π°ΠΊΠΈΠ΅ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠ°.

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

  • Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ (closure)

    Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ β€” ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° вмСстС с привязанной ΠΊ Π½Π΅ΠΉ ΡΠΎΠ²ΠΎΠΊΡƒΠΏΠ½ΠΎΡΡ‚ΡŒΡŽ Π΄Π°Π½Π½Ρ‹Ρ…. Β© Steve Majewski

    Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ β€” функция, которая ссылаСтся Π½Π° свободныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² своСй области видимости.

ВстроСнноС ЀП ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Python

Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ элСмСнты ЀП Π² Python β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ map(), reduce(), filter() ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ lambda. Π’ Python 1.x Π²Π²Π΅Π΄Π΅Π½Π° Ρ‚Π°ΠΊΠΆΠ΅ функция apply(), удобная для прямого примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊ списку, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Python 2.0 прСдоставляСт для этого ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π½Ρ‹ΠΉ синтаксис. Начиная с Python 2.3 считаСтся ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ, ΡƒΠ΄Π°Π»Π΅Π½Π° Π² Python 3.0

НСсколько Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ, Π½ΠΎ этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ всСго Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΏΠΎΡ‡Ρ‚ΠΈ достаточно для написания любой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Python; Π² частности, всС ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ утвСрТдСния (if, elif, else, assert, try, except, finally, for, break, continue, while, def) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ стилС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹. НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‡Π° Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ удалСния всСх ΠΊΠΎΠΌΠ°Π½Π΄ управлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΠ»Π΅Π·Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для прСдставлСния Π½Π° конкурс «Π½Π΅Π²Ρ€Π°Π·ΡƒΠΌΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Python» (с ΠΊΠΎΠ΄ΠΎΠΌ, выглядящим ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° Lisp’Π΅), стоит ΡƒΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ЀП Π²Ρ‹Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ структуры Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ.

Π’ соотвСтствии с Π²Ρ‹ΡˆΠ΅ΡΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ нСсколько Ρ…Π°ΠΊΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ наш ΠΊΠΎΠ΄ Π±Ρ‹Π» Π±ΠΎΠ»Π΅Π΅ Π€ΠŸΡˆΠ½Ρ‹ΠΉ. Избавимся ΠΎΡ‚ if/elif/else Π² Python

# Normal statement-based flow control
if <cond1>: 
    func1() 
elif <cond2>: 
    func2() 
else: 
    func3() 

    # Equivalent "short circuit" expression
(<cond1> and func1()) or (<cond2> and func2()) or (func3()) 

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Как Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ» skymorp, ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ ΡΠΎΠ±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ лишь Π² Ρ‚ΠΎΠΌ случаС, Ссли func1, func2 ΠΈ (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ) func3 Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ non falsy значСния. НапримСр, Ссли Π² качСствС func Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ½Ρ‚Ρ‹, Ρ‚ΠΎ послСднСС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (func3) Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ всСгда.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ lambda для присваивания Ρ‚Π°ΠΊΠΈΡ… условных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

pr = lambda s:s 
namenum = lambda x: (x==1 and pr("one")) or (x==2 and pr("two")) or (pr("other"))
assert namenum(1) == 'one' 
assert namenum(2) == 'two' 
assert namenum(3) == 'other'

Π—Π°ΠΌΠ΅Π½Π° Ρ†ΠΈΠΊΠ»ΠΎΠ² Π½Π° выраТСния Ρ‚Π°ΠΊ ΠΆΠ΅ проста, ΠΊΠ°ΠΊ ΠΈ Π·Π°ΠΌΠ΅Π½Π° условных Π±Π»ΠΎΠΊΠΎΠ². for ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ пСрСписана с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ map().

for e in lst:  
    func(e)      # statement-based loop

map(func,lst)    # map-based loop

Π’ΠΎ ΠΆΠ΅ самоС ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈ с функциями.

do_it = lambda f: f()

# let f1, f2, f3 (etc) be functions that perform actions

map(do_it, [f1,f2,f3])

ΠŸΠ΅Ρ€Π΅Π²Π΅ΡΡ‚ΠΈ while Π²ΠΏΡ€ΡΠΌΡƒΡŽ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС, Π½ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ получаСтся.

# statement-based while loop
while <cond>: 
    <pre-suite> 
    if <break_condition>: 
        break
    else: 
        <suite> 

# FP-style recursive while loop
def while_block(): 
    <pre-suite> 
    if <break_condition>: 
        return 1 
    else: 
        <suite> 
        return 0 

while_FP = lambda: (<cond> and while_block()) or while_FP() 
while_FP()

ЀП Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ while всС Π΅Ρ‰Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ while_block(), которая сама ΠΏΠΎ сСбС ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ выраТСния, Π½ΠΎ ΠΈ утвСрТдСния (statements). Но ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ дальнСйшСС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΉ Π² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°ΠΌΠ΅Π½Ρƒ Π±Π»ΠΎΠΊΠ° if/else Π² Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠΌ шаблонС).

К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅, обычная ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° мСстС (Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ while myvar == 7) вряд Π»ΠΈ окаТСтся ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π° (Π² прСдставлСнном Π²ΠΈΠ΄Π΅) Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ (хотя Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ Π² while_block()). Один ΠΈΠ· способов ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ условиС β€” Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ while_block() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ осмыслСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ с условиСм Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ.

Π‘Ρ‚ΠΎΠΈΡ‚ Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΉ:

# imperative version of "echo()"
def echo_IMP():
    while 1: 
        x = input("IMP -- ") 
        if x == 'quit': 
            break
        else:
            print(x) 

echo_IMP() 

# utility function for "identity with side-effect"
def monadic_print(x):
    print(x) 
    return x 
    # FP version of "echo()" 

echo_FP = lambda: monadic_print(input("FP -- ")) == 'quit' or echo_FP() 
echo_FP()

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Как Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ» skymorp, Π² случаС с ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ стилСм, print Π½Π΅ вызываСтся, Ссли input("IMP -- ") == 'quit'. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ print вызываСтся всСгда.

ΠœΡ‹ достигли Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Ρ€Π°Π·ΠΈΠ»ΠΈ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΡƒΡŽ Π²Π²ΠΎΠ΄/Π²Ρ‹Π²ΠΎΠ΄, Ρ†ΠΈΠΊΠ»Ρ‹ ΠΈ условия Π² Π²ΠΈΠ΄Π΅ чистого выраТСния с рСкурсиСй (фактичСски β€” Π² Π²ΠΈΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈ нСобходимости ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ΠΊΡƒΠ΄Π° ΡƒΠ³ΠΎΠ΄Π½ΠΎ).

ΠœΡ‹ всС Π΅Ρ‰Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡΠ»ΡƒΠΆΠ΅Π±Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ monadic_print(), Π½ΠΎ эта функция ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ общая ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Π»ΡŽΠ±Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… выраТСниях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ создадим ΠΏΠΎΠ·ΠΆΠ΅. Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ любоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, содСрТащСС monadic_print(x) вычисляСтся Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½ΠΎ содСрТало просто x.

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

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, просто вовсС Π½Π΅ присваивая значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ.

# Nested loop procedural style for finding big products 
xs = (1,2,3,4) 
ys = (10,15,3,22) 
bigmuls = [] 
# ...more stuff...
for x in xs: 
    for y in ys: 
        # ...more stuff...
        if x*y > 25: 
            bigmuls.append((x,y)) 
        # ...more stuff...
    # ...more stuff...
    print(bigmuls)

Π‘Π΅ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠ°ΠΊ #...more stuff... β€” мСста, Π³Π΄Π΅ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты с наибольшСй Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ ошибкам.

Π’ любой ΠΈΠ· этих Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ xs, ys, bigmuls, x, y ΠΌΠΎΠ³ΡƒΡ‚ приобрСсти Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹Π΅ значСния Π² гипотСтичСском ΠΊΠΎΠ΄Π΅. Π”Π°Π»Π΅Π΅, послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ этого куска ΠΊΠΎΠ΄Π° всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒΡΡ, Π° ΠΌΠΎΠ³ΡƒΡ‚ ΠΈ Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒΡΡ ΠΏΠΎΡΠ΄Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ.

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ инкапсуляция Π² функциях/ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… ΠΈ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ этого Ρ€ΠΎΠ΄Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ всСгда ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ (del) ваши ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ послС использования.

Но Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ошибок вСсьма ΠΎΠ±Ρ‹Ρ‡Π΅Π½. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ Π·Π°Π΄Π°Ρ‡Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ошибки, связанныС с ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌΠΈ эффСктами. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ:

bigmuls = lambda xs,ys: filter(lambda (x,y):x*y > 25, combine(xs,ys))
combine = lambda xs,ys: map(None, xs*len(ys), dupelms(ys,len(xs)))
dupelms = lambda lst,n: reduce(lambda s,t:s+t, map(lambda l,n=n: [l]*n, lst))
print(bigmuls((1,2,3,4),(10,15,3,22)))

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

print([(x,y) for x in (1,2,3,4) for y in (10,15,3,22) if x*y > 25])

Π”Π°, всё Π²Π΅Ρ€Π½ΠΎ, list, tuple, set, dict comprehensions ΠΈ generator expressions β€” ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ЀП Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, ΠΊΠ°ΠΊ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅, ΠΏΠ΅Ρ€Π΅ΠΊΠΎΡ‡Π΅Π²Π°Π»ΠΎ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π½Π΅-ЀП языки

Π‘Ρ€Π°Π·Ρƒ оговоримся, Ρ‡Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° достаточно старая ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ лишь для Python 2, ΠΎΠ΄Π½Π°ΠΊΠΎ для ознакомлСния Π΅Ρ‘ достаточно. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Xoltar Toolkit Π‘Ρ€ΠΈΠ½Π° ΠšΠ΅Π»Π»Π΅Ρ€Π° (Bryn Keller) ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ Π½Π°ΠΌ большС возмоТностСй ЀП.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ возмоТности ЀП ΠšΠ΅Π»Π»Π΅Ρ€ прСдставил Π² Π²ΠΈΠ΄Π΅ нСбольшого эффСктивного модуля Π½Π° чистом Python. Помимо модуля functional, Π² Xoltar Toolkit Π²Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ lazy, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ структуры, вычисляСмыС «Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ». ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… языков программирования ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ вычислСниС, поэтому эти ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Xoltar Toolkit прСдоставят Π²Π°ΠΌ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ языкС Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Haskell.

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

>>> car = lambda lst: lst[0] 
>>> cdr = lambda lst: lst[1:] 
>>> sum2 = lambda lst: car(lst)+car(cdr(lst)) 
>>> sum2(range(10))
1 
>>> car = lambda lst: lst[2] 
>>> sum2(range(10))
5

К Π½Π΅ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ sum2(range(10)) вычисляСтся ΠΊ Ρ€Π°Π·Π½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ Π² Π΄Π²ΡƒΡ… мСстах ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ измСняСмыми ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ.

К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, ΠΌΠΎΠ΄ΡƒΠ»ΡŒ functional прСдоставляСт класс Bindings, ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΉ Ρ‚Π°ΠΊΠΎΠ΅ пСрСприсваиваниС.

>>> from functional import * 
>>> let = Bindings() 
>>> let.car = lambda lst: lst[0] 
>>> let.car = lambda lst: lst[2] 
Traceback (innermost last): 
    File "<stdin>", 
        line 1, in ? File "d:\tools\functional.py", 
        line 976, in __setattr__ raise BindingError, "Binding '%s' cannot be modified." % name 
        functional.BindingError: Binding 'car' cannot be modified. >>> car(range(10)) 0

РазумССтся, Ρ€Π΅Π°Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ BindingError, ΠΎΠ΄Π½Π°ΠΊΠΎ сам Ρ„Π°ΠΊΡ‚ Π΅Π³ΠΎ возбуТдСния позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Ρ†Π΅Π»ΠΎΠ³ΠΎ класса ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° returns

Π£ΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ соврСмСнная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, прСдлагаСмая Никитой Π‘ΠΎΠ±ΠΎΠ»Π΅Π²Ρ‹ΠΌ, нашим соотСчСствСнником, Ρ‚Π°ΠΊΠΆΠ΅ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ возмоТности ЀП Π² Python. Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ maybe позволяСт ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ

from returns.maybe import Maybe, maybe
@maybe  # decorator to convert existing Optional[int] to Maybe[int]
def bad_function() -> Optional[int]:
    ...
    maybe_number: Maybe[float] = bad_function().map(
    lambda number: number / 2,
    )
# => Maybe will return Some[float] only if there's a non-None value
#    Otherwise, will return Nothing

Π‘ΠΎΠ»Π΅Π΅ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ· ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ стиля Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

# Imperative style
user: Optional[User]
discount_program: Optional['DiscountProgram'] = None
if user is not None:
     balance = user.get_balance()
     if balance is not None:
         credit = balance.credit_amount()
         if credit is not None and credit > 0:
            discount_program = choose_discount(credit)

# same with returns

user: Optional[User]
# Type hint here is optional, it only helps the reader here:
discount_program: Maybe['DiscountProgram'] = Maybe.from_value(
    user,
    ).map(  # This won't be called if `user is None`
    lambda real_user: real_user.get_balance(),
    ).map(  # This won't be called if `real_user.get_balance()` returns None
    lambda balance: balance.credit_amount(),
    ).map(  # And so on!
    lambda credit: choose_discount(credit) if credit > 0 else None,
    )

Или, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, позволяСт ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½

# Imperative style
def fetch_user_profile(user_id: int) -> 'UserProfile':
    """Fetches UserProfile dict from foreign API."""
    response = requests.get('/api/users/{0}'.format(user_id))
    # What if we try to find user that does not exist?
    # Or network will go down? Or the server will return 500?
    # In this case the next line will fail with an exception.
    # We need to handle all possible errors in this function
    # and do not return corrupt data to consumers.
    response.raise_for_status()
    # What if we have received invalid JSON?
    # Next line will raise an exception!
    return response.json()

И Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ returns

import requests
from returns.result import Result, safe
from returns.pipeline import flow
from returns.pointfree import bind
def fetch_user_profile(user_id: int) -> Result['UserProfile', Exception]:
    """Fetches `UserProfile` TypedDict from foreign API."""
    return flow(
        user_id,
        _make_request,
        bind(_parse_json),
    )

@safe
def _make_request(user_id: int) -> requests.Response:
    response = requests.get('/api/users/{0}'.format(user_id))
    response.raise_for_status()
    return response

@safe
def _parse_json(response: requests.Response) -> 'UserProfile':
    return response.json()

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ чистый, бСзопасный ΠΈ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ способ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ потрСбности нашСго бизнСса: ΠœΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ с запроса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Π΅Ρ€ΠΏΠ΅Ρ‚ΡŒ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚, Π·Π°Ρ‚Π΅ΠΌ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π΅ΠΌ ΠΎΡ‚Π²Π΅Ρ‚, Ссли запрос Π±Ρ‹Π» ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΌ, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

ВмСсто ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ значСния, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, благодаря Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρƒ @safe. Он Π²Π΅Ρ€Π½Π΅Ρ‚ Success [YourType] ΠΈΠ»ΠΈ Failure [Exception]. И Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ бросит Π½Π°ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅!

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ ΠΈΠ· Π΅Ρ‘ достаточно большой ΠΈ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π² Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π΅.

ΠŸΡ€ΠΈΠΌ. Π―, ΠΊΠ°ΠΊ Π°Π²Ρ‚ΠΎΡ€ этой ΡΡ‚Π°Ρ‚ΡŒΠΈ, Π½Π΅ использовал returns Π² ΠΏΡ€ΠΎΠ΄Π΅ ΠΈ Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Ρƒ ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π½ΠΎ Π½Π΅ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ ΠΎΠ± этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ просто нСльзя.

Π›ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π°

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ β€” ΠΏΠΎ сути являСтся ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π’ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ встрСчаСтся ΠΏΠΎΠ²ΡΡŽΠ΄Ρƒ.

>>> for x in [1,4,5,10]:
... print(x, end=' ')
...
1 4 5 10

Π’Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, итСрация ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌ Ρ‚ΠΈΠΏΠ°ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ спискам). ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ β€” рСализация ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°

>>> items = [1, 4, 5]
>>> it = iter(items)
>>> it.__next__()
1
>>> it.__next__()
4
>>> it.__next__()
5
>>> it.__next__()

Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ.

for x in obj:
    # statements

ΠŸΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

_iter = iter(obj) # Get iterator object
while 1:
    try:
        x = _iter.__next__() # Get next item
    except StopIteration: # No more items
        break
    # statements

ЀактичСски, любой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ iter() называСтся ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ. Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π² своём классС, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ __iter__() ΠΈ __next__().

НапримСр, посмотрим, ΠΊΠ°ΠΊ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅:

>>> for x in Countdown(10):
... print(x, end=' ')
...
10 9 8 7 6 5 4 3 2 1

Π•Π³ΠΎ рСализация Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ²Π°:

class Countdown(object):
    def __init__(self,start):
        self.start = start
    def __iter__(self):
        return CountdownIter(self.start)

class CountdownIter(object):
    def __init__(self, count):
        self.count = count
    def __next__(self):
        if self.count <= 0:
            raise StopIteration
        r = self.count
        self.count -= 1
        return r

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ β€” функция, которая Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² вмСсто ΠΎΠ΄Π½ΠΎΠ³ΠΎ значСния

def countdown(n):
    while n > 0:
        yield n
        n -= 1

ВмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΌΡ‹ создаём ΡΠ΅Ρ€ΠΈΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ (с использованиСм ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° yield). Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° создаСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€. Однако функция Π½Π΅ запускаСтся.

def countdown(n):
    print("Counting down from", n)
    while n > 0:
        yield n
        n -= 1
>>> x = countdown(10)
>>> x
<generator object at 0x58490>
>>>

Ѐункция Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ выполняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ __next__().

>>> x = countdown(10)
>>> x
<generator object at 0x58490>
>>> x.__next__()
Counting down from 10
10
>>>

yield Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½ΠΎ приостанавливаСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Ѐункция Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ возобновляСтся ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ __next__(). ΠŸΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° возбуТдаСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ StopIteration.

>>> x.__next__()
9
>>> x.__next__()
8
>>>
...
>>> x.__next__()
1
>>> x.__next__()
Traceback (most recent call last):
    File "<stdin>", line 1, in ?
        StopIteration
>>>

НСбольшиС Π²Ρ‹Π²ΠΎΠ΄Ρ‹:

  • Ѐункция Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ β€” Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ способ написания ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°
  • Π’Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° (__next__, __iter__ ΠΈ Ρ‚. Π΄.), Ρ‚.ΠΊ. ΠΏΡ€ΠΈ создании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с yield магия Python ΡƒΠΆΠ΅ добавляСт Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹.
>>> def x():
...     return 1
... 
>>> def y():
...     yield 1
... 
>>> [i for i in dir(y()) if i not in dir(x())]
['__del__', '__iter__', '__name__', '__next__', '__qualname__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'gi_yieldfrom', 'send', 'throw']

Помимо Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ generator object.

>>> a = [1,2,3,4]
>>> b = (2*x for x in a)
>>> b
<generator object at 0x58760>
>>> for i in b: print(b, end=' ')
...
2 4 6 8

Бинтаксис Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ выраТСния Ρ‚Π°ΠΊΠΆΠ΅ прост

(expression for i in s if condition)
# the same with
for i in s:
    if condition:
        yield expression

Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ vs ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

Ѐункция Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ отличаСтся ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ. Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ β€” разовая опСрация. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Ρ‚ΡŒ сгСнСрированныС Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Π½ΠΎ Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это снова, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ снова Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€. Π­Ρ‚ΠΎ отличаСтся, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΡ‚ списка (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·, сколько Ρ…ΠΎΡ‚ΠΈΠΌ)

Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΊΠ°ΠΊ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ Π΄Π²Π° основных ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±Π»ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ для создания ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π°. НапримСр, имССтся Π·Π°Π΄Π°Ρ‡Π°:

Π£Π·Π½Π°ΠΉΡ‚Π΅, сколько Π±Π°ΠΉΡ‚ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π±Ρ‹Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ, суммируя послСдний столбСц Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ Π²Π΅Π±-сСрвСра Apache. И Π΄Π°, Ρ€Π°Π·ΠΌΠ΅Ρ€ Π»ΠΎΠ³ Ρ„Π°ΠΉΠ»Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Ρ€ΡΡ‚ΡŒΡΡ Π² Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚Π°Ρ…

КаТдая строка Π² Π»ΠΎΠ³Π°Ρ… выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

81.107.39.38 - ... "GET /ply/ply.html HTTP/1.1" 200 97238

Число Π±Π°ΠΉΡ‚ΠΎΠ² находится Π² послСднСй ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅:

bytes_sent = line.rsplit(None,1)[1]

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ число ΠΈΠ»ΠΈ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

81.107.39.38 - ... "GET /ply/ HTTP/1.1" 304 -

Π‘ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² число

if bytes_sent != '-':
    bytes_sent = int(bytes_sent)

Π’ ΠΈΡ‚ΠΎΠ³Π΅, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄

with open("access-log") as wwwlog:
    total = 0
    for line in wwwlog:
        bytes_sent = line.rsplit(None,1)[1]
        if bytes_sent != '-':
            total += int(bytes_sent)
    print("Total", total)

ΠœΡ‹ Ρ‡ΠΈΡ‚Π°Π΅ΠΌ строка Π·Π° строкой ΠΈ обновляСм сумму. Но это старый ΡΡ‚ΠΈΠ»ΡŒ. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ эту Π·Π°Π΄Π°Ρ‡Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ².

with open("access-log") as wwwlog:
    bytecolumn = (line.rsplit(None,1)[1] for line in wwwlog)
    bytes_sent = (int(x) for x in bytecolumn if x != '-')
    print("Total", sum(bytes_sent))

Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ отличаСтся ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ, мСньшС строк, Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΡΡ‚ΠΈΠ»ΡŒ ΠœΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½

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

БСзусловно, этот Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ‚ разновидности ΠΏΡ€ΠΈΡ‡ΡƒΠ΄Π»ΠΈΠ²ΠΎΠΉ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΉ ΠΌΠ°Π³ΠΈΠΈ. Π€Π°ΠΉΠ» ΠΈΠ· 1.3 Π“Π‘ ΠΊΠΎΠ΄ Π² старом стилС Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ» Π·Π° 18.6 сСкунд, ΠΊΠΎΠ΄ Π½Π° Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… Π±Ρ‹Π» Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Π·Π° 16,7 сСкунд.

AWK с Ρ‚ΠΎΠΉ ΠΆΠ΅ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ справился Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π΅Π΅, Π·Π° 70.5 сСкунд

awk '{ total += $NF } END { print total }' big-access-log

НСбольшиС Π²Ρ‹Π²ΠΎΠ΄Ρ‹:

  • Π­Ρ‚ΠΎ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Π½ΠΎ ΠΈ Π½Π° 10% быстрСС, Ρ‡Π΅ΠΌ старый ΡΡ‚ΠΈΠ»ΡŒ
  • МСньшС ΠΊΠΎΠ΄Π°
  • Код ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ читаСтся
  • И, чСстно говоря, ΠΌΠ½Π΅ ΠΎΠ½ нравится Π² Ρ†Π΅Π»ΠΎΠΌ большС
  • Ни Ρ€Π°Π·Ρƒ Π² нашСм Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ с Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ Π½Π΅ создавали большиС Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ списки
  • Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ быстрСС, Π½ΠΎ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ
  • ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ конкурСнтоспособСн с Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ инструмСнтами

Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ основано Π½Π° ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ. Π§Ρ‚ΠΎ, Ссли Π±Ρ‹ Ρƒ нас Π±Ρ‹Π»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ Π²ΠΈΠ΄Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² для Ρ€Π°Π±ΠΎΡ‚Ρ‹? Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Π²ΠΈΠ΄Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, просто ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠ² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π΄Ρ€ΡƒΠ³ Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ.

ΠšΠΎΠ½Ρ†Π΅ΠΏΡ‚ yield from

‘yield from’ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для дСлСгирования ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ

def countdown(n):
    while n > 0:
        yield n
        n -= 1

def countup(stop):
    n = 1
    while n < stop:
        yield n
        n += 1

def up_and_down(n):
    yield from countup(n)
    yield from countdown(n)

>>> for x in up_and_down(3):
... print(x)
...
1
2
3
2
1
>>>

Π’Π°ΠΊΠΆΠ΅ стоит ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΡ… вСрсиях python (3.5 ΠΈ Π½ΠΈΠΆΠ΅) yield from Ρ‚Π°ΠΊΠΆΠ΅ использовался вмСсто await, ΠΏΠΎΠΊΠ° await Π½Π΅ стал Π½ΠΎΠ²Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ словом, Ρ‚.ΠΊ. await β€” ΠΏΠΎ сути, просто ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° контСкста управлСния Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π²ΠΎΠ·Π»Π°Π³Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ отвСтствСнности Π½Π° yield from ΠΈ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ слово β€” await.

ΠœΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… (ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, броадкастинг)

Π—Π°Π΄Π°Ρ‡Π° β€” ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΠ· Ρ€Π°Π·Π½Ρ‹Ρ… источников, ΠΈ Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ нСскольким потрСбитСлям

На Π΄Π°Π½Π½ΠΎΠΉ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ потрСбуСтся ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (всё Π² ΠΎΠ΄Π½ΠΎ) ΠΈ броадкастинг (ΠΎΠ΄Π½ΠΎ Π²ΠΎ всё). Π§Ρ‚ΠΎ ΠΆ, Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Ρ‚ΠΎΠΌΠΈΡ‚ΡŒ ΠΈ напишСм сразу Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.


# same with `tail -f`

def follow(thefile):
    thefile.seek(0, os.SEEK_END) # End-of-file
    while True:
        line = thefile.readline()
        if not line:
            time.sleep(0.1) # Sleep briefly
            continue
        yield line

def gen_cat(sources):
    # Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для распаковки Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ списка Π² плоский
    for src in sources:
        yield from src

def genfrom_queue(thequeue):
    while True:
        item = thequeue.get()
        if item is StopIteration:
            break
        yield item

def sendto_queue(source, thequeue):
    for item in source:
        thequeue.put(item)
    thequeue.put(StopIteration)

def multiplex(sources):
    in_q = queue.Queue()
    consumers = []
    for src in sources:
        thr = threading.Thread(target=sendto_queue, args=(src, in_q))
        thr.start()
        consumers.append(genfrom_queue(in_q))
    return gen_cat(consumers)

def broadcast(source, consumers):
    for item in source:
        for c in consumers:
            c.send(item)

class Consumer(object):
    def send(self,item):
        print(self, "got", item)

if __name__ == '__main__':
    c1 = Consumer()
    c2 = Consumer()
    c3 = Consumer()

    log1 = follow(open("foo/access-log"))
    log2 = follow(open("bar/access-log"))
    log3 = follow(open("baz/access-log"))

    lines = multiplex([log1, log2, log3])

    broadcast(lines,[c1,c2,c3])

Как ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ ΠΈΠ· этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° β€” Π½ΠΈΡ‡Π΅Π³ΠΎ слоТного Π² этом Π½Π΅Ρ‚, Π²ΠΏΠΎΠ»Π½Π΅ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ самыС Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ трСйсинга Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°

Π’ΡƒΡ‚ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ достаточно простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли Ρƒ тСбя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ сотня Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ Π½Π΅ понятно, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΈΠ· Π½ΠΈΡ… происходит сбой, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΈΠ½Ρ‚Π°.

def trace(source):
    for item in source:
        print(item)
        yield item

lines = follow(open("access-log"))
log = trace(apache_log(lines))
r404 = trace(r for r in log if r['status'] == 404)

Как ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ β€” Ρ‚Π°ΠΊΠΎΠΉ Π΄Π΅Π±Π°Π³ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π² любой ΠΈΠ· Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², Π½Π΅ измСняя Π΅Π³ΠΎ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, вывСдя Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ инструмСнты Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ²ΡΡŽΠ΄Ρƒ Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅. Начиная с 3.0 ΠΈΡ… ΡΡ‚Π°Ρ€Π°ΡŽΡ‚ΡΡ Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ повсСмСстно. НапримСр, pathlib.Path.rglob, glob.iglob, os.walk, range, map, filter. Π•ΡΡ‚ΡŒ Π΄Π°ΠΆΠ΅ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π° Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… β€” itertools.

Π’Ρ‹Π²ΠΎΠ΄Ρ‹

ΠŸΠ»ΡŽΡΡ‹:

  • Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ β€” нСвСроятно ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ инструмСнт для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ½ΠΎΠ³ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ
  • Π‘ΠΈΠ»Π° исходит ΠΎΡ‚ способности Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Ρ‹
  • МоТно ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π°Ρ…
  • НСбольшиС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ просто ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ…
  • Намного ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сдСлано с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ООП шаблонов
  • МоТно Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ идСю ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ΠΎΠ² Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… направлСниях (ΡΠ΅Ρ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹)

ΠœΠΈΠ½ΡƒΡΡ‹

  • ИспользованиС этого стиля программирования Ρƒ нСпосвящСнных ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π²Π·Ρ€Ρ‹Π²Ρƒ Π³ΠΎΠ»ΠΎΠ²Ρ‹
  • ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок слоТна, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρƒ нас ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², связанных вмСстС
  • НСобходимо ΡƒΠ΄Π΅Π»ΡΡ‚ΡŒ особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅, надСТности ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ вопросам.

Π›ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π°

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

Как ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ссли ΠΌΡ‹ пишСм ΠΊΠΎΠ΄ Π½Π° Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ…, Ρ‚ΠΎ ΠΎΠ½ получаСтся Π²ΠΏΠΎΠ»Π½Π΅ сСбС Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ. МоТно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ Π½Π° Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… β€” Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ стСпСни ЀП, Ρ‚Π°ΠΊ элСгантно вошСдший Π² Python.

Наша главная Π·Π°Π΄Π°Ρ‡Π° β€” ΠΏΠΈΡΠ°Ρ‚ΡŒ ясный, понятный, красивый, тСстируСмый ΠΊΠΎΠ΄ ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ для этого подходящиС инструмСнты. ЀП β€” Π½Π΅ ΡΠ°ΠΌΠΎΡ†Π΅Π»ΡŒ, Π° лишь срСдство, ΠΊΠ°ΠΊ ΠΈ всСгда, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΡ‡ΡŒ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ Π»ΡƒΡ‡ΡˆΠΈΠΉ ΠΊΠΎΠ΄!

Если нашли ошибки, ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌΠΌΠ΅ Niccolum ΠΈΠ»ΠΈ Π½Π° ΠΏΠΎΡ‡Ρ‚Ρƒ [email protected]. Π‘ΡƒΠ΄Ρƒ Ρ€Π°Π΄ конструктивной ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠ΅.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° языкС Python

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

Python β€” свободно распространяСмый, ΠΎΡ‡Π΅Π½ΡŒ высокоуровнСвый ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ язык, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ Π“Π²ΠΈΠ΄ΠΎ Π²Π°Π½ Россумом (Guido van Rossum). Он сочСтаСт ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ синтаксис с ΠΌΠΎΡ‰Π½ΠΎΠΉ (Π½ΠΎ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ сСмантикой. Python доступСн ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π° всСх ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π½Ρ‹Π½Π΅ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… ΠΈ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ высокой ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒΡŽ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ.

Π›ΡƒΡ‡ΡˆΠ΅ всСго Π½Π°Ρ‡Π°Ρ‚ΡŒ с Ρ‚Ρ€ΡƒΠ΄Π½Π΅ΠΉΡˆΠ΅Π³ΠΎ вопроса β€” Π° Ρ‡Ρ‚ΠΎ, собствСнно, Ρ‚Π°ΠΊΠΎΠ΅ Β«Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (FP)Β»? Один ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² β€” «это ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π½Π° языкС Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Lisp, Scheme, Haskell, ML, OCAML, Clean, Mercury ΠΈΠ»ΠΈ Erlang (ΠΈΠ»ΠΈ Π΅Ρ‰Π΅ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ…)Β». Π­Ρ‚ΠΎΡ‚ ΠΎΡ‚Π²Π΅Ρ‚, бСзусловно, Π²Π΅Ρ€Π΅Π½, Π½ΠΎ Π½Π΅ сильно проясняСт ΡΡƒΡ‚ΡŒ. К соТалСнию, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ‚ΠΊΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠ΅ FP, оказываСтся ΠΎΡ‡Π΅Π½ΡŒ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄Π°ΠΆΠ΅ срСди собствСнно Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… программистов. ВспоминаСтся ΠΏΡ€ΠΈΡ‚Ρ‡Π° ΠΎ Ρ‚Ρ€Π΅Ρ… слСпцах ΠΈ слонС. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ FP, противопоставив Π΅Π³ΠΎ Β«ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽΒ» (Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄Π΅Π»Π°Π΅Ρ‚Π΅ Π½Π° языках Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ C, Pascal, C++, Java, Perl, Awk, TCL ΠΈ Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… β€” ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅Π΅ ΠΌΠ΅Ρ€Π΅, большСй Ρ‡Π°ΡΡ‚ΡŒΡŽ).

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

* Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса. Π’.Π΅., всС, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ с Β«Π΄Π°Π½Π½Ρ‹ΠΌΠΈΒ», ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΈ с функциями (Π²Ρ€ΠΎΠ΄Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°).
* ИспользованиС рСкурсии Π² качСствС основной структуры контроля ΠΏΠΎΡ‚ΠΎΠΊΠ° управлСния. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… языках Π½Π΅ сущСствуСт ΠΈΠ½ΠΎΠΉ конструкции Ρ†ΠΈΠΊΠ»Π°, ΠΊΡ€ΠΎΠΌΠ΅ рСкурсии.
* АкцСнт Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ списков (lists, ΠΎΡ‚ΡΡŽΠ΄Π° Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Lisp β€” LISt Processing). Бписки с рСкурсивным ΠΎΠ±Ρ…ΠΎΠ΄ΠΎΠΌ подсписков часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² качСствС Π·Π°ΠΌΠ΅Π½Ρ‹ Ρ†ΠΈΠΊΠ»ΠΎΠ².
* «ЧистыС» Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ языки ΠΈΠ·Π±Π΅Π³Π°ΡŽΡ‚ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов. Π­Ρ‚ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΏΠΎΡ‡Ρ‚ΠΈ повсСмСстно распространСнный Π² ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… языках ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ значСния для отслСТивания состояния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.
* FP Π½Π΅ одобряСт ΠΈΠ»ΠΈ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ утвСрТдСния (statements), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ вмСсто этого вычислСниС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ (Ρ‚.Π΅. Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ). Π’ ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ случаС, ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (плюс Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ опрСдСлСния).
* FP акцСнтируСтся Π½Π° Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ вычислСно, Π° Π½Π΅ ΠΊΠ°ΠΊ.
* Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ FP ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ «высокого порядка» (Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ функциями, ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌΠΈ функциями).

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

Python ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ характСристик Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования, начиная с вСрсии Python 1.0. Но, ΠΊΠ°ΠΊ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ возмоТностСй Python, ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² ΠΎΡ‡Π΅Π½ΡŒ смСшанном языкС. Π’Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ возмоТностями Python, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ, ΠΈ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ (ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΎ Π²Π°ΠΌ Π½Π΅ понадобится). Π’ Python 2.0 Π±Ρ‹Π»ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ΅ «синтаксичСскоС ΡƒΠΊΡ€Π°ΡˆΠ΅Π½ΠΈΠ΅Β» β€” списочныС встраивания (list comprehensions). Π₯отя ΠΈ Π½Π΅ добавляя ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй, списочныС встраивания Π΄Π΅Π»Π°ΡŽΡ‚ использованиС ΠΌΠ½ΠΎΠ³ΠΈΡ… старых возмоТностСй Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ приятнСС.

Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ элСмСнты FP Π² Python β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ map(), reduce(), filter() ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ lambda. Π’ Python 1.x Π²Π²Π΅Π΄Π΅Π½Π° Ρ‚Π°ΠΊΠΆΠ΅ функция apply(), удобная для прямого примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊ списку, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Python 2.0 прСдоставляСт для этого ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π½Ρ‹ΠΉ синтаксис. НСсколько Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ, Π½ΠΎ этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ всСго Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΏΠΎΡ‡Ρ‚ΠΈ достаточно для написания любой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Python; Π² частности, всС ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ утвСрТдСния (β€˜if’, β€˜elif’, β€˜else’, β€˜assert’, β€˜try’, β€˜except’, β€˜finally’, β€˜for’, β€˜break’, β€˜continue’, β€˜while’, β€˜def’) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ стилС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹. НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‡Π° Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ удалСния всСх ΠΊΠΎΠΌΠ°Π½Π΄ управлСния ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΠ»Π΅Π·Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для прСдставлСния Π½Π° конкурс Β«Π½Π΅Π²Ρ€Π°Π·ΡƒΠΌΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ PythonΒ» (с ΠΊΠΎΠ΄ΠΎΠΌ, выглядящим ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° Lisp’С), стоит ΡƒΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ FP Π²Ρ‹Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ структуры Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ.

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, ΠΎ Ρ‡Π΅ΠΌ стоит Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ Π² нашСм ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΈ β€” Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Python Β«Π·Π°ΠΌΡ‹ΠΊΠ°Π΅Ρ‚ Π½Π°ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΒ» вычислСниС логичСских Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.1 ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, это прСдоставляСт эквивалСнт Π±Π»ΠΎΠΊΠ° β€˜if’/’elif’/’else’ Π² Π²ΠΈΠ΄Π΅ выраТСния. Π˜Ρ‚Π°ΠΊ:

#------ "ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ·Π°ΠΌΠΊΠ½ΡƒΡ‚Ρ‹Π΅" условныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π² Python -----#
# ΠžΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ конструкции 
if <cond1>: func1()
elif <cond2>: func2()
else: func3()

# Π­ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½ΠΎΠ΅ "Π½Π°ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ Π·Π°ΠΌΠΊΠ½ΡƒΡ‚ΠΎΠ΅" Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅
(<cond1> and func1()) or (<cond2> and func2()) or (func3())

# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ "Π½Π°ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ Π·Π°ΠΌΠΊΠ½ΡƒΡ‚ΠΎΠ³ΠΎ" выраТСния
>>> x = 3
>>> def pr(s): return s
>>> (x==1 and pr('one')) or (x==2 and pr('two')) or (pr('other'))
'other'
>>> x = 2
>>> (x==1 and pr('one')) or (x==2 and pr('two')) or (pr('other'))
'two'

Казалось Π±Ρ‹, наша вСрсия условных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ β€” Π½Π΅ Π±ΠΎΠ»Π΅Π΅, Ρ‡Π΅ΠΌ салонный фокус; ΠΎΠ΄Π½Π°ΠΊΠΎ всС становится Π³ΠΎΡ€Π°Π·Π΄ΠΎ интСрСснСй, Ссли ΡƒΡ‡Π΅ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ lambda ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ выраТСния! Π Π°Π·, ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ, выраТСния ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ условныС Π±Π»ΠΎΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ lambda позволяСт Π² ΠΎΠ±Ρ‰Π΅ΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ условныС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния. Π‘Π°Π·ΠΈΡ€ΡƒΡΡΡŒ Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

#--------- Lambda с ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ·Π°ΠΌΠΊΠ½ΡƒΡ‚Ρ‹ΠΌΠΈ условными выраТСниями Π² Python -------#
>>> pr = lambda s:s
>>> namenum = lambda x: (x==1 and pr("one")) 
... or (x==2 and pr("two")) 
... or (pr("other"))
>>> namenum(1)
'one'
>>> namenum(2)
'two'
>>> namenum(3)
'other'

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΡƒΠΆΠ΅ Π·Π°ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎΠ²Π°Π»ΠΈ, хотя ΠΈ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, статус Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса Π² Python. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ, создав ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ lambda, ΠΌΡ‹ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π»ΠΈ Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ ΠΎΠ±Ρ‰Π΅Π΅ дСйствиС. ΠœΡ‹ ΠΈΠΌΠ΅Π»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ наш ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊ ΠΈΠΌΠ΅Π½Π°ΠΌ pr ΠΈ namenum Π² точности Ρ‚Π΅ΠΌ ΠΆΠ΅ способом, ΠΊΠ°ΠΊ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΊ этим ΠΈΠΌΠ΅Π½Π°ΠΌ число 23 ΠΈΠ»ΠΈ строку Β«spamΒ». Но Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ число 23 ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π΅ привязывая Π½ΠΈ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½ΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ), ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, созданный lambda, Π½Π΅ привязывая Π½ΠΈ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½ΠΈ. Ѐункция Π² Python β€” всСго лишь Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.

Π“Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ с нашими ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса β€” ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΠΈΡ… Π²ΠΎ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ map(), reduce() ΠΈ filter(). КаТдая ΠΈΠ· этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. map() примСняСт ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ элСмСнту Π² ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠΌ спискС (списках) ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². reduce() примСняСт ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π² спискС ΠΈ ΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌΡƒ Π½Π°ΠΊΠΎΠΏΠΈΡ‚Π΅Π»ΡŽ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°; Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, reduce(lambda n,m:n*m, range(1,10)) ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ 10! (Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» 10 β€” ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ умноТСния). filter() примСняСт ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ элСмСнту списка ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список Ρ‚Π΅Ρ… элСмСнтов исходного списка, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… пСрСданная функция Π²Π΅Ρ€Π½ΡƒΠ»Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ истинности. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ часто ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ нашим собствСнным функциям, Π½ΠΎ Ρ‡Π°Ρ‰Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ комбинациям Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹Ρ… встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

ΠšΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΡƒΡ Ρ‚Ρ€ΠΈ этих встроСнных FP-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊΠ° управлСния, Π½Π΅ прибСгая ΠΊ утвСрТдСниям (statements), Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ лишь выраТСния.

Π—Π°ΠΌΠ΅Π½Π° Ρ†ΠΈΠΊΠ»ΠΎΠ² Π½Π° выраТСния Ρ‚Π°ΠΊ ΠΆΠ΅ проста, ΠΊΠ°ΠΊ ΠΈ Π·Π°ΠΌΠ΅Π½Π° условных Π±Π»ΠΎΠΊΠΎΠ². β€˜for’ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΏΡ€ΡΠΌΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½ΠΎ Π² map(). Π’Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ с условным Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ, Π½Π°ΠΌ понадобится ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΉ Π΄ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (ΠΌΡ‹ Π±Π»ΠΈΠ·ΠΊΠΈ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Π΄Π΅Π»Π°Ρ‚ΡŒ это Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС):

#---------- Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» 'for' Π² Python ----------#
for e in lst: func(e) # Ρ†ΠΈΠΊΠ» Π½Π° ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΈ 'for'
map(func,lst) # Ρ†ΠΈΠΊΠ», основанный Π½Π° map()

ΠšΡΡ‚Π°Ρ‚ΠΈ, похоТая Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° примСняСтся для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄. Π’.Π΅., ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ большСй части состоит ΠΈΠ· ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΉ, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… «ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это, Π·Π°Ρ‚Π΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎ, Π·Π°Ρ‚Π΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Π΅». β€˜map()’ позволяСт это Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ:

#----- Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² Python ----------#
# создадим Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
do_it = lambda f: f()

# ΠŸΡƒΡΡ‚ΡŒ f1, f2, f3 (etc) - Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ дСйствия
map(do_it, [f1,f2,f3]) # ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π½Π° map()

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС, вся главная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ β€˜map()’ со списком Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π΄ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ΅ свойство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² β€” Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡ… Π² список.

ΠŸΠ΅Ρ€Π΅Π²Π΅ΡΡ‚ΠΈ β€˜while’ Π²ΠΏΡ€ΡΠΌΡƒΡŽ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС, Π½ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ получаСтся :

#-------- Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» 'while' Π² Python ----------#
# ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ (основаный Π½Π° ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΈ 'while') Ρ†ΠΈΠΊΠ»
while <cond>:
 <pre-suite>
 if <break_condition>:
 break
 else:
 <suite>

# РСкурсивный Ρ†ΠΈΠΊΠ» Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ стилС
def while_block():
 <pre-suite>
 if <break_condition>:
 return 1
 else:
 <suite>
 return 0

while_FP = lambda: (<cond> and while_block()) or while_FP()
while_FP()

Наш Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ β€˜while’ всС Π΅Ρ‰Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ while_block(), которая сама ΠΏΠΎ сСбС ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ выраТСния, Π½ΠΎ ΠΈ утвСрТдСния (statements). Но ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ дальнСйшСС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΉ Π² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°ΠΌΠ΅Π½Ρƒ Π±Π»ΠΎΠΊΠ° β€˜if/else’ Π² Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠΌ шаблонС Π½Π° ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ·Π°ΠΌΠΊΠ½ΡƒΡ‚ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅). К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅, обычная ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° мСстС <cond> (Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ β€˜while myvar==7’) вряд Π»ΠΈ окаТСтся ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π° (Π² прСдставлСнном Π²ΠΈΠ΄Π΅) Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ (хотя Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ Π² while_block()). Один ΠΈΠ· способов ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ условиС β€” Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ while_block() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ осмыслСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ с условиСм Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ. Π‘Ρ‚ΠΎΠΈΡ‚ Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΉ:

#---------- Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» 'echo' Π² Python ------------#
# Π˜ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Π°Ρ вСрсия "echo()"
def echo_IMP():
 while 1:
 x = raw_input("IMP -- ")
 if x == 'quit':
 break
 else
 print x
echo_IMP()

# БлуТСбная функция, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π°Ρ "тоТдСство с ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌ эффСктом"
def monadic_print(x):
 print x
 return x

# FP вСрсия "echo()"
echo_FP = lambda: monadic_print(raw_input("FP -- "))=='quit' or echo_FP()
echo_FP()

ΠœΡ‹ достигли Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Ρ€Π°Π·ΠΈΠ»ΠΈ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΡƒΡŽ Π²Π²ΠΎΠ΄/Π²Ρ‹Π²ΠΎΠ΄, Ρ†ΠΈΠΊΠ»Ρ‹ ΠΈ условия Π² Π²ΠΈΠ΄Π΅ чистого выраТСния с рСкурсиСй (фактичСски β€” Π² Π²ΠΈΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈ нСобходимости ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ΠΊΡƒΠ΄Π° ΡƒΠ³ΠΎΠ΄Π½ΠΎ). ΠœΡ‹ всС Π΅Ρ‰Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡΠ»ΡƒΠΆΠ΅Π±Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ monadic_print(), Π½ΠΎ эта функция ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ общая ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Π»ΡŽΠ±Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… выраТСниях , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ создадим ΠΏΠΎΠ·ΠΆΠ΅ (это ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½Ρ‹Π΅ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹).2 3 Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ любоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, содСрТащСС monadic_print(x) вычисляСтся Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½ΠΎ содСрТало просто x. Π’ FP (Π² частности, Π² Haskell) Π΅ΡΡ‚ΡŒ понятиС «ΠΌΠΎΠ½Π°Π΄Ρ‹» для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая «Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ, ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ».

ПослС всСй ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎ избавлСнию ΠΎΡ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ осмыслСнных конструкций ΠΈ Π·Π°ΠΌΠ΅Π½Π΅ ΠΈΡ… Π½Π° Π½Π΅Π²Ρ€Π°Π·ΡƒΠΌΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ выраТСния, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ СстСствСнный вопрос β€” Β«Π—Π°Ρ‡Π΅ΠΌ?!Β». ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Ρ‹Π²Π°Ρ ΠΌΠΎΠΈ описания характСристик FP, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ всС ΠΎΠ½ΠΈ достигнуты Π² Python. Но ваТнСйшая (ΠΈ, скорСС всСго, Π² наибольшСй стСпСни Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ) характСристика β€” ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов ΠΈΠ»ΠΈ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΈΡ… примСнСния ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ областями Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ ΠΌΠΎΠ½Π°Π΄. ΠžΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… ошибок ΠΈ главная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π°Ρ примСнСния ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠ², случаСтся ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π½Π΅Π²Π΅Ρ€Π½Ρ‹Π΅ значСния Π² процСссС выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, просто вовсС Π½Π΅ присваивая значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ.

ВзглянСм Π½Π° ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ участок ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Π•Π³ΠΎ Ρ†Π΅Π»ΡŒ β€” Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ список ΠΏΠ°Ρ€ чисСл, Ρ‡ΡŒΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ большС 25. Числа, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Ρ‹, сами бСрутся ΠΈΠ· Π΄Π²ΡƒΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… списков. ВсС это вСсьма Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ программисты Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ Π΄Π΅Π»Π°ΡŽΡ‚ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… участках своих ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Π˜ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ этой Π·Π°Π΄Π°Ρ‡Π΅ ΠΌΠΎΠ³ Π±Ρ‹ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

#--- Π˜ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ для "ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠΉ" ----#
# ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ ΡΡ‚ΠΈΠ»ΡŒ - поиск Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»ΠΎΠ²
xs = (1,2,3,4)
ys = (10,15,3,22)
bigmuls = []
#...ΠΏΡ€ΠΎΡ‡ΠΈΠΉ ΠΊΠΎΠ΄...
for x in xs:
 for y in ys:
 #...ΠΏΡ€ΠΎΡ‡ΠΈΠΉ ΠΊΠΎΠ΄...
 if x*y > 25:
 bigmuls.append((x,y))
 #...ΠΏΡ€ΠΎΡ‡ΠΈΠΉ ΠΊΠΎΠ΄...
#...ΠΏΡ€ΠΎΡ‡ΠΈΠΉ ΠΊΠΎΠ΄...
print bigmuls

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ слишком ΠΌΠ°Π» для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ пошло Π½Π΅ Ρ‚Π°ΠΊ. Но, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΠ½ встроСн Π² ΠΊΠΎΠ΄, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для достиТСния мноТСства Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ Π² Ρ‚ΠΎ ΠΆΠ΅ самоС врСмя. Π‘Π΅ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠ°ΠΊ «#…прочий код…» β€” мСста, Π³Π΄Π΅ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты с наибольшСй Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ ошибкам. Π’ любой ΠΈΠ· этих Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ xs, ys, bigmuls, x, y ΠΌΠΎΠ³ΡƒΡ‚ приобрСсти Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹Π΅ значСния Π² гипотСтичСском ΠΊΠΎΠ΄Π΅. Π”Π°Π»Π΅Π΅, послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ этого куска ΠΊΠΎΠ΄Π° всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ΡΡ, Π° ΠΌΠΎΠ³ΡƒΡ‚ ΠΈ Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒΡΡ ΠΏΠΎΡΠ΄Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ инкапсуляция Π² функциях/ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… ΠΈ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ этого Ρ€ΠΎΠ΄Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ всСгда ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ (β€˜del’) ваши ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ послС использования. Но, Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ошибок вСсьма ΠΎΠ±Ρ‹Ρ‡Π΅Π½.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ нашСй Π·Π°Π΄Π°Ρ‡Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ошибки, связанныС с ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌΠΈ эффСктами. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ:

#--- Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ для поиска/ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠΉ Π½Π° Python ----#
bigmuls = lambda xs,ys: filter(lambda (x,y):x*y > 25, combine(xs,ys))
combine = lambda xs,ys: map(None, xs*len(ys), dupelms(ys,len(xs)))
dupelms = lambda lst,n: reduce(lambda s,t:s+t, map(lambda l,n=n: [l]*n, lst))
print bigmuls((1,2,3,4),(10,15,3,22))

ΠœΡ‹ связываСм Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ (β€˜lambda’) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ, Π½ΠΎ это Π½Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. ВмСсто этого ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ просто Π²Π»ΠΎΠΆΠΈΡ‚ΡŒ опрСдСлСния. ΠœΡ‹ использовали ΠΈΠΌΠ΅Π½Π° ΠΊΠ°ΠΊ Ρ€Π°Π΄ΠΈ большСй читаСмости, Ρ‚Π°ΠΊ ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ combine() β€” Π² любом случаС отличная слуТСбная функция (Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ список всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΠ°Ρ€ элСмСнтов ΠΈΠ· Π΄Π²ΡƒΡ… списков). Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, dupelms() Π² основном лишь Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ combine(). Π₯отя этот Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΎΠ»Π΅Π΅ многословСн, Ρ‡Π΅ΠΌ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ, ΠΏΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ использовании слуТСбных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΊΠΎΠ΄ Π² собствСнно bigmuls() окаТСтся, вСроятно, Π±ΠΎΠ»Π΅Π΅ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹ΠΌ, Ρ‡Π΅ΠΌ Π² ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅.

РСальноС прСимущСство этого Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΌ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½ΠΈ ΠΎΠ΄Π½Π° пСрСмСнная Π½Π΅ мСняСт своСго значСния. КакоС-Π»ΠΈΠ±ΠΎ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ±ΠΎΡ‡Π½ΠΎΠ΅ влияниС Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ (ΠΈΠ»ΠΈ со стороны ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°) просто Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, само ΠΏΠΎ сСбС отсутствиС ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π±Π΅Π·ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°, Π½ΠΎ Π² любом случаС это прСимущСство. Однако Π·Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Python, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… языков, Π½Π΅ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ привязываниС ΠΈΠΌΠ΅Π½ bigmuls, combine ΠΈ dupelms. Если дальшС Π² процСссС выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ combine() Π½Π°Ρ‡Π½Π΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ β€” ΡƒΠ²Ρ‹! МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ класс-ΠΎΠ΄ΠΈΠ½ΠΎΡ‡ΠΊΡƒ (Singleton) для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ связывания Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° (Π½Π°ΠΏΡ€. β€˜s.bigmuls’, etc.), Π½ΠΎ это Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ настоящСй ΡΡ‚Π°Ρ‚ΡŒΠΈ.

Π•Ρ‰Π΅ стоит ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‡Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Ρ€Π΅ΡˆΠΈΠ»ΠΈ, скроСна Π² точности ΠΏΠΎΠ΄ Π½ΠΎΠ²Ρ‹Π΅ возмоТности Python 2.0. ВмСсто Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² β€” ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ β€” Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠ°Ρ (ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ) Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

#----- Код Python для "bigmuls" с использованиСм списочных встраиваний (list comprehensions) -----#
print [(x,y) for x in (1,2,3,4) for y in (10,15,3,22) if x*y > 25]

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

Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ ΠΊΠ°Π½Π°Π». Подпишись, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ!

Python Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ — ΠΎΠ΄ΠΈΠ½ ΠΈΠ· 4-Ρ€Ρ‘Ρ… основных стилСй программирования. Π­ΠΊΠΎΠΏΠ°Ρ€ΠΊ Z

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python

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

ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌΠΈ прСдпосылками для ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования Π² Python ΡΠ²Π»ΡΡŽΡ‚ΡΡ:Β Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠΈΡ… порядков, Ρ€Π°Π·Π²ΠΈΡ‚Ρ‹Π΅ срСдства обработки списков, рСкурсия, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈΒ Π»Π΅Π½ΠΈΠ²Ρ‹Ρ… вычислСний.

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования Π² Python ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ Π»ΡŽΠ±ΠΎΠΌΡƒ программисту, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π³Π°Ρ€ΠΌΠΎΠ½ΠΈΡ‡Π½ΠΎ ΡΠΎΡ‡Π΅Ρ‚Π°Ρ‚ΡŒ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°ΠΌΠΈ.

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

  • 1 ВозмоТности
  • 1.1 ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
  • 1.2 БписковыС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ
  • 1.3 ВстроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠΈΡ… порядков
  • 1.3.1 map()
  • 1.3.2 filter()
  • 1.3.3 reduce()
  • 1.3.4 apply()
  • 1.4 Замыкания
  • 1.5 Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹
  • 1.6 ΠœΠΎΠ΄ΡƒΠ»ΡŒ functools
  • 1.7 Π›Π΅Π½ΠΈΠ²Ρ‹Π΅ вычислСния
  • 1.8 Π€ΡƒΠ½ΠΊΡ‚ΠΎΡ€Ρ‹
  • 2 ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ
  • 3 Бсылки
  • 4 Π›ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π°

ВозмоТности

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Ѐункция Π² Python ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°Β def или лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ эквивалСнтны:

def Β func(x, y):
return x**2 + y**2

func = lambda x, y: x**2 + y**2

Π’ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‚Β Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. НСкоторыС ΠΈΠ· Π½ΠΈΡ… ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ВсС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ со значСниями ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ послС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π±Π΅Π· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉΒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π°Π΄Π°ΡŽΡ‚ΡΡΒ Ρ„Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. НапримСр:

func(2, y=7)

Π’ Π½Π°Ρ‡Π°Π»Π΅ ΠΈΠ΄ΡƒΡ‚Β ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. Они ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠΎ порядку. Π—Π°Ρ‚Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚Β ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. Они ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎ ΠΈΠΌΠ΅Π½Π°ΠΌ ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½Ρ‹ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² любом порядкС.

РазумССтся, всС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π² описании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΠΎΠ²Ρ‚ΠΎΡ€Ρ‹ Π² ΠΈΠΌΠ΅Π½Π°Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² нСдопустимы.

Ѐункция всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (ΠΈΠ»ΠΈΒ None, Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π·Π°Π΄Π°Π½ΠΎ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅Β returnΒ ΠΈΠ»ΠΈ этот ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ встрСчСн ΠΏΠΎ достиТСнии ΠΊΠΎΠ½Ρ†Π° опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ). Однако, это Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒΒ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ.

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽΒ Π»ΡΠΌΠ±Π΄Π°-выраТСния, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΡƒΡ‚ ΠΆΠ΅ Π΅Ρ‘ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:

>>> (lambda x: x+2)(5)
7

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

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python ΡΠ²Π»ΡΡŽΡ‚ΡΡΒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π°Ρ€Π°Π²Π½Π΅ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

БписковыС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

БписковоС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅Β (Π°Π½Π³Π».Β list comprehension)Β β€” Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… срСдств Python. НапримСр, для вычислСния списка ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ†Π΅Π»Ρ‹Ρ… чисСл, ΠΌΠ΅Π½ΡŒΡˆΠΈΡ… 10, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

l = [x**2 for x in range(1,10)]

ВстроСнныС функции Π²Ρ‹ΡΡˆΠΈΡ… порядков

Π’ Python Π΅ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:Β map(),Β filter(),Β reduce(),Β apply().

map()

Ѐункция map() позволяСт ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ»ΠΈ нСсколько ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

>>> list1 = [7, 2, 3, 10, 12]
>>> list2 = [-1, 1, -5, 4, 6]
>>> map(lambda x, y: x*y, list1, list2)
[-7, 2, -15, 40, 72]

Аналогичного (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ Π΄Π»ΠΈΠ½Π΅ списков) Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ списочных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ:

>>> [x*y for x, y in zip(list1, list2)]
[-7, 2, -15, 40, 72]
filter()

Ѐункция filter() позволяСт Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ значСния ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ спискС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ значСния, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для элСмСнта истинно:

>>> numbers = [10, 4, 2, -1, 6]
>>> filter(lambda x: x < 5, numbers)  # Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ элСмСнты x, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… x < 5 истинно
[4, 2, -1]

Π’ΠΎ ΠΆΠ΅ самоС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ списковых Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ:

>>> numbers = [10, 4, 2, -1, 6]
>>> [x for x in numbers if x < 5]
[4, 2, -1]
reduce()

Для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ†Π΅ΠΏΠΎΡ‡Π΅Ρ‡Π½Ρ‹Ρ… вычислСний Π² спискС ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽΒ reduce(). НапримСр, ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ элСмСнтов списка ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ вычислСно Ρ‚Π°ΠΊ (Python 2):

>>> numbers = [2, 3, 4, 5, 6]
>>> reduce(lambda res, x: res*x, numbers, 1)
720

ВычислСния происходят Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ порядкС:

Π¦Π΅ΠΏΠΎΡ‡ΠΊΠ° Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² связываСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° (res). Если список пустой, просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ (Π² случаС произвСдСния нуля ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»Π΅ΠΉ это 1):

>>> reduce(lambda res, x: res*x, [], 1)
1

РазумССтся, ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ число. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, Π² Ρ‚ΠΎΠΌ числС ΠΈ список. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ показываСт рСвСрс списка:

>>> reduce(lambda res, x: [x]+res, [1, 2, 3, 4], [])
[4, 3, 2, 1]

Для Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² Python Π΅ΡΡ‚ΡŒ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

>>> numbers = [1, 2, 3, 4, 5]
>>> sum(numbers)
15
>>> list(reversed(numbers))
[5, 4, 3, 2, 1]

Π’ Python 3 встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΒ reduce()Β Π½Π΅Ρ‚, Π½ΠΎ Π΅Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅Β functools.

apply()

Ѐункция для примСнСния Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ списком ΠΈ словарСм соотвСтствСнно (Python 2):

>>> def f(x, y, z, a=None, b=None):
...     print x, y, z, a, b
...
>>> apply(f, [1, 2, 3], {'a': 4, 'b': 5})
1 2 3 4 5

Π’ Python 3 вмСсто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΒ apply() слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ синтаксис:

>>> def f(x, y, z, a=None, b=None):
...     print(x, y, z, a, b)
...
>>> f(*[1, 2, 3], **{'a': 4, 'b': 5})
1 2 3 4 5

Замыкания

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, опрСдСляСмыС Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой полноцСнныС замыкания (Π°Π½Π³Π».Β closures):

def multiplier(n):
    "multiplier(n) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΡƒΠΌΠ½ΠΎΠΆΠ°ΡŽΡ‰ΡƒΡŽ Π½Π° n"
    def mul(k):
        return n*k
    return mul
# Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ эффСкта ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ
# multiplier = lambda n: lambda k: n*k
mul2 = multiplier(2) # mul2 - функция, ΡƒΠΌΠ½ΠΎΠΆΠ°ΡŽΡ‰Π°Ρ Π½Π° 2, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, mul2(5) == 10

Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

Π”Ρ€ΡƒΠ³ΠΈΠ΅ срСдства Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования доступны ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠ΄ΡƒΠ»ΡŒΒ itertools) ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΈ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎΒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²Β (ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌΒ print, поэтому ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ Π² Π½Π΅ΠΌ значСния Π±Ρ‹Π»ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² список):

>>> it = enumerate(sorted("PYTHON"))  # ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ для пСрСчислСнных отсортированных Π±ΡƒΠΊΠ² слова
>>> it.next()                         # ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
(0, 'H')
>>> print list(it)                    # ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ значСния Π² Π²ΠΈΠ΄Π΅ списка
[(1, 'N'), (2, 'O'), (3, 'P'), (4, 'T'), (5, 'Y')]

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ использованиС модуля itertools:

>>> from itertools import chain
>>> print list(chain(iter("ABC"), iter("DEF")))
['A', 'B', 'C', 'D', 'E', 'F']

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ функция groupbyΒ (Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ), с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ пороТдаСтся список ΠΏΠ°Ρ€ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠ»ΡŽΡ‡Ρƒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ (Π² этот ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ собраны всС значСния исходного списка с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠ»ΡŽΡ‡Π°). Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ являСтся True ΠΈΠ»ΠΈ False Π² зависимости ΠΎΡ‚ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ значСния. (Для Ρ†Π΅Π»Π΅ΠΉ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ прСвращаСтся Π² список).

from math import cos
from itertools import groupby
lst = [cos(x*.4) for x in range(30)]                       # косинусоида
[list(y) for k, y in groupby(lst, lambda x: x > 0)]        # Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… чисСл

Π’ ΠΌΠΎΠ΄ΡƒΠ»Π΅Β itertoolsΒ Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΊΡ€Π°Ρ‚ΠΊΠΎ (Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ стилС) ΠΈ с Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния — эффСктивно — Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ процСссы ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ списков.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ functools

Π’ Python 2.5 появился ΠΌΠΎΠ΄ΡƒΠ»ΡŒΒ functoolsΒ ΠΈ Π² частности Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΒ Ρ‡Π°ΡΡ‚ΠΈΡ‡Π½ΠΎΠ³ΠΎ примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

>>> from  functools import partial
>>> def myfun(a, b): return a + b
...
>>> myfun1 = partial(myfun, 1)
>>> print myfun1(2)
3

(ЧастичноС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽΒ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉΒ ΠΈΠ»ΠΈΒ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ²)

Π›Π΅Π½ΠΈΠ²Ρ‹Π΅ вычислСния

Π›Π΅Π½ΠΈΠ²Ρ‹Π΅ вычислСния моТно ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Python нСсколькими способами, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹:

  • ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠ΅ логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ or ΠΈ and Π½Π΅ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄, Ссли Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ опрСдСляСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠΌ
  • лямбда-выраТСния
  • ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ классы с Π»Π΅Π½ΠΈΠ²ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ вычислСний или функторы
  • Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π½Ρ‹Π΅ выраТСния
  • (Python 2.5) if-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Β«Π»Π΅Π½ΠΈΠ²ΡƒΡŽΒ» сСмантику (вычисляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ΅Π½)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ if-выраТСния. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°Β printΒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈΡΡŒ:

>>> def f():
...     print "f"
...     return "f"
...
>>> def g():
...     print "g"
...     return "g"
...
>>> f() if True else g()
f
'f'
>>> f() if False else g()
g
'g'

НСкоторыС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈΠ· ΠΊΠ½ΠΈΠ³ΠΈ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ²:

  • ЛСнивая сортировка
  • Π›Π΅Π½ΠΈΠ²Ρ‹ΠΉ ΠΎΠ±Ρ…ΠΎΠ΄ Π³Ρ€Π°Ρ„Π°
  • Π›Π΅Π½ΠΈΠ²ΠΎΠ΅ вычислСниС свойств
  • ΠšΠ°Ρ€Ρ€ΠΈΠ½Π³

Π€ΡƒΠ½ΠΊΡ‚ΠΎΡ€Ρ‹

Π€ΡƒΠ½ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈΒ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, синтаксичСски ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ функциям, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Π²Ρ‹Π·ΠΎΠ²Π°. Для опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Β () с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Β __call__.

Π’ Python Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ функциям, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² (func_codeΒ ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ…). НапримСр, Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² качСствС функций ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° (callback)Β Π² Π‘-ΠΊΠΎΠ΄.

Π€ΡƒΠ½ΠΊΡ‚ΠΎΡ€Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΡ‘ΠΌΡ‹, связанныС с использованиСм замыкания, статичСских ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΒ Ρ‚.Β ΠΏ.

НиТС прСдставлСно Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈ эквивалСнтный Π΅ΠΌΡƒ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€:

def addClosure(val1):
    def closure(val2):
        return val1 + val2
    return closure
    
class AddFunctor(object):
    def __init__(self, val1):
        self.val1 = val1
    def __call__(self, val2):
        return self.val1 + val2

cl = addClosure(2)
fn = AddFunctor(2)

print cl(1), fn(1)  # Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ "3 3"

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ быстрСС, Ρ‡Π΅ΠΌ ΠΊΠΎΠ΄ с Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠΌ. Π­Ρ‚ΠΎ связано с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ получСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°Β valΒ Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉΒ selfΒ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ ΠΏΡ€ΠΎΠ΄Π΅Π»Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΎΠ΄Π½Ρƒ Python ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ большС).

Π’Π°ΠΊΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Ρ‹ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания дСкораторов с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ.

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

НапримСр, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Β«Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒΒ» исполняСмыС Π½Π°Π΄ Π½ΠΈΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ ΠΈΡ…. Для этого достаточно ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹.

class SlowFunctor(object):
	def __init__(self,func):
		self.func = func
	def __add__(self,val):                  # слоТСниС Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Π° с Ρ‡Π΅ΠΌ-Ρ‚ΠΎ
		if isinstance(val,SlowFunctor): # Ссли это Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€
			new_func = lambda *dt,**mp : self(*dt,**mp) + val(*dt,**mp)
		else:                           # Ссли Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅
			new_func = lambda *dt,**mp : self(*dt,**mp) + val
		return SlowFunctor( new_func )
	def __call__(self,*dt):
		return self.func(*dt)

import math
def test1(x):
    return x + 1
def test2(x):
    return math.sin(x)

func = SlowFunctor(test1)                # создаСм Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€
func = func + SlowFunctor(test2)         # этот Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ с Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ
func = (lambda x : x + 2)(func)          # ΠΈ числами, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
                                         # ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ это число

def func2(x):                            # ЭквивалСнтная функция
    return test1(x) + test2(x) + 2

print func(math.pi)                      # ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ 3.14159265359
print func(math.pi) - func2(math.pi)     # ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ 0.0

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

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ создаСт Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌ всСх Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ…Β lambda.

МоТно ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ гСнСрирования Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Π²ΠΎ врСмя исполнСния. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈ тСсты Π½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π΅ΡΡ‚ΡŒ Π²Β ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Python ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

ΠŸΡ€ΠΈ использовании этой Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ исполнСния Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ «статичСского» ΠΊΠΎΠ΄Π° (Ссли Π½Π΅ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π΅Π³ΠΎΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ конструированиС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ).

ВмСсто Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Python ΠΌΠΎΠΆΠ½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ΄ Π½Π° языкС программирования C, Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования ΠΈΠ»ΠΈΒ XML-Ρ„Π°ΠΉΠ»Ρ‹.

НСсмотря Π½Π° Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы, Π»Π΅Π½ΠΈΠ²ΠΎΠ΅ вычислСниС ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°Ρ‚ΡŒ Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ Π² скорости Π² случаях, ΠΊΠΎΠ³Π΄Π° дСйствия, ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΌ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠΌ, достаточно Π΄ΠΎΡ€ΠΎΠ³ΠΈΒ β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ ΠΎΠ±ΡŠΡ‘ΠΌΠ½Ρ‹Π΅ вычислСния ΠΈΠ»ΠΈ доступ ΠΊ диску.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Β XΒ Π»Π΅Π½ΠΈΠ²ΠΎ вычисляСтся ΠΏΠ΅Ρ€Π΅Π΄ условным ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ; для Π½Π΅Π³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ создана Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ².

Π’ Ρ‚ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠ΅ условного ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°, Π³Π΄Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β XΒ Π½Π΅ трСбуСтся ΠΏΠΎ Ρ…ΠΎΠ΄Ρƒ вычислСния, эта Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ просто ΠΎΡ‚Π±Ρ€ΠΎΡˆΠ΅Π½Π°, Π½Π΅ привСдя ΠΊ дорогостоящСму Π²Ρ‹Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡŽ.

Π’ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠ΅, Π³Π΄Π΅Β X трСбуСтся для вычислСния ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Ρ‘Ρ‚ Π΅Π³ΠΎ вычислСниС.

ΠŸΡ€ΠΈ этом программисту Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ, Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· Π²Π΅Ρ‚ΠΎΠΊ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ: ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ дорогостоящСС вычислСниС XΒ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π±Ρ€ΠΎΡˆΠ΅Π½.

ΠŸΡ€ΠΈΠ³Π»Π°ΡˆΠ°ΡŽ всСх Π²Ρ‹ΡΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡΡ…. ΠšΡ€ΠΈΡ‚ΠΈΠΊΡƒ ΠΈ ΠΎΠ±ΠΌΠ΅Π½ ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ ΠΎΠ΄ΠΎΠ±Ρ€ΡΡŽ ΠΈ ΠΏΡ€ΠΈΠ²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽ. Π’ Ρ…ΠΎΡ€ΠΎΡˆΠΈΡ… коммСнтариях ΡΠΎΡ…Ρ€Π°Π½ΡΡŽ ссылку Π½Π° сайт Π°Π²Ρ‚ΠΎΡ€Π°!

И Π½Π΅ Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅, поТалуйста, Π½Π°ΠΆΠΈΠΌΠ°Ρ‚ΡŒ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠΈ ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… сСтСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ располоТСны ΠΏΠΎΠ΄ тСкстом ΠΊΠ°ΠΆΠ΄ΠΎΠΉ страницы сайта.
ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ тут…

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python β€” ВикипСдия

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

ВозмоТности

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Ѐункция Π² Python ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° def ΠΈΠ»ΠΈ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ эквивалСнтны:

def func(x, y):
    return x**2 + y**2

func = lambda x, y: x**2 + y**2

Π’ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‚ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. НСкоторыС ΠΈΠ· Π½ΠΈΡ… ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ВсС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ со значСниями ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ послС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π±Π΅Π· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ фактичСскиС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. НапримСр:

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

Ѐункция всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (ΠΈΠ»ΠΈ None, Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π·Π°Π΄Π°Π½ΠΎ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ return ΠΈΠ»ΠΈ этот ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ встрСчСн ΠΏΠΎ достиТСнии ΠΊΠΎΠ½Ρ†Π° опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ). Однако, это Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ.

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ лямбда-выраТСния, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΡƒΡ‚ ΠΆΠ΅ Π΅Ρ‘ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:

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

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π°Ρ€Π°Π²Π½Π΅ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

БписковыС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

БписковоС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅[1] (Π°Π½Π³Π».Β list comprehension)Β β€” Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… срСдств Python. НапримСр, для вычислСния списка ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ†Π΅Π»Ρ‹Ρ… чисСл, ΠΌΠ΅Π½ΡŒΡˆΠΈΡ… 10, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

l = [x**2 for x in range(1,10)]

ВстроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠΈΡ… порядков

Π’ Python Π΅ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: map(), filter(), reduce(), apply().

map()

Ѐункция map() позволяСт ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ»ΠΈ нСсколько ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

>>> list1 = [7, 2, 3, 10, 12]
>>> list2 = [-1, 1, -5, 4, 6]
>>> map(lambda x, y: x*y, list1, list2)
[-7, 2, -15, 40, 72]

Аналогичного (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ Π΄Π»ΠΈΠ½Π΅ списков) Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ списочных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ:

>>> [x*y for x, y in zip(list1, list2)]
[-7, 2, -15, 40, 72]
filter()

Ѐункция filter() позволяСт Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ значСния ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ спискС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ значСния, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для элСмСнта истинно:

>>> numbers = [10, 4, 2, -1, 6]
>>> filter(lambda x: x < 5, numbers)     # Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ элСмСнты x, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… x < 5 истинно
[4, 2, -1]

Π’ΠΎ ΠΆΠ΅ самоС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ списковых Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ:

>>> numbers = [10, 4, 2, -1, 6]
>>> [x for x in numbers if x < 5]
[4, 2, -1]
reduce()

Для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ†Π΅ΠΏΠΎΡ‡Π΅Ρ‡Π½Ρ‹Ρ… вычислСний Π² спискС ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ reduce(). НапримСр, ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ элСмСнтов списка ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ вычислСно Ρ‚Π°ΠΊ (Python 2):

>>>from functools import reduce
>>>numbers = [2, 3, 4, 5, 6]
>>> reduce(lambda res, x: res*x, numbers, 1)
720

ВычислСния происходят Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ порядкС:

Π¦Π΅ΠΏΠΎΡ‡ΠΊΠ° Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² связываСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° (res). Если список пустой, просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ (Π² случаС произвСдСния нуля ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»Π΅ΠΉ это 1):

>>> reduce(lambda res, x: res*x, [], 1)
1

РазумССтся, ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ число. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, Π² Ρ‚ΠΎΠΌ числС ΠΈ список. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ рСвСрс списка:

>>> reduce(lambda res, x: [x]+res, [1, 2, 3, 4], [])
[4, 3, 2, 1]

Для Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² Python Π΅ΡΡ‚ΡŒ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

>>> numbers = [1, 2, 3, 4, 5]
>>> sum(numbers)
15
>>> list(reversed(numbers))
[5, 4, 3, 2, 1]

Π’ Python 3 встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reduce() Π½Π΅Ρ‚, Π½ΠΎ Π΅Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ functools.

apply()

Ѐункция для примСнСния Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ списком ΠΈ словарСм соотвСтствСнно (Python 2):

>>> def f(x, y, z, a=None, b=None):
...     print x, y, z, a, b
...
>>> apply(f, [1, 2, 3], {'a': 4, 'b': 5})
1 2 3 4 5

Π’ Python 3 вмСсто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ apply() слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ синтаксис:

>>> def f(x, y, z, a=None, b=None):
...     print(x, y, z, a, b)
...
>>> f(*[1, 2, 3], **{'a': 4, 'b': 5})
1 2 3 4 5

Замыкания

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, опрСдСляСмыС Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹Π΅ замыкания (Π°Π½Π³Π».Β closures)[2]:

def multiplier(n):
    "multiplier(n) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΡƒΠΌΠ½ΠΎΠΆΠ°ΡŽΡ‰ΡƒΡŽ Π½Π° n"
    def mul(k):
        return n*k
    return mul
# Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ эффСкта ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ
# multiplier = lambda n: lambda k: n*k
mul2 = multiplier(2) # mul2 - функция, ΡƒΠΌΠ½ΠΎΠΆΠ°ΡŽΡ‰Π°Ρ Π½Π° 2, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, mul2(5) == 10

Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

Π”Ρ€ΡƒΠ³ΠΈΠ΅ срСдства Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования доступны ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠ΄ΡƒΠ»ΡŒ itertools) ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΈ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² (ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ print, поэтому ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ Π² Π½Π΅ΠΌ значСния Π±Ρ‹Π»ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² список):

>>> it = enumerate(sorted("PYTHON"))  # ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ для пСрСчислСнных отсортированных Π±ΡƒΠΊΠ² слова
>>> it.next()                         # ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
(0, 'H')
>>> print list(it)                    # ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ значСния Π² Π²ΠΈΠ΄Π΅ списка
[(1, 'N'), (2, 'O'), (3, 'P'), (4, 'T'), (5, 'Y')]

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ использованиС модуля itertools:

>>> from itertools import chain
>>> print list(chain(iter("ABC"), iter("DEF")))
['A', 'B', 'C', 'D', 'E', 'F']

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

from math import cos
from itertools import groupby
lst = [cos(x*.4) for x in range(30)]                       # косинусоида
[list(y) for k, y in groupby(lst, lambda x: x > 0)]        # Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… чисСл

Π’ ΠΌΠΎΠ΄ΡƒΠ»Π΅ itertools Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΊΡ€Π°Ρ‚ΠΊΠΎ (Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ стилС) ΠΈ с Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния — эффСктивно — Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ процСссы ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ списков.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ functools

Π’ Python 2.5 появился ΠΌΠΎΠ΄ΡƒΠ»ΡŒ functools ΠΈ Π² частности Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ частичного примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

>>> from  functools import partial
>>> def myfun(a, b): return a + b
...
>>> myfun1 = partial(myfun, 1)
>>> print myfun1(2)
3

(ЧастичноС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ
Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ ΠΈΠ»ΠΈ
Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ²)

Π›Π΅Π½ΠΈΠ²Ρ‹Π΅ вычислСния

Π›Π΅Π½ΠΈΠ²Ρ‹Π΅ вычислСния ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Python нСсколькими способами, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹:

  • ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠ΅ логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ or ΠΈ and Π½Π΅ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄, Ссли Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ опрСдСляСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠΌ
  • лямбда-выраТСния
  • ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ классы с Π»Π΅Π½ΠΈΠ²ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ вычислСний[3] ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Ρ‹
  • Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π½Ρ‹Π΅ выраТСния
  • (Python 2.5) if-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Β«Π»Π΅Π½ΠΈΠ²ΡƒΡŽΒ» сСмантику (вычисляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ΅Π½)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ if-выраТСния. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° print ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈΡΡŒ:

>>> def f():
...     print "f"
...     return "f"
...
>>> def g():
...     print "g"
...     return "g"
...
>>> f() if True else g()
f
'f'
>>> f() if False else g()
g
'g'

НСкоторыС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈΠ· ΠΊΠ½ΠΈΠ³ΠΈ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ²:

  • ЛСнивая сортировка[4]
  • Π›Π΅Π½ΠΈΠ²Ρ‹ΠΉ ΠΎΠ±Ρ…ΠΎΠ΄ Π³Ρ€Π°Ρ„Π°[5]
  • Π›Π΅Π½ΠΈΠ²ΠΎΠ΅ вычислСниС свойств[6]
  • ΠšΠ°Ρ€Ρ€ΠΈΠ½Π³[7]

Π€ΡƒΠ½ΠΊΡ‚ΠΎΡ€Ρ‹

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

НиТС прСдставлСно Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈ эквивалСнтный Π΅ΠΌΡƒ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€:

def addClosure(val1):
    def closure(val2):
        return val1 + val2
    return closure
    
class AddFunctor(object):
    def __init__(self, val1):
        self.val1 = val1
    def __call__(self, val2):
        return self.val1 + val2

cl = addClosure(2)
fn = AddFunctor(2)

print cl(1), fn(1)  # Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ "3 3"

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ быстрСС, Ρ‡Π΅ΠΌ ΠΊΠΎΠ΄ с Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠΌ. Π­Ρ‚ΠΎ связанно с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ получСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° val Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ self (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ ΠΏΡ€ΠΎΠ΄Π΅Π»Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΎΠ΄Π½Ρƒ Python ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ большС).
Π’Π°ΠΊΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Ρ‹ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ² с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ.
Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Π°ΠΌ доступны всС возмоТности ООП Π² Python, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΈΡ… ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Β«Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒΒ» исполняСмыС Π½Π°Π΄ Π½ΠΈΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ ΠΈΡ….
Для этого достаточно ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹.

class SlowFunctor(object):
	def __init__(self,func):
		self.func = func
	def __add__(self,val):                  # слоТСниС Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Π° с Ρ‡Π΅ΠΌ-Ρ‚ΠΎ
		if isinstance(val,SlowFunctor): # Ссли это Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€
			new_func = lambda *dt,**mp : self(*dt,**mp) + val(*dt,**mp)
		else:                           # Ссли Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅
			new_func = lambda *dt,**mp : self(*dt,**mp) + val
		return SlowFunctor( new_func )
	def __call__(self,*dt):
		return self.func(*dt)

import math
def test1(x):
    return x + 1
def test2(x):
    return math.sin(x)

func = SlowFunctor(test1)                # создаСм Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€
func = func + SlowFunctor(test2)         # этот Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ с Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ
func = (lambda x : x + 2)(func)          # ΠΈ числами, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
                                         # ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ это число

def func2(x):                            # ЭквивалСнтная функция
    return test1(x) + test2(x) + 2

print func(math.pi)                      # ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ 3.14159265359
print func(math.pi) - func2(math.pi)     # ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ 0.0

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

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ создаСт Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅
ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌ всСх Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… lambda. МоТно ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€,
ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ гСнСрирования Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π° Π²ΠΎ врСмя исполнСния. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈ тСсты Π½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ
Π΅ΡΡ‚ΡŒ Π² ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Python ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.
ΠŸΡ€ΠΈ использовании этой Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ исполнСния Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ «статичСского» ΠΊΠΎΠ΄Π° (Ссли Π½Π΅ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π΅Π³ΠΎΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ конструированиС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ).
ВмСсто Π±Π°ΠΉΡ‚ΠΎΠΊΠΎΠ΄Π° Python ΠΌΠΎΠΆΠ½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ΄ Π½Π° языкС программирования
C, Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования ΠΈΠ»ΠΈ XML-Ρ„Π°ΠΉΠ»Ρ‹.

НСсмотря Π½Π° Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы, Π»Π΅Π½ΠΈΠ²ΠΎΠ΅ вычислСниС ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°Ρ‚ΡŒ Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ Π² скорости Π² случаях, ΠΊΠΎΠ³Π΄Π° дСйствия, ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΌ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠΌ, достаточно Π΄ΠΎΡ€ΠΎΠ³ΠΈΒ β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ ΠΎΠ±ΡŠΡ‘ΠΌΠ½Ρ‹Π΅ вычислСния ΠΈΠ»ΠΈ доступ ΠΊ диску. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ X Π»Π΅Π½ΠΈΠ²ΠΎ вычисляСтся ΠΏΠ΅Ρ€Π΅Π΄ условным ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ; для Π½Π΅Π³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ создана Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ². Π’ Ρ‚ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠ΅ условного ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°, Π³Π΄Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ X Π½Π΅ трСбуСтся ΠΏΠΎ Ρ…ΠΎΠ΄Ρƒ вычислСния, эта Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ просто ΠΎΡ‚Π±Ρ€ΠΎΡˆΠ΅Π½Π°, Π½Π΅ привСдя ΠΊ дорогостоящСму Π²Ρ‹Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡŽ. Π’ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠ΅, Π³Π΄Π΅ X трСбуСтся для вычислСния ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Ρ‘Ρ‚ Π΅Π³ΠΎ вычислСниС. ΠŸΡ€ΠΈ этом программисту Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ, Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· Π²Π΅Ρ‚ΠΎΠΊ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ: ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ дорогостоящСС вычислСниС X ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π±Ρ€ΠΎΡˆΠ΅Π½.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ

Бсылки

Π›ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π°

ЀП Π½Π° Python. Π§Π°ΡΡ‚ΡŒ 7. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка – это ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΌΠΎΡ‰Π½Π΅ΠΉΡˆΠΈΡ… инструмСнтов Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ. Π­Ρ‚Π° идСя прСкрасно Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² Python, ΠΊΠ°ΠΊ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ самого языка, Ρ‚Π°ΠΊ ΠΈ Π² Π΅Π³ΠΎ экосистСмС: Π² модулях functools, operator ΠΈ itertools.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ функция Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка?

На протяТСнии этого Ρ†ΠΈΠΊΠ»Π° статСй ΠΌΡ‹ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ с функциями Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка (High Order Functions ΠΈΠ»ΠΈ HOF), явно ΠΏΡ€ΠΎ это написано Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ β€œΠ€ΠŸ Π½Π° Python. Π§Π°ΡΡ‚ΡŒ 2. Абстракция ΠΈ композиция. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈβ€œ. Ѐункция Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка – это функция, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ/ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² Python Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ – это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса, Ρ‚ΠΎ ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ HOF, это свойство Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния.Β 

ВстроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка

К встроСнным функциям Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π΅Π· ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, относятся map ΠΈ filter.

Ѐункция map ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, элСмСнтами ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊ элСмСнтам Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°.

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

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

>>> def fun(x):
        if x % 2 == 0:
            return 0
        else:
            return x*2

>>> list(map(fun, a))
[2, 0, 6, 0, 10]

Ѐункция filter ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, элСмСнтами ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· исходного ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ True.

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

>>> list(filter(lambda x: x > 0, [-1, 1, -2, 2, 0]))
[1, 2]

>>> list(filter(lambda x: len(x) == 2, ["a", "aa", "b", "bb"]))
['aa', 'bb']

Если ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ β€œΠΏΠΈΡ‚ΠΎΠ½ΠΈΡ‡Π΅ΡΠΊΠΎΠ³ΠΎβ€ стиля программирования, Ρ‚ΠΎ вмСсто map ΠΈ filter Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ списковоС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ (list comprehensions) с ΠΊΡ€ΡƒΠ³Π»Ρ‹ΠΌΠΈ скобками  (Π² этом случаС Π±ΡƒΠ΄Π΅Ρ‚ создан Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€, Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ см. β€œPython. Π£Ρ€ΠΎΠΊ 7. Π Π°Π±ΠΎΡ‚Π° со списками (list)β€œ):

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ map:

map(lambda x: x**2, [1,2,3])

ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π°:

(v**2 for v in [1,2,3])

Для Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° с  Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ filter:

filter(lambda x: x > 0, [-1, 1, -2, 2, 0])

Π°Π½Π°Π»ΠΎΠ³ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

(v for v in [-1, 1, -2, 2, 0] if v > 0)

Π’ экосистСмС Python Π΅ΡΡ‚ΡŒ Π΄Π²Π° модуля: functools ΠΈ operator, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‚ идСю использования HOF ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ инструмСнты для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ стилС.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ functools

ΠœΠΎΠ΄ΡƒΠ»ΡŒ functools прСдоставляСт Π½Π°Π±ΠΎΡ€ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ HOF Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π»ΠΈΠ±ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

HOF Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

partial

Ѐункция partial создаСт частично ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (см. β€œΠ€ΡƒΠ½ΠΊΡ†ΠΈΡ ΠΊΠ°ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠšΠ°Ρ€Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, частичноС примСнСниС”). Π‘ΡƒΡ‚ΡŒ ΠΈΠ΄Π΅ΠΈ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΅ΡΡ‚ΡŒ нСсколько Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π° Π±Π°Π·Π΅ Π½Π΅Π΅ Π΄Ρ€ΡƒΠ³ΡƒΡŽ, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π°Ρ€Π°Π½Π΅Π΅ Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ значСния.

ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ:

partial(func, /, *args, **keywords)

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • func
    • Ѐункция, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ частично ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚.
  • args
    • ΠŸΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
  • keywords
    • Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

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

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ β€œΠ€ΠŸ Π½Π° Python. Π§Π°ΡΡ‚ΡŒ 2. Абстракция ΠΈ композиция. Ѐункции” ΠΌΡ‹ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая складываСт Ρ‚Ρ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… Π² Π½Π΅Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ строили для Π½Π΅Π΅ частично ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ Π΅Π΅:

def faddr(x, y, z):
Β Β Β return x + 2 * y + 3 * z

ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΠΌ частично ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ partial():

p_faddr = partial(faddr, 1, 2)
>>> p_faddr(3)
14

ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с Π·Π°Ρ€Π°Π½Π΅Π΅ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ значСниями для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² y ΠΈ z:

>>> p_kw_faddr = partial(faddr, y=3, z=5)
>>> p_kw_faddr(2)
23
partialmethod

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ ΠΏΠΎ своСму Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ partial(), примСняСтся для ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² классов.

ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ:

class partialmethod(func, /, *args, **keywords)

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • func
    • ΠœΠ΅Ρ‚ΠΎΠ΄ класса, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ частично ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚.
  • args
    • ΠŸΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.
  • keywords
    • Π˜ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

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

class Math:
Β Β Β def mul(self, a, b):
Β Β Β Β Β Β Β return a * b

Β Β Β x10 = partialmethod(mul, 10)

>>> m = Math()
>>> m.mul(2,3)
6

>>> m.x10(5)
50
reduce

Π‘Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

reduce(function, iterable[, initializer])

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • function
    • Ѐункция для свСртки исходной ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.
  • iterable
    • ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ для свСртки (ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€).
  • initializer
    • ΠΠ°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для свСрки. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π·Π°Π΄Π°Π½ΠΎ, Ρ‚ΠΎ Π² качСствС Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Π½ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт ΠΈΠ· ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°.

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

>>> from operator import add

>>> add(1,2)
3

>>> reduce(add, [1,2,3,4,5])
15
update_wrapper

ΠžΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° выглядСла ΠΊΠ°ΠΊ функция-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ°.

ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ:

update_wrapper(wrapper, wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • wrapper
    • Π˜ΡΡ…ΠΎΠ΄Π½Π°Ρ функция.
  • wrapped
    • Ѐункция ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ°.
  • assigned
    • ΠšΠΎΡ€Ρ‚Π΅ΠΆ с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρƒ ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: WRAPPER_ASSIGNMENTS, Π² этом случаС Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹: __module__, __name__, __qualname__, __annotations__,Β  __doc__.
  • updated
    • ΠšΠΎΡ€Ρ‚Π΅ΠΆ с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: WRAPPER_UPDATES, Π² этом случаС Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΌΠ΅Ρ‰Π΅Π½ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚: __dict__.

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

def x10(a):Β Β Β 
Β Β Β return a * 10

def some_mul(a: int) -> int:
Β Β Β """a * some value"""
Β Β Β return a * 1

wrapped_mul = update_wrapper(x10, some_mul)

>>> wrapped_mul(3)
30

>>> wrapped_mul.__name__
'some_mul'

>>> wrapped_mul.__annotations__
{'a': <class 'int'>, 'return': <class 'int'>}

>>> wrapped_mul.__doc__
'a * some value'

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

@cached_property

Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ свойства класса с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Ссли ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ свойству являСтся дорогостоящСй ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ рСсурсов. Доступна, начиная с Python 3.8.

ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ:

@cached_property(func)

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • func
    • ДСкорируСмая функция.

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

НапишСм Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ свойство mean – срСднСС арифмСтичСскоС. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π½Π΅ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ свойству, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ с Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ @cached_property:

import functools

class DataProc:
Β Β Β def __init__(self, data_set):
Β Β Β Β Β Β self._data_set = data_set

Β Β Β @functools.cached_property
Β Β Β def mean(self):
Β Β Β Β Β Β return sum(self._data_set) / len(self._data_set)

>>> d = DataProc([1,2,3,4,5])
>>> d.mean
5
@lru_cache

Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ для создания ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ вСрсии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (ΠΌΠ΅Ρ‚ΠΎΠ΄Π° класса).Β 

ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ:

@lru_cache(user_function)

@lru_cache(maxsize=128, typed=False)

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • maxsize
    • ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌΡ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π·Π½Ρ‹Ρ… Π½Π°Π±ΠΎΡ€ΠΎΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: 128.
  • typed
    • Если ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ€Π°Π²Π΅Π½ True, Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΈΠΏ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС:

Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ обСспСчиваСт Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… Π² количСствС Π΄ΠΎ maxsize ΡˆΡ‚ΡƒΠΊ. Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ @lru_cache создаСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ cache_info(), с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ насколько эффСктивно Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ LRU кэш, ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ с Ρ‡Π΅Ρ‚Ρ‹Ρ€ΡŒΠΌΡ полями: hits (количСство ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠΉ), misses (количСство ΠΏΡ€ΠΎΠΌΠ°Ρ…ΠΎΠ²), maxsize (ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ кэша) ΠΈ currsize (Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ кэша). Для очистки кэша ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ cache_clear(). Если ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ typed=True, Ρ‚ΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с кэшСм Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΈΠΏ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π² этом случаС func(10) ΠΈ func(10.0) Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… (Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ).

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

@lru_cache(maxsize=16)
def square(value):
Β Β Β return value**2

>>> for v in [1, 2, 3, 4, 2, 3, 4, 5, 5, 6]:
... Β  Β  square(v)
...Β 
1
4
9
16
4
9
16
25
25
36

>>> square.cache_info()
CacheInfo(hits=4, misses=6, maxsize=16, currsize=6)
@total_ordering

Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ автоматичСски добавляСт ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ сравнСния, Ссли Π·Π°Π΄Π°Π½ ΠΎΠ΄Π½ΠΈ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²Β  __lt__(), __le__(), __gt__(), __ge__() ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ __eq__().

ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ:

@total_ordering

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

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ класс для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ€Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ (Π΄Ρ€ΠΎΠ±Π½Ρ‹ΠΌΠΈ) числами:

class Rational:
Β Β Β def __init__(self, a, b):
Β Β Β Β Β Β Β self.num = a
Β Β Β Β Β Β Β self.den = b

Β Β Β def __lt__(self, other):
Β Β Β Β Β Β Β return (self.num / self.den) < (other.num / other.den)

Β Β Β def __eq__(self, other):
Β Β Β Β Β Β Β return (self.num == other.num) and (self.den == other.den)

Π’ прСдставлСнном Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ сравнСния <, >, ==:

>>> a = Rational(1, 2)
>>> b = Rational(3, 4)

>>> a < b
True

>>> a == b
False

>>> a > b
False

Но ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ <=, >= нСльзя:

>>> a <= b
Traceback (most recent call last):
Β Β File "<stdin>", line 1, in <module>
TypeError: '<=' not supported between instances of 'Rational' and 'Rational'

Если ΠΏΡ€ΠΈ объявлСнии класса Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ @total_ordering, Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π² распоряТСниС вСсь Π½Π°Π±ΠΎΡ€ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² сравнСния:

@total_ordering
class Rational:
Β Β Β def __init__(self, a, b):
Β Β Β Β Β Β Β self.num = a
Β Β Β Β Β Β Β self.den = b

Β Β Β def __lt__(self, other):
Β Β Β Β Β Β Β return (self.num / self.den) < (other.num / other.den)

Β Β Β def __eq__(self, other):
Β Β Β Β Β Β Β return (self.num == other.num) and (self.den == other.den)

ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ это:

>>> a = Rational(1, 2)
>>> b = Rational(3, 4)

>>> a < b
True

>>> a <= b
True

>>> a == b
False

>>> a >= b
False

>>> a > b
False
@singledispatch

Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ трансформируСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² single-dispatch Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π±ΠΎΡ€ Π΅Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ опрСдСляСтся Ρ‚ΠΈΠΏΠΎΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Аналогичным ΠΏΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Ρƒ являСтся singledispatchmethod.

ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ:

@singledispatch

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

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ generic-Ρ„ΡƒΠΊΡ†ΠΈΡŽ с Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ @singledispatch:

@singledispatch
def test(arg):
Β Β Β print(f"Generic, arg: {arg}")

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ добавлСния Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ с использованиСм Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ²:

@test.register
def _(arg: int):
Β Β Β print(f"Int, arg: {arg}")

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ явного задания Ρ‚ΠΈΠΏΠ° Ρ‡Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ register().

@test.register(float)
def _(arg):
Β Β Β print(f"Float, arg: {arg}")

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с лямбда Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ:

test.register(str, lambda x: f"Str, arg: {x}")

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡƒΠΆΠ΅ созданной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

def list_printer_already_exist(arg):
Β Β Β print(f"List, arg {arg}")

test.register(list, lambda x: f"List, arg: {x}")

ДСмонстрация Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ test() Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ°Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²:

>>> test(None)
Generic, arg: None

>>> test(1)
Int, arg: 1

>>> test(2.0)
Float, arg: 2.0

>>> test("hello")
'Str, arg: hello'

>>> test([1,2,3])
'List, arg: [1, 2, 3]'

@wraps

Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ для упрощСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ update_wrapper().

ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ:

@wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)

ОписаниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌ для update_wrapper.

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

def some_mul(a: int) -> int:
Β Β Β """a * some value"""
Β Β Β return a * 1

@wraps(some_mul)
def x20(a):
Β Β Β return a * 20

>>> x20(3)
60

>>> x20.__name__
'some_mul'

>>> x20.__annotations__
{'a': <class 'int'>, 'return': <class 'int'>}

>>> x20.__doc__
'a * some value'

ΠœΠΎΠ΄ΡƒΠ»ΡŒ operator

ΠœΠΎΠ΄ΡƒΠ»ΡŒ operator содСрТит эффСктивныС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Ρ‹ΡΡˆΠΈΡ… порядков.

НапримСр, функция reduce ΠΈΠ· модуля functools, рассмотрСнного Π²Ρ‹ΡˆΠ΅, ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для свСртки. Π•Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π³Π΄Π΅-Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎ мСсту (Π² Π²ΠΈΠ΄Π΅ лямбды) Π»ΠΈΠ±ΠΎ, Ссли ΠΎΠ½Π° Π΅ΡΡ‚ΡŒ Π² составС модуля operator, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠΌ:

>>> from operator import mul
>>> from functools import reduce

>>> reduce(lambda a, b: a * b, [1,2,3,4,5])
120

>>> reduce(mul, [1,2,3,4,5])
120

НиТС прСдставлСна Ρ‚Π°Π±Π»ΠΈΡ†Π° с функциями ΠΈΠ· модуля operator.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡΠ‘ΠΈΠ½Ρ‚Π°ΠΊΡΠΈΡΠ€ΡƒΠ½ΠΊΡ†ΠΈΡ
Π‘Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅a + badd(a, b)
ΠšΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΡseq1 + seq2concat(seq1, seq2)
ВСст Π½Π° Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅obj in seqcontains(seq, obj)
Π”Π΅Π»Π΅Π½ΠΈΠ΅a / btruediv(a, b)
Π”Π΅Π»Π΅Π½ΠΈΠ΅a // bfloordiv(a, b)
ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ Иa & band_(a, b)
ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ Π˜Π›Π˜a ^ bxor(a, b)
Битовая инвСрсия~ ainvert(a)
ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ Π˜Π›Π˜a | bor_(a, b)
Π’ΠΎΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒa ** bpow(a, b)
ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ a Π΅ΡΡ‚ΡŒ ba is bis_(a, b)
ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ a Π½Π΅ Π΅ΡΡ‚ΡŒ ba is not bis_not(a, b)
ΠŸΡ€ΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ значСния элСмСнту  ΠΏΠΎ Π΅Π³ΠΎ индСксуobj[k] = vsetitem(obj, k, v)
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнта ΠΏΠΎ Π΅Π³ΠΎ индСксуdel obj[k]delitem(obj, k)
ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ элСмСнта ΠΏΠΎ Π΅Π³ΠΎ индСксуobj[k]getitem(obj, k)
Π‘Π΄Π²ΠΈΠ³ Π²Π»Π΅Π²ΠΎa << blshift(a, b)
ΠžΡΡ‚Π°Ρ‚ΠΎΠΊ ΠΎΡ‚ дСлСнияa % bmod(a, b)
Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅a * bmul(a, b)
Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†a @ bmatmul(a, b)
ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ вСрсии числа– aneg(a)
ЛогичСскоС НЕnot anot_(a)
ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ вСрсии числа+ apos(a)
Π‘Π΄Π²ΠΈΠ³ Π²ΠΏΡ€Π°Π²ΠΎa >> brshift(a, b)
ΠŸΡ€ΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ срСзу ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈseq[i:j] = valuessetitem(seq, slice(i, j), values)
Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ срСза элСмСнтовdel seq[i:j]delitem(seq, slice(i, j))
ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ срСзаseq[i:j]getitem(seq, slice(i, j))
Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ строкиs % objmod(s, obj)
Π’Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅a – bsub(a, b)
ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° истинностиobjtruth(obj)
ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ порядкаa < blt(a, b)
ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ порядкаa <= ble(a, b)
ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° равСнстваa == beq(a, b)
ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° нСравСнстваa != bne(a, b)
ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ порядкаa >= bge(a, b)
ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ порядкаa > bgt(a, b)

ΠœΠΎΠ΄ΡƒΠ»ΡŒ operator содСрТит вСрсии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΎΠ½ΠΈ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚.

P.S.

Π’Π²ΠΎΠ΄Π½Ρ‹Π΅ ΡƒΡ€ΠΎΠΊΠΈ ΠΏΠΎ β€œΠ›ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π°Π»Π³Π΅Π±Ρ€Π΅ Π½Π° Python” Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ страницС нашСго сайта. ВсС ΡƒΡ€ΠΎΠΊΠΈ ΠΏΠΎ этой Ρ‚Π΅ΠΌΠ΅ собраны Π² ΠΊΠ½ΠΈΠ³Π΅ β€œΠ›ΠΈΠ½Π΅ΠΉΠ½Π°Ρ Π°Π»Π³Π΅Π±Ρ€Π° Π½Π° Python”.

Если Π²Π°ΠΌ интСрСсна Ρ‚Π΅ΠΌΠ° Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ ΠΌΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Pandas.Β  Для Π½Π°Ρ‡Π°Π»Π° Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с вводными ΡƒΡ€ΠΎΠΊΠ°ΠΌΠΈ. ВсС ΡƒΡ€ΠΎΠΊΠΈ ΠΏΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Pandas собраны Π² ΠΊΠ½ΠΈΠ³Π΅ β€œPandas. Π Π°Π±ΠΎΡ‚Π° с данными”.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python. Π§Π°ΡΡ‚ΡŒ 2. Абстракция ΠΈ композиция. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Если ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, Ρ‚ΠΎ это Π±ΡƒΠ΄ΡƒΡ‚ абстракция ΠΈ композиция (Category: The Essence of Composition). Рассмотрим ΠΈΡ… Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€ΠΈΠ·ΠΌΡƒ понятия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ Π½Π° Python.

Для Π½Π°Ρ‡Π°Π» обратимся ΠΊ Π²ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ Π·Π° опрСдСлСниями ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ²:Β 

Абстракция (Π»Π°Ρ‚. abstractio β€” ΠΎΡ‚Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅) β€” тСорСтичСскоС ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ абстрагирования. АбстрагированиС β€” ΠΎΡ‚Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π² процСссС познания ΠΎΡ‚ нСсущСствСнных сторон, свойств, связСй ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π° ΠΈΠ»ΠΈ явлСния) с Ρ†Π΅Π»ΡŒΡŽ выдСлСния ΠΈΡ… сущСствСнных, Π·Π°ΠΊΠΎΠ½ΠΎΠΌΠ΅Ρ€Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠ². Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ абстрагирования β€” абстрактныС понятия, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: Ρ†Π²Π΅Ρ‚, ΠΊΡ€ΠΈΠ²ΠΈΠ·Π½Π°, красота ΠΈ Ρ‚. Π΄.Β 

ΠšΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡ (Π»Π°Ρ‚. compositio β€” составлСниС, связываниС, слоТСниС, соСдинСниС) β€” составлСниС Ρ†Π΅Π»ΠΎΠ³ΠΎ ΠΈΠ· частСй.Β 

Число

Когда говорят ΠΏΡ€ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΠ»Ρ‹ΡˆΠ°Ρ‚ΡŒ Ρ„Ρ€Π°Π·Ρƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ β€œΠ±Π»ΠΈΠ·ΠΊΠΎ ΠΊ матСматикС” ΠΈ это Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Π°ΠΊ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ обратимся ΠΊ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с абстракциСй, ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠ΅ΠΉ ΠΈ ΠΈΡ… Ρ€ΠΎΠ»ΡŒΡŽ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ.Β 

НачнСм с Π±Π°Π·ΠΎΠ²ΠΎΠΉ Π²Π΅Ρ‰ΠΈ – с понятия числа. Π’ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с числами, это достаточно Π½ΠΎΠ²ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π΅Π½ΠΈΠ΅ чСловСчСства. Для нас, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ: ΠΏΡΡ‚ΡŒ яблок ΠΈΠ»ΠΈ ΠΏΡΡ‚ΡŒ ΡΡ‚ΡƒΠ»ΡŒΠ΅Π² β€” это ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ пятСрки. Число ΠΏΡΡ‚ΡŒ, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС, это нСкоторая абстракция, которая позволяСт Π½Π΅ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ содСрТании (ΡΡ‚ΡƒΠ»ΡŒΡ, яблоки ΠΈ Ρ‚.ΠΏ.), Π° ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° ΠΈΡ… количСствС. Но понадобились тысячи Π»Π΅Ρ‚ ΡΠ²ΠΎΠ»ΡŽΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ это ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ (люди) ΠΌΠΎΠ³Π»ΠΈ ΠΎΡ‚Π²Π»Π΅Ρ‡Π΅Π½Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ числа. Об этом интСрСсно ΠΏΠΈΡˆΠ΅Ρ‚ АлСксСй Π‘Π°Π²Π²Π°Ρ‚Π΅Π΅Π² Π² ΠΊΠ½ΠΈΠ³Π΅ β€œΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ° для гуманитариСв”, ΠΈ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Ρ‚Π°ΠΌ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: β€œβ€¦ Π² русском языкС Π΄ΠΎ сих ΠΏΠΎΡ€ говорят β€œΡΠΎΡ€ΠΎΠΊβ€ вмСсто β€œΡ‡Π΅Ρ‚Ρ‹Ρ€ΡŒΠ΄Π΅ΡΡΡ‚β€, хотя Ρ€Π°Π½ΡŒΡˆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ β€œΡΠΎΡ€ΠΎΠΊ ΡΠΎΠ±ΠΎΠ»ΡŒΠΈΡ… ΡˆΠΊΡƒΡ€ΠΎΠΊβ€, Π½ΠΎ Π½Π΅ β€œΡΠΎΡ€ΠΎΠΊ Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π²β€. Π’ΠΎ Π΅ΡΡ‚ΡŒ сорок ΠΎΠ·Π½Π°Ρ‡Π°Π»ΠΎ Π½Π΅ количСство ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠ² Π²ΠΎΠΎΠ±Ρ‰Π΅, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ…. БСйчас ΠΌΡ‹ довольно свободно ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ числами для счСта ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠ² (ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ), Π° сами вычислСния выполняСм ΡƒΠΆΠ΅ Π² ΠΎΡ‚Ρ€Ρ‹Π²Π΅ ΠΎΡ‚ связи числа с ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒΡŽ.Β 

Ѐункция

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Π²Π°ΠΆΠ½Ρ‹ΠΌ шагом Π² Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ уровня абстракции Π±Ρ‹Π»Π° Π·Π°ΠΌΠ΅Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… чисСл Π½Π° Π±ΡƒΠΊΠ²Π΅Π½Π½Ρ‹Π΅ обозначСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ, ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΈ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт – Π°Π»Π³Π΅Π±Ρ€Ρƒ (стоит Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π° процСсс Π΅Π΅ становлСния повлияло Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°ΠΌΠ΅Π½Π° числа Π±ΡƒΠΊΠ²ΠΎΠΉ, Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ нуля ΠΈ Ρ‚.Π΄.). Если ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π½ΠΈΠΆΠ΅ выраТСния:Β 

1+2=3Β 

4+7=11Β 

121+144=265Β 

… 

Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ складываСм ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ числа ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π—Π°ΠΌΠ΅Π½ΠΈΠ² числа Π½Π° Π±ΡƒΠΊΠ²Ρ‹, ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ с уровня числСнного ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Π½Π° ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ, ΠΊΠΎΠ³Π΄Π° для нас Π±ΡƒΠ΄Π΅Ρ‚ Π²Π°ΠΆΠ½Π° ΡƒΠΆΠ΅ сама опСрация ΠΈ Π΅Π΅ свойства, Π° Π½Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΊΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ссли, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ ΠΈ Π΄Π²ΠΎΠΉΠΊΡƒ, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ‚Ρ€ΠΎΠΉΠΊΡƒ.Β 

a + b = cΒ 

ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΠ² Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρƒ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΡƒΡŽ Π²Ρ‹ΡˆΠ΅, ΠΌΡ‹ Π°Π±ΡΡ‚Ρ€Π°Π³ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… чисСл ΠΈ сосрСдоточили своС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ – слоТСнии. Для нас – программистов, это Π²Π°ΠΆΠ½Ρ‹ΠΉ шаг Π½Π° ΠΏΡƒΡ‚ΠΈ понимания абстракции. Π­Ρ‚ΠΎ идСя позволяСт Π½Π°ΠΌ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ Π½Π°Π±ΠΎΡ€Ρ‹ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π° ΠΏΠΎΡ‚ΠΎΠΌ сколько ΡƒΠ³ΠΎΠ΄Π½ΠΎ Ρ€Π°Π· ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ слоТСния Π΄Π²ΡƒΡ… чисСл:Β 

>>> def add(a, b):Β 
        return a + bΒ 

>>> add(1, 3)Β 
4Β 
>>> add(4, 7)Β 
11

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

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

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

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ Π·Π°Π΄Π°Ρ‡ΠΈ. Π’ΠΎΡ‡ΠΊΡƒ с ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ Π±ΡƒΠ΄Π΅ΠΌ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ (см Python. Π£Ρ€ΠΎΠΊ 8. ΠšΠΎΡ€Ρ‚Π΅ΠΆΠΈ (tuple)). НапишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π²ΠΎΠ·Π²ΠΎΠ΄ΠΈΡ‚ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ Π΄Π²ΡƒΡ… чисСл:Β 

>>> sq_sub = lambda x1, x2: (x2 - x1)**2

Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ нСпосрСдствСнно саму Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ dist:Β 

>>> dist = lambda p1, p2: (sq_sub(p1[0], p2[0])+sq_sub(p1[1], p2[1]))**0.5

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ:Β 

>>> point1 = (1, 1)Β 
>>> point2 = (4, 5)Β 
>>> dist(point1, point2)Β 
5.0

ΠšΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Π˜ΡΡΠ»Π΅Π΄ΡƒΠ΅ΠΌ Π·Π°Π΄Π°Ρ‡Ρƒ опрСдСлСния расстояния ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΈΠ΄Π΅ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΈΠ· ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΈ. ΠšΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠΎΠΉ:

ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΠΈ ΠΎΠ½Π° записываСтся Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

h = g ∘ f

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ примСнСния ряда Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

РСшим Π½Π°ΡˆΡƒ Π·Π°Π΄Π°Ρ‡Ρƒ, Π·Π°Π΄Π°Π² всС вычислСния явно – Ρ‡Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, для этого Π½Π°ΠΌ понадобятся:Β 

>>> sub = lambda a, b: a - b # функция вычитания 
>>> sq = lambda x: x**2      # функция возвСдСния Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Β 
>>> sm = lambda a, b: a + b  # функция слоТСния 
>>> sqrt = lambda x: x**0.5  # функция извлСчСния ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ корня

Благодаря Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Python ΡƒΠΌΠ΅Π΅Ρ‚ Ρ€Π°ΡΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅Ρ‚ этим Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ dist ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:Β 

>>> dist = lambda x1, y1, x2, y2: sqrt(sm(sq(sub(x1, x2)), sq(sub(y1, y2))))Β 
>>> dist(*point1, *point2)Β 
5.0

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Ρƒ нас ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ Ρ‚.Π΄., Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΡ‹ построили ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ряда простых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π±ΠΎΠ»Π΅Π΅ слоТной Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ. ЕстСствСнно, с практичСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dist Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»Π΅Π½, Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π±Ρ‹Π» ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ для ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°.Β 

РСкурсия

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ создания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ объСдинСния ΠΈΡ… Π² ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ довольно большоС количСство Π·Π°Π΄Π°Ρ‡ (ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ…): ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π»ΠΎΠ³Π°Ρ€ΠΈΡ„ΠΌ, Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ синус ΠΈΠ»ΠΈ косинус Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡƒΠ³Π»Π°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ числа ΠΈ Ρ‚.Π΄. ВсС эти Π·Π°Π΄Π°Ρ‡ΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ достаточно ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ число (ΠΈΠ»ΠΈ Π½Π°Π±ΠΎΡ€ чисСл), Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΈ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. Но Π±Ρ‹Π²Π°ΡŽΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ, Π³Π΄Π΅ этого нСдостаточно, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π° числа ΠΈΠ»ΠΈ элСмСнта ряда Π€ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ. ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ этих Π·Π°Π΄Π°Ρ‡ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ присутствуСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ процСсс, ΠΏΡ€ΠΎΡ‚Π΅ΠΊΠ°Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ опрСдСляСтся ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ расстояния ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ ΠΏΠΎ ΡƒΠΆΠ΅ извСстной Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅, ΠΌΡ‹ всСгда Π±ΡƒΠ΄Π΅ΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎΠΆΠ΅ количСство ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ: Π΄Π²Π° вычитания, Π΄Π²Π° возвСдСния Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ, ΠΎΠ΄Π½ΠΎ слоТСниС ΠΈ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΈΠ·Π²Π»Π΅Ρ‡Π΅ΠΌ ΠΊΠΎΡ€Π΅Π½ΡŒ. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ придСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π», опрСдСляСтся числом, Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π½Π°ΠΉΡ‚ΠΈ: для Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π° пяти – ΠΏΡΡ‚ΡŒ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠΉ, для Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π° дСсяти – Π΄Π΅ΡΡΡ‚ΡŒ.

Для построСния Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° (ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ) Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… процСссов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ рСкурсия. Π‘ΡƒΡ‚ΡŒ рСкурсии Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ функция вызываСтся ΠΈΠ· Π½Π΅Π΅ ΠΆΠ΅ самой. О рСкурсии ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ достаточно ΠΌΠ½ΠΎΠ³ΠΎ сказано Π½Π° devpractice (https://devpractice.ru/fp-python-part1-general/#p32, https://devpractice.ru/about-rec-and-iter/), поэтому ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π½Π° Π½Π΅ΠΉ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ.Β 

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг Π½Π° ΠΏΡƒΡ‚ΠΈ ΠΊ абстракции Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ внСшнС, казалось Π±Ρ‹, Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‰ΠΈΠ΅ Ρ‡Π΅Ρ€Ρ‚Ρ‹. НапримСр, Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π½Π°ΠΉΡ‚ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Ρ‹ чисСл Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ массива, ΠΈΠ»ΠΈ ΠΈΠ· Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° чисСл ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ, элСмСнтами ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹Π΅ значСния элСмСнтов ΠΈΠ· исходного массива. Π­Ρ‚ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π½Π°Ρ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ Π½Π° идСю построСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ внСшнСго интСрфСйса, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅Π³ΠΎ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊ элСмСнтам этого Π½Π°Π±ΠΎΡ€Π°. ИдСя, лСТащая Π² этом Ρ‚ΠΈΠΏΠ΅ абстракции Ρ‚Π° ΠΆΠ΅, Ρ‡Ρ‚ΠΎ использовалась Π½Π°ΠΌΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠ»ΠΈ ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ 2+3=5, 7+8=15 ΠΈ Ρ‚.ΠΏ. ΠΊ самой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ слоТСния: ΠΌΡ‹ Π°Π±ΡΡ‚Ρ€Π°Π³ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ ΠΎΡ‚ чисСл, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ ΠΈ ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΠ»ΠΈΡΡŒ Π½Π° выполняСмой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π’Π°ΠΊ ΠΈ здСсь, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π°Π±ΡΡ‚Ρ€Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ частности: возвСдСния всСх элСмСнтов Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ ΠΈΠ»ΠΈ взятиС Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ значСния, ΠΈ ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° сути процСсса: ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ элСмСнту Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… для построСния Π½ΠΎΠ²ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π°.Β 

Π’Π°ΠΊ, ΠΌΡ‹ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΈΠ΄Π΅Π΅, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠΌ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π’Π°ΠΊΠΈΠ΅ конструкции носят Π½Π°Π·Π²Π°Π½ΠΈΠ΅: Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка (higher-order function). Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, нСбольшиС ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ, Ρ‚ΠΎ для удобства, ΠΈΡ… ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΡƒΡŽΡ‚ Π² Π²ΠΈΠ΄Π΅ lambd’ы прямо Π² мСстС Π²Ρ‹Π·ΠΎΠ²Π°. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ нСсколько ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… свойств lambda-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:Β 

Π˜Ρ… ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π² мСстС объявлСния:Β 

>>> (lambda x: x*2)(3)

Lambd’у ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π² дальнСйшСм:Β 

>>> mul2 = lambda x: x*2Β 
>>> mul2(3)Β 
6

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

>>> list(map(lambda x: x**2, [1, 2, 3, 4, 5]))Β 
[1, 4, 9, 16, 25]

Ѐункция list Π½ΡƒΠΆΠ½Π° для построСния списка ΠΈΠ· Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ map.Β 

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

>>> def is_config_valid(validator, data_struct):Β 
        return validator(data_struct)

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ:Β 

>>> tmp_conf = {"test1": 123}

Для Π½Π΅Π΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠΌ Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€:Β 

>>> is_tmp_valid = lambda x: True if "test1" in x else False

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:Β 

>>> is_config_valid(is_tmp_valid, tmp_conf)Β 
True

Π’ случаС, Ссли конфигурация ΠΈΠΌΠ΅Π΅Ρ‚ ошибки:Β 

>>> tmp2_conf = {"test2": 456}

Π’Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€ Π½Π°ΠΌ ΠΎΠ± этом сообщит:Β 

>>> is_config_valid(is_tmp_valid, tmp2_conf)Β 
False

Ѐункция ΠΊΠ°ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠšΠ°Ρ€Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, частичноС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅

Помимо возмоТности ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΈΠ½ΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π·Π°Π΄Π°Ρ‡Π° возвращСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹. ИдСя Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° нашла ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² построСнии замыкания ΠΈ каррирования. Π Π°Π·Π±Π΅Ρ€Π΅ΠΌ эти понятия Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ.Β 

Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅β€” функция, Π² Ρ‚Π΅Π»Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ссылки Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π²Π½Π΅ Ρ‚Π΅Π»Π° этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅ ΠΈ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ Π΅Ρ‘ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ. Поясним эту идСю Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅: построим конструктор Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΈΠ΄Π° y = k*x + b с Π·Π°Ρ€Π°Π½Π΅Π΅ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ коэффициСнтами:Β 

>>> def linear_builder(k, b):Β 
        def helper(x):Β 
            return k * x + bΒ 
    return helper

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π»ΠΈΠ½Π΅ΠΉΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ 3 * x + 9Β 

>>> linf = linear_builder(3, 9)Β 
>>> linf(5)Β 
24

Если вас заинтСрСсовала Ρ‚Π΅ΠΌΠ° замыкания, Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ Π²Π°ΠΌ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Замыкания Π² Python.Β 

Β ΠšΠ°Ρ€Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β β€” ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‚ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Π‘ΡƒΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΎΡ‚ Π²ΠΈΠ΄Π° f(x, y, z) ΠΊ Π²ΠΈΠ΄Ρƒ f(x)(y)(z). ΠšΠ°Ρ€Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ позволяСт ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ частично ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.Β 

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая складываСт Ρ‚Ρ€ΠΈ числа:Β 

>>> def faddr(x, y, z):Β 
        return x + y + zΒ 

>>> faddr(1, 2, 3)Β 
6

ΠšΠ°Ρ€Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:Β 

>>> def curr_faddr(x):Β 
    def tmp_a(y):Β 
        def tmp_b(z):Β 
            return x+y+zΒ 
        return tmp_bΒ 
    return tmp_aΒ 

>>> curr_faddr(1)(2)(3)Β 
6

На Π±Π°Π·Π΅ Π½Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ частично ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:Β 

>>> p_c_faddr = curr_faddr(1)(2)Β 
>>> p_c_faddr(3)Β 
6

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ p_c_faddr Π΄Π΅Π»Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ 1+2+x, нСизвСстноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ x ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.Β 

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ – ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса 

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

  • ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сохранСна Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ структурС Π΄Π°Π½Π½Ρ‹Ρ…;Β 
  • ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π° Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚;Β 
  • ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚;Β 
  • ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создана Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹;Β 
  • Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ имСнования.Β 

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

P.S.

Π’Π²ΠΎΠ΄Π½Ρ‹Π΅ ΡƒΡ€ΠΎΠΊΠΈ ΠΏΠΎ β€œΠ›ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π°Π»Π³Π΅Π±Ρ€Π΅ Π½Π° Python” Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ страницС нашСго сайта. ВсС ΡƒΡ€ΠΎΠΊΠΈ ΠΏΠΎ этой Ρ‚Π΅ΠΌΠ΅ собраны Π² ΠΊΠ½ΠΈΠ³Π΅ β€œΠ›ΠΈΠ½Π΅ΠΉΠ½Π°Ρ Π°Π»Π³Π΅Π±Ρ€Π° Π½Π° Python”.

Если Π²Π°ΠΌ интСрСсна Ρ‚Π΅ΠΌΠ° Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ ΠΌΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Pandas.Β  Для Π½Π°Ρ‡Π°Π»Π° Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с вводными ΡƒΡ€ΠΎΠΊΠ°ΠΌΠΈ. ВсС ΡƒΡ€ΠΎΠΊΠΈ ΠΏΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Pandas собраны Π² ΠΊΠ½ΠΈΠ³Π΅ β€œPandas. Π Π°Π±ΠΎΡ‚Π° с данными”.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python β€” ВикипСдия

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

ВозмоТности

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Ѐункция Π² Python ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° def ΠΈΠ»ΠΈ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ эквивалСнтны:

def func(x, y):
    return x**2 + y**2

func = lambda x, y: x**2 + y**2

Π’ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‚ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. НСкоторыС ΠΈΠ· Π½ΠΈΡ… ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ВсС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ со значСниями ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ послС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π±Π΅Π· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ фактичСскиС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. НапримСр:

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

Ѐункция всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (ΠΈΠ»ΠΈ None, Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π·Π°Π΄Π°Π½ΠΎ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ return ΠΈΠ»ΠΈ этот ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ встрСчСн ΠΏΠΎ достиТСнии ΠΊΠΎΠ½Ρ†Π° опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ). Однако, это Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ.

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ лямбда-выраТСния, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΡƒΡ‚ ΠΆΠ΅ Π΅Ρ‘ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:

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

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π°Ρ€Π°Π²Π½Π΅ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

БписковыС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

БписковоС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅[1] (Π°Π½Π³Π».Β list comprehension)Β β€” Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… срСдств Python. НапримСр, для вычислСния списка ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ†Π΅Π»Ρ‹Ρ… чисСл, ΠΌΠ΅Π½ΡŒΡˆΠΈΡ… 10, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

l = [x**2 for x in range(1,10)]

ВстроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠΈΡ… порядков

Π’ Python Π΅ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: map(), filter(), reduce(), apply().

map()

Ѐункция map() позволяСт ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ»ΠΈ нСсколько ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

>>> list1 = [7, 2, 3, 10, 12]
>>> list2 = [-1, 1, -5, 4, 6]
>>> map(lambda x, y: x*y, list1, list2)
[-7, 2, -15, 40, 72]

Аналогичного (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ Π΄Π»ΠΈΠ½Π΅ списков) Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ списочных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ:

>>> [x*y for x, y in zip(list1, list2)]
[-7, 2, -15, 40, 72]
filter()

Ѐункция filter() позволяСт Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ значСния ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ спискС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ значСния, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для элСмСнта истинно:

>>> numbers = [10, 4, 2, -1, 6]
>>> filter(lambda x: x < 5, numbers)     # Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ элСмСнты x, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… x < 5 истинно
[4, 2, -1]

Π’ΠΎ ΠΆΠ΅ самоС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ списковых Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ:

>>> numbers = [10, 4, 2, -1, 6]
>>> [x for x in numbers if x < 5]
[4, 2, -1]
reduce()

Для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ†Π΅ΠΏΠΎΡ‡Π΅Ρ‡Π½Ρ‹Ρ… вычислСний Π² спискС ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ reduce(). НапримСр, ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ элСмСнтов списка ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ вычислСно Ρ‚Π°ΠΊ (Python 2):

>>>from functools import reduce
>>>numbers = [2, 3, 4, 5, 6]
>>> reduce(lambda res, x: res*x, numbers, 1)
720

ВычислСния происходят Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ порядкС:

Π¦Π΅ΠΏΠΎΡ‡ΠΊΠ° Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² связываСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° (res). Если список пустой, просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ (Π² случаС произвСдСния нуля ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»Π΅ΠΉ это 1):

>>> reduce(lambda res, x: res*x, [], 1)
1

РазумССтся, ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ число. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, Π² Ρ‚ΠΎΠΌ числС ΠΈ список. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ рСвСрс списка:

>>> reduce(lambda res, x: [x]+res, [1, 2, 3, 4], [])
[4, 3, 2, 1]

Для Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² Python Π΅ΡΡ‚ΡŒ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

>>> numbers = [1, 2, 3, 4, 5]
>>> sum(numbers)
15
>>> list(reversed(numbers))
[5, 4, 3, 2, 1]

Π’ Python 3 встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reduce() Π½Π΅Ρ‚, Π½ΠΎ Π΅Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ functools.

apply()

Ѐункция для примСнСния Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ списком ΠΈ словарСм соотвСтствСнно (Python 2):

>>> def f(x, y, z, a=None, b=None):
...     print x, y, z, a, b
...
>>> apply(f, [1, 2, 3], {'a': 4, 'b': 5})
1 2 3 4 5

Π’ Python 3 вмСсто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ apply() слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ синтаксис:

>>> def f(x, y, z, a=None, b=None):
...     print(x, y, z, a, b)
...
>>> f(*[1, 2, 3], **{'a': 4, 'b': 5})
1 2 3 4 5

Замыкания

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, опрСдСляСмыС Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹Π΅ замыкания (Π°Π½Π³Π».Β closures)[2]:

def multiplier(n):
    "multiplier(n) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΡƒΠΌΠ½ΠΎΠΆΠ°ΡŽΡ‰ΡƒΡŽ Π½Π° n"
    def mul(k):
        return n*k
    return mul
# Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ эффСкта ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ
# multiplier = lambda n: lambda k: n*k
mul2 = multiplier(2) # mul2 - функция, ΡƒΠΌΠ½ΠΎΠΆΠ°ΡŽΡ‰Π°Ρ Π½Π° 2, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, mul2(5) == 10

Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

Π”Ρ€ΡƒΠ³ΠΈΠ΅ срСдства Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования доступны ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠ΄ΡƒΠ»ΡŒ itertools) ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΈ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² (ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ print, поэтому ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ Π² Π½Π΅ΠΌ значСния Π±Ρ‹Π»ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² список):

>>> it = enumerate(sorted("PYTHON"))  # ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ для пСрСчислСнных отсортированных Π±ΡƒΠΊΠ² слова
>>> it.next()                         # ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
(0, 'H')
>>> print list(it)                    # ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ значСния Π² Π²ΠΈΠ΄Π΅ списка
[(1, 'N'), (2, 'O'), (3, 'P'), (4, 'T'), (5, 'Y')]

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ использованиС модуля itertools:

>>> from itertools import chain
>>> print list(chain(iter("ABC"), iter("DEF")))
['A', 'B', 'C', 'D', 'E', 'F']

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

from math import cos
from itertools import groupby
lst = [cos(x*.4) for x in range(30)]                       # косинусоида
[list(y) for k, y in groupby(lst, lambda x: x > 0)]        # Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… чисСл

Π’ ΠΌΠΎΠ΄ΡƒΠ»Π΅ itertools Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΊΡ€Π°Ρ‚ΠΊΠΎ (Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ стилС) ΠΈ с Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния — эффСктивно — Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ процСссы ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ списков.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ functools

Π’ Python 2.5 появился ΠΌΠΎΠ΄ΡƒΠ»ΡŒ functools ΠΈ Π² частности Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ частичного примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

>>> from  functools import partial
>>> def myfun(a, b): return a + b
...
>>> myfun1 = partial(myfun, 1)
>>> print myfun1(2)
3

(ЧастичноС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ
Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ ΠΈΠ»ΠΈ
Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ²)

Π›Π΅Π½ΠΈΠ²Ρ‹Π΅ вычислСния

Π›Π΅Π½ΠΈΠ²Ρ‹Π΅ вычислСния ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Python нСсколькими способами, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹:

  • ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠ΅ логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ or ΠΈ and Π½Π΅ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄, Ссли Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ опрСдСляСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠΌ
  • лямбда-выраТСния
  • ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ классы с Π»Π΅Π½ΠΈΠ²ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ вычислСний[3] ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Ρ‹
  • Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π½Ρ‹Π΅ выраТСния
  • (Python 2.5) if-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Β«Π»Π΅Π½ΠΈΠ²ΡƒΡŽΒ» сСмантику (вычисляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ΅Π½)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ if-выраТСния. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° print ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈΡΡŒ:

>>> def f():
...     print "f"
...     return "f"
...
>>> def g():
...     print "g"
...     return "g"
...
>>> f() if True else g()
f
'f'
>>> f() if False else g()
g
'g'

НСкоторыС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈΠ· ΠΊΠ½ΠΈΠ³ΠΈ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ²:

  • ЛСнивая сортировка[4]
  • Π›Π΅Π½ΠΈΠ²Ρ‹ΠΉ ΠΎΠ±Ρ…ΠΎΠ΄ Π³Ρ€Π°Ρ„Π°[5]
  • Π›Π΅Π½ΠΈΠ²ΠΎΠ΅ вычислСниС свойств[6]
  • ΠšΠ°Ρ€Ρ€ΠΈΠ½Π³[7]

Π€ΡƒΠ½ΠΊΡ‚ΠΎΡ€Ρ‹

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

НиТС прСдставлСно Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ ΠΈ эквивалСнтный Π΅ΠΌΡƒ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€:

def addClosure(val1):
    def closure(val2):
        return val1 + val2
    return closure
    
class AddFunctor(object):
    def __init__(self, val1):
        self.val1 = val1
    def __call__(self, val2):
        return self.val1 + val2

cl = addClosure(2)
fn = AddFunctor(2)

print cl(1), fn(1)  # Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ "3 3"

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ быстрСС, Ρ‡Π΅ΠΌ ΠΊΠΎΠ΄ с Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠΌ. Π­Ρ‚ΠΎ связанно с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ получСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° val Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ self (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ ΠΏΡ€ΠΎΠ΄Π΅Π»Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΎΠ΄Π½Ρƒ Python ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ большС).
Π’Π°ΠΊΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Ρ‹ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ² с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ.
Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Π°ΠΌ доступны всС возмоТности ООП Π² Python, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΈΡ… ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Β«Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒΒ» исполняСмыС Π½Π°Π΄ Π½ΠΈΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ ΠΈΡ….
Для этого достаточно ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹.

class SlowFunctor(object):
	def __init__(self,func):
		self.func = func
	def __add__(self,val):                  # слоТСниС Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Π° с Ρ‡Π΅ΠΌ-Ρ‚ΠΎ
		if isinstance(val,SlowFunctor): # Ссли это Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€
			new_func = lambda *dt,**mp : self(*dt,**mp) + val(*dt,**mp)
		else:                           # Ссли Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅
			new_func = lambda *dt,**mp : self(*dt,**mp) + val
		return SlowFunctor( new_func )
	def __call__(self,*dt):
		return self.func(*dt)

import math
def test1(x):
    return x + 1
def test2(x):
    return math.sin(x)

func = SlowFunctor(test1)                # создаСм Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€
func = func + SlowFunctor(test2)         # этот Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ с Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ
func = (lambda x : x + 2)(func)          # ΠΈ числами, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
                                         # ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ это число

def func2(x):                            # ЭквивалСнтная функция
    return test1(x) + test2(x) + 2

print func(math.pi)                      # ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ 3.14159265359
print func(math.pi) - func2(math.pi)     # ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ 0.0

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

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ создаСт Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅
ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌ всСх Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… lambda. МоТно ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€,
ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ гСнСрирования Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π° Π²ΠΎ врСмя исполнСния. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈ тСсты Π½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ
Π΅ΡΡ‚ΡŒ Π² ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Python ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.
ΠŸΡ€ΠΈ использовании этой Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ исполнСния Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ «статичСского» ΠΊΠΎΠ΄Π° (Ссли Π½Π΅ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π΅Π³ΠΎΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ конструированиС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ).
ВмСсто Π±Π°ΠΉΡ‚ΠΎΠΊΠΎΠ΄Π° Python ΠΌΠΎΠΆΠ½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ΄ Π½Π° языкС программирования
C, Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования ΠΈΠ»ΠΈ XML-Ρ„Π°ΠΉΠ»Ρ‹.

НСсмотря Π½Π° Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы, Π»Π΅Π½ΠΈΠ²ΠΎΠ΅ вычислСниС ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°Ρ‚ΡŒ Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ Π² скорости Π² случаях, ΠΊΠΎΠ³Π΄Π° дСйствия, ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΌ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠΌ, достаточно Π΄ΠΎΡ€ΠΎΠ³ΠΈΒ β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ ΠΎΠ±ΡŠΡ‘ΠΌΠ½Ρ‹Π΅ вычислСния ΠΈΠ»ΠΈ доступ ΠΊ диску. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ X Π»Π΅Π½ΠΈΠ²ΠΎ вычисляСтся ΠΏΠ΅Ρ€Π΅Π΄ условным ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ; для Π½Π΅Π³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ создана Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ². Π’ Ρ‚ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠ΅ условного ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°, Π³Π΄Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ X Π½Π΅ трСбуСтся ΠΏΠΎ Ρ…ΠΎΠ΄Ρƒ вычислСния, эта Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ просто ΠΎΡ‚Π±Ρ€ΠΎΡˆΠ΅Π½Π°, Π½Π΅ привСдя ΠΊ дорогостоящСму Π²Ρ‹Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡŽ. Π’ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠ΅, Π³Π΄Π΅ X трСбуСтся для вычислСния ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Ρ‘Ρ‚ Π΅Π³ΠΎ вычислСниС. ΠŸΡ€ΠΈ этом программисту Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ, Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· Π²Π΅Ρ‚ΠΎΠΊ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ: ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ дорогостоящСС вычислСниС X ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π±Ρ€ΠΎΡˆΠ΅Π½.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ

Бсылки

Π›ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π°

Π»ΡƒΡ‡ΡˆΠΈΡ… ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊ использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования Π² Python

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

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

Python — ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ язык программирования высокого уровня. Он ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ±ΡˆΠΈΡ€Π½ΡƒΡŽ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌ программирования ΠΈ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ. Если Π²Ρ‹ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚Π΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² Π½ΠΈΠΆΠ½ΠΈΠ΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ Python ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΡ… — ΠΈ Π΄Π°ΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ срСду выполнСния Π½Π° Π»Π΅Ρ‚Ρƒ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

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

Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ сказанного, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π½Π΅ просто Ρ‚Π°ΠΊ, ΠΈ ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π²Π°ΠΆΠ½Ρ‹ΠΌΠΈ инструмСнтами для понимания. «Как ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΊΠΎΠ΄Β» — ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, ΠΎΠ±ΡˆΠΈΡ€Π½Π°Ρ Ρ‚Π΅ΠΌΠ°, ΠΈ Π½Π° Π½Π΅Π΅ Π½Π΅Ρ‚ СдинствСнного ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π°! ВмСсто этого моя Ρ†Π΅Π»ΡŒ Π² этом сообщСнии Π² Π±Π»ΠΎΠ³Π΅ — ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ аспСктС: Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ Python. Π― расскаТу, Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅, ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Python ΠΈ ΠΊΠ°ΠΊ, ΠΏΠΎ ΠΌΠΎΠ΅ΠΌΡƒ ΠΎΠΏΡ‹Ρ‚Ρƒ, Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΊΠΎΠ΄, посСтитС наш ΠΊΠ°Π½Π°Π» YouTube!

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅?

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ FP — это ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ° кодирования, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ нСизмСняСмыС значСния ΠΈ «чистыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΒ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ±Ρ‰Π΅Π³ΠΎ состояния с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ функциями.ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° чистая функция ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π²Ρ…ΠΎΠ΄, ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ — Π±Π΅Π· измСнСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π±Π΅Π· ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов. Π’ этом смыслС чистыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ часто ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ с матСматичСскими опСрациями. НапримСр, 3 плюс 4 всСгда Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΡΡ‚ΡŒΡΡ 7, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ Π΅Ρ‰Π΅ матСматичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΈΠ»ΠΈ сколько Ρ€Π°Π· Π²Ρ‹ складывали Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Ρ€Π°Π½ΡŒΡˆΠ΅.

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

НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сущСствуСт с 1950-Ρ… Π³ΠΎΠ΄ΠΎΠ² ΠΈ рСализуСтся многочислСнными языками, ΠΎΠ½ΠΎ Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ описываСт язык программирования. Clojure, Common Lisp, Haskell ΠΈ OCaml — это языки, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ позициями Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ языка программирования, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ систСма Ρ‚ΠΈΠΏΠΎΠ² ΠΈ строгоС ΠΈΠ»ΠΈ Π»Π΅Π½ΠΈΠ²ΠΎΠ΅ вычислСниС.Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ· Π½ΠΈΡ… Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ запись Π² Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· Π½ΠΈΡ… Ρ‚Π΅ΠΌ ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ — ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ всС ΠΎΠ½ΠΈ ΠΎΡ‡Π΅Π½ΡŒ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠΌΠ΅Ρ‡Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ нСчистыС.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π΅ΠΏΡƒΡ‚Π°Ρ†ΠΈΡŽ Π·Π°ΡƒΠΌΠ½ΠΎΠ³ΠΎ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΡΠ»Π΅Π³Π°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ ΠΈΠ»ΠΈ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ отдаСтся ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΡŽ практичности. ΠšΡ€ΡƒΠΏΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Ρ€Π΅Π΄ΠΊΠΎ ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ языки Π² ΡˆΠΈΡ€ΠΎΠΊΠΎΠΌ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π΅ ΠΈΠ»ΠΈ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π΄Π΅Π»Π°ΡŽΡ‚ это Π½Π° мСньшСм ΡƒΡ€ΠΎΠ²Π½Π΅, Ρ‡Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ языки, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ C ++, Java ΠΈΠ»ΠΈ Python. Однако FP — это Π½Π° самом Π΄Π΅Π»Π΅ просто основа для Ρ€Π°Π·ΠΌΡ‹ΡˆΠ»Π΅Π½ΠΈΠΉ ΠΎ логичСских ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ… с ΠΈΡ… достоинствами ΠΈ нСдостатками, ΠΈ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ°ΠΌΠΈ.

Π₯ΠΎΡ‚ΠΈΡ‚Π΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ быстрСС ?

Kite — это ΠΏΠ»Π°Π³ΠΈΠ½ для PyCharm, Atom, Vim, VSCode, Sublime Text ΠΈ IntelliJ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ машинноС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²Π°ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, отсортированноС ΠΏΠΎ рСлСвантности. НачнитС ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ быстрСС сСгодня .

Π§Ρ‚ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Python?

Π₯отя Python Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½Π΅ являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ языком, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ всС Π² Python являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ.Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ.

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

plus = add

plus (3, 4) # Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 7

Лямбда

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

  (lambda a, b: a + b) (3, 4) # Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 7 

слоТСниС = lambda a, b: a + b
слоТСниС (3, 4) # Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 7

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

  Π°Π²Ρ‚ΠΎΡ€Ρ‹ = [ΠžΠΊΡ‚Π°Π²ΠΈΡ Π‘Π°Ρ‚Π»Π΅Ρ€, Исаак Азимов, Нил БтивСнсон, ΠœΠ°Ρ€Π³Π°Ρ€Π΅Ρ‚ Π­Ρ‚Π²ΡƒΠ΄, Usula K Le Guin, Рэй БрэдбСри] 
sorted (Π°Π²Ρ‚ΠΎΡ€Ρ‹, key = len) # Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список, отсортированный ΠΏΠΎ Π΄Π»ΠΈΠ½Π΅ ΠΈΠΌΠ΅Π½ΠΈ Π°Π²Ρ‚ΠΎΡ€Π°
отсортировано (Π°Π²Ρ‚ΠΎΡ€Ρ‹, ΠΊΠ»ΡŽΡ‡ = лямбда-имя: имя.split () [- 1]) # Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список, отсортированный Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΠΎΠΌ порядкС ΠΏΠΎ Ρ„Π°ΠΌΠΈΠ»ΠΈΠΈ.

ΠžΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ стороной встроСнных лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π±Π΅Π· ΠΈΠΌΠ΅Π½ΠΈ Π² трассировкС стСка, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΠ»ΠΎΠΆΠ½ΠΈΡ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ.

Functools

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

  val = [1, 2, 3, 4, 5, 6] 

# Π£ΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π½Π° Π΄Π²Π°
list (map (lambda x: x * 2, val)) # [2, 4, 6, 8, 10, 12]
# Π’ΠΎΠ·ΡŒΠΌΠΈΡ‚Π΅ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π», ΡƒΠΌΠ½ΠΎΠΆΠΈΠ² ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт
ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ (лямбда: x, y: x * y, val, 1) # 1 * 1 * 2 * 3 * 4 * 5 * 6

БущСствуСт ΠΊΡƒΡ‡Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π±ΠΎΠ»Π΅Π΅ высокого порядка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ функциями Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ способами, Π² частности частичными, Ρ‡Ρ‚ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ извСстно ΠΊΠ°ΠΊ Β«ΠΊΠ°Ρ€Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β» — Ρ‚Π΅Ρ€ΠΌΠΈΠ½, Π½Π°Π·Π²Π°Π½Π½Ρ‹ΠΉ Π² Ρ‡Π΅ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΎΠΏΡ€ΠΎΡ…ΠΎΠ΄Ρ†Π° FP Π₯аскСлла ΠšΠ°Ρ€Ρ€ΠΈ.

  ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ Π΄Π΅Ρ„ (базовая, эксп): 
возвратная Π±Π°Π·Π° ** Π΅Ρ…Ρ€
ΠΊΡƒΠ± = частичный (ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ, Π΅Ρ…Ρ€ = 3)
cube (5) # Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 125

Для ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ ознакомлСния с Π²Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ концСпциями FP Π² Python, написанными Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ язык, я Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ здСсь ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠœΡΡ€ΠΈ Π ΠΎΡƒΠ· ΠšΡƒΠΊ.

Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ многострочныС Ρ†ΠΈΠΊΠ»Ρ‹ Π² нСвСроятно Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹Π΅ однострочныС. Однако срСднСму программисту Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π΅ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с Π½ΠΈΠΌΠΈ, особСнно ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΠΎΡ‡Ρ‚ΠΈ английским ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Python. Π›ΠΈΡ‡Π½ΠΎ я Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΌΠΎΠ³Ρƒ Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ порядок Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΡƒΡŽ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ выполняСт, хотя я просматривал ΠΈΡ… ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·. Π― Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΏΠΎΠΈΠ³Ρ€Π°Ρ‚ΡŒ с Π½ΠΈΠΌΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с концСпциями FP, ΠΈ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ я ΠΎΠΏΠΈΡˆΡƒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ случаи, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ Π² ΠΎΠ±Ρ‰Π΅ΠΉ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Π΅.

Π₯ΠΎΡ‚ΠΈΡ‚Π΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ быстрСС ?

Kite — это ΠΏΠ»Π°Π³ΠΈΠ½ для PyCharm, Atom, Vim, VSCode, Sublime Text ΠΈ IntelliJ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ машинноС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²Π°ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, отсортированноС ΠΏΠΎ рСлСвантности. НачнитС ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ быстрСС сСгодня .

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

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка Ρ‚Π°ΠΊΠΆΠ΅ встроСны Π² повсСднСвный Python Ρ‡Π΅Ρ€Π΅Π· Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹.Один ΠΈΠ· способов объявлСния Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ это, Π° символ @ — это Π² основном синтаксичСский сахар для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π΅ΠΊΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρƒ. Π’ΠΎΡ‚ простой Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ устанавливаСт ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Π΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ для Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ отказываСтся ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ самоС послСднСС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ послС 3 ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ.

  def retry (func): 
def retried_function (* Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ** kwargs):
exc = Π½Π΅Ρ‚
для _ в диапазонС (3):
ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅:
return func (* args, ** kwargs)
ΠΊΡ€ΠΎΠΌΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΠ°ΠΊ exc:
print ("Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅% s с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ:% s, kwargs:% s.ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½Π°Ρ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° "% (func, args, kwargs).

ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ exc
return retried_function

@retry
def do_something_risky ():
...

retried_function = retry (do_something_risky) # НСт нСобходимости ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `@`

Π­Ρ‚ΠΎΡ‚ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ оставляСт Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΈ значСния Π² точности Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΆΠ΅, Π½ΠΎ это Π½Π΅ являСтся ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡ… Ρ‚ΠΈΠΏ.Π˜Ρ… Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ самих ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π― Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ сами Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ²Π»ΡΡŽΡ‚ΡΡ «чисто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈΒ»; ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ (ΠΈ часто ΠΈΠΌΠ΅ΡŽΡ‚, ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅) ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты — ΠΎΠ½ΠΈ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΠΎΠ»Π΅Π΅ высокого порядка.

Как ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ Python срСднСго ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΠΎΠ³ΠΎ уровня, это ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠΎΡ‰Π½Ρ‹ΠΉ ΠΈ часто ΡΠ±ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ с Ρ‚ΠΎΠ»ΠΊΡƒ. Имя Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠΉ Π²Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ Π² трассировкС стСка, Ссли Π²Ρ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ functools.wraps для аннотирования.Π― Π²ΠΈΠ΄Π΅Π», ΠΊΠ°ΠΊ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ Π΄Π΅Π»Π°ΡŽΡ‚ ΠΎΡ‡Π΅Π½ΡŒ слоТныС ΠΈΠ»ΠΈ Π²Π°ΠΆΠ½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ значСния ΠΈΠ· json blobs ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ. Π― Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΈΠ΄Π΅Π» нСсколько ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ² для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ знания порядка прилоТСния Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π° для понимания. Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ встроСнныС Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ `staticmethod`, ΠΈΠ»ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ простыС, Ρ‡Π΅Ρ‚ΠΊΠΎ Π½Π°Π·Π²Π°Π½Π½Ρ‹Π΅ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ экономят ΠΌΠ½ΠΎΠ³ΠΎ шаблонов, Π½ΠΎ особСнно Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ свой ΠΊΠΎΠ΄ совмСстимым с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ Ρ‚ΠΈΠΏΠΎΠ², всСм, Ρ‡Ρ‚ΠΎ измСняСт Π²Π²ΠΎΠ΄ ΠΈΠ»ΠΈ Π²Ρ‹Π²ΠΎΠ΄. Ρ‚ΠΈΠΏΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π² «слишком ΡƒΠΌΠ½Ρ‹Ρ…Β».

Мои Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ

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

  • Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Python, Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ FP.Π‘ΠΊΠΎΡ€Π΅Π΅ всСго, Π²Ρ‹ Π·Π°ΠΏΡƒΡ‚Π°Π΅Ρ‚Π΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈΠ»ΠΈ сСбя Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.
  • Π£ вас Π½Π΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ, Ρ‡Ρ‚ΠΎ любой ΠΊΠΎΠ΄, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚Π΅ΡΡŒ (ΠΌΠΎΠ΄ΡƒΠ»ΠΈ pip ΠΈΠ»ΠΈ ΠΊΠΎΠ΄ Π²Π°ΡˆΠΈΡ… соавторов), являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ чистым. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅, Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π»ΠΈ чист ваш собствСнный ΠΊΠΎΠ΄, насколько Π²Ρ‹ Π½Π°Π΄Π΅Π΅Ρ‚Π΅ΡΡŒ, — Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ языков, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, синтаксис ΠΈΠ»ΠΈ компилятор Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ чистоту ΠΈ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ошибок. БмСшиваниС ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π±ΠΎΠ»Π΅Π΅ высокого уровня ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ Π·Π°ΠΏΡƒΡ‚Π°Π½Π½Ρ‹ΠΌ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Π΄Π²Π° Π²ΠΈΠ΄Π° слоТности для рассуТдСний, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ эффСкт ΠΎΠ±ΠΎΠΈΡ… вмСстС.
  • ИспользованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка с коммСнтариями Ρ‚ΠΈΠΏΠ° — ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹ΠΉ Π½Π°Π²Ρ‹ΠΊ. Π’ΠΈΠΏΠΎΠ²Ρ‹Π΅ подписи часто становятся Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌΠΈ ΠΈ Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠΌΠΈ Π³Π½Π΅Π·Π΄Π°ΠΌΠΈ Callable . НапримСр, ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ способ ввСсти простой Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ Π±ΠΎΠ»Π΅Π΅ высокого порядка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²Π²ΠΎΠ΄Π°, — это ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ F = TypeVar ['F', bound = Callable [..., Any]] , Π° Π·Π°Ρ‚Π΅ΠΌ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ def transparent (func : F) -> F: Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ . Или Ρƒ вас ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ соблазн внСсти Π·Π°Π»ΠΎΠ³ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Any вмСсто ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ подпись.

Π˜Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊΠΈΠ΅ части Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ?

ЧистыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

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

Π’ΠΎΡ‚ Π½Π΅Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

  dictionary = ['лиса', 'босс', 'апСльсин', 'ΠΏΠ°Π»ΡŒΡ†Ρ‹ Π½ΠΎΠ³', 'фСя', 'Ρ‡Π°ΡˆΠΊΠ°'] 
def puralize (слова):
для i в диапазонС (len (слова)):
word = words [i]
Ссли слово.заканчиваСтся Π½Π° ('s') ΠΈΠ»ΠΈ word.endswith ('x'):
слово + = 'es'
Ссли word.endswith ('y'):
word = word [: - 1] + 'ies'
Π΅Ρ‰Π΅:
слово + = 's'
words [i] = word

def test_pluralize ():
мноТСствСнноС число (ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ)
assert dictionary == ['лисы', 'боссы', 'Π°ΠΏΠ΅Π»ΡŒΡΠΈΠ½Ρ‹', 'ΠΏΠ°Π»ΡŒΡ†Ρ‹ Π½ΠΎΠ³', 'Ρ„Π΅ΠΈ', 'Ρ‡Π°ΡˆΠΊΠΈ']

ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ запускС test_pluralize ΠΎΠ½ ΠΏΡ€ΠΎΠΉΠ΄Π΅Ρ‚, Π½ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· послС сбоя, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ s ΠΈ es Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π΄ΠΎ бСсконСчности.Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π³ΠΎ чистой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊΠ°ΠΊ:

  dictionary = ['лиса', 'босс', 'апСльсин', 'ΠΏΠ°Π»ΡŒΡ†Ρ‹ Π½ΠΎΠ³', 'фСя', 'Ρ‡Π°ΡˆΠΊΠ°'] 
def puralize (слова):
Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ = []
словом ΠΏΡ€ΠΎΠΏΠΈΡΡŒΡŽ:
word = words [i]
Ссли word.endswith ('s') или word.endswith ('x'):
мноТСствСнноС число = слово + 'es')
Ссли word.endswith ('y'):
мноТСствСнноС число = слово [: - 1] + 'ies'
Π΅Ρ‰Π΅:
мноТСствСнноС число = + 's'
Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ (мноТСствСнноС число)
Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

def test_pluralize ():
Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ = мноТСствСнноС число (ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ)
assert result == ['лисы', 'боссы', 'Π°ΠΏΠ΅Π»ΡŒΡΠΈΠ½Ρ‹', 'ΠΏΠ°Π»ΡŒΡ†Ρ‹', 'Ρ„Π΅ΠΈ', 'Ρ‡Π°ΡˆΠΊΠΈ']

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ я Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, спСцифичныС для FP, Π° просто создаю ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ вмСсто измСнСния ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования старого. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли Ρƒ ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ останСтся ссылка Π½Π° список Π²Π²ΠΎΠ΄Π°, ΠΎΠ½ Π½Π΅ удивится.

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

ПониманиС (ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅) измСнчивости

ΠŸΠΎΠΏΡƒΠ»ΡΡ€Π½Π°Ρ Π²ΠΈΠΊΡ‚ΠΎΡ€ΠΈΠ½Π°, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… структур Π΄Π°Π½Π½Ρ‹Ρ… ΡΠ²Π»ΡΡŽΡ‚ΡΡ измСняСмыми?

  1. список
  2. ΠΊΠΎΡ€Ρ‚Π΅ΠΆ
  3. Π½Π°Π±ΠΎΡ€
  4. Π΄ΠΈΠΊΡ‚
  5. строка

ΠŸΠΎΡ‡Π΅ΠΌΡƒ это Π²Π°ΠΆΠ½ΠΎ? Иногда списки ΠΈ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ каТутся взаимозамСняСмыми, ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ соблазн Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΈΡ… ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΡƒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ.Π—Π°Ρ‚Π΅ΠΌ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ ΠΎΡˆΠΈΠ±Π°ΡŽΡ‚ΡΡ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΌΡƒΡ‚Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊΡƒΡŽ ​​как присвоСниС элСмСнту. Или Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ список Π² качСствС ΠΊΠ»ΡŽΡ‡Π° словаря ΠΈ Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ TypeError , которая Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ списки измСняСмы. ΠšΠΎΡ€Ρ‚Π΅ΠΆΠΈ ΠΈ строки ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² качСствС ΠΊΠ»ΡŽΡ‡Π΅ΠΉ словаря, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ нСизмСняСмы ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π° всС Π΄Ρ€ΡƒΠ³ΠΈΠ΅ структуры Π΄Π°Π½Π½Ρ‹Ρ… — Π½Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, Π΄Π°ΠΆΠ΅ Ссли ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Π°.

Π‘Π°ΠΌΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Π΅ dicts / lists / sets, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ Π² ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌ контСкстС.Π­Ρ‚ΠΎ бСспорядок для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ. Π˜Π·ΠΌΠ΅Π½ΡΠ΅ΠΌΡ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ — классичСский случай этого:

  def add_bar (items = []): 
items.append ('Π±Π°Ρ€')
Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ элСмСнты

l = add_bar () # l is ['bar']
l.append ('Ρ„Ρƒ')
add_bar () # Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ['bar', 'foo', 'bar']

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

Π₯ΠΎΡ‚ΠΈΡ‚Π΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ быстрСС ?

Kite — это ΠΏΠ»Π°Π³ΠΈΠ½ для PyCharm, Atom, Vim, VSCode, Sublime Text ΠΈ IntelliJ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ машинноС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²Π°ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, отсортированноС ΠΏΠΎ рСлСвантности. НачнитС ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ быстрСС сСгодня .

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ использования классов

Часто классы (ΠΈ ΠΈΡ… экзСмпляры) ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ ΠΎΠ±ΠΎΡŽΠ΄ΠΎΠΎΡΡ‚Ρ€Ρ‹ΠΌ ΠΌΠ΅Ρ‡ΠΎΠΌ измСнчивости. Π§Π΅ΠΌ большС я ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΡŽ Π½Π° Python, Ρ‚Π΅ΠΌ большС ΠΎΡ‚ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽ созданиС классов Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ Π½Π΅ станут ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌΠΈ, ΠΈ я ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ измСняСмыС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ классов. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ слоТно для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π²Ρ‹ΡΠΎΠΊΠΎΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ языками, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ Java, Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠ»ΠΈ всСгда Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· класс Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ языкС, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ модуля Π² Python.НапримСр, Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, константы ΠΈΠ»ΠΈ пространство ΠΈΠΌΠ΅Π½, ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ вмСстС ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» .py.

Часто я Π²ΠΈΠΆΡƒ классы, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для хранСния нСбольшого Π½Π°Π±ΠΎΡ€Π° ΠΈΠΌΠ΅Π½ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… со значСниями, ΠΊΠΎΠ³Π΄Π° namedtuple (ΠΈΠ»ΠΈ typing.NamedTuple для спСцифичности Ρ‚ΠΈΠΏΠ°) Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ ΠΆΠ΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ.

  ΠΈΠ· ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ import namedtuple 
VerbTenses = namedtuple ('VerbTenses', ['ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ΅', 'настоящСС', 'Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅'])
# ΠΏΡ€ΠΎΡ‚ΠΈΠ²
class VerbTenses (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚):
def __init __ (я, ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ΅, настоящСС, Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅):
я.ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ΅ = ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ΅,
self.present = присутствуСт
self.future = Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅

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

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

  Класс Автобус (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚): 
пассаТиры = Π½Π°Π±ΠΎΡ€ ()
def add_passenger (я, Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ):
я.Passenger.add (Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ)

bus1 = Автобус ()
bus2 = Автобус ()
bus1.add_passenger ('abe')
bus2.add_passenger ('bertha')
bus1.passengers # Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ['abe', 'bertha']
bus2.passengers # Ρ‚Π°ΠΊΠΆΠ΅ ['abe', 'bertha']

Π˜Π΄Π΅ΠΌΠΏΠΎΡ‚Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ

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

Π­ΠΊΠΎΠ½ΠΎΠΌΠ½ΠΎΠ΅ использованиС лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка

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

Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΠΎΠ»Π΅Π΅ высокого уровня, ΠΏΡ€ΠΈ нСобходимости

Иногда Π²Ρ‹ встрСтитС абстрактный Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΈΠ»ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π±Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π₯ΠΎΡ€ΠΎΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ этого являСтся Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½. Π’ Python 3 Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ это Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (эквивалСнт xrange Π² Python 2), отчасти для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Ρ€Π΅Ρ‡ΡŒ вас ΠΎΡ‚ ошибок Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ памяти, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Ρ‚ΡŒ большоС число, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ range (10 ** 10).Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ-Π»ΠΈΠ±ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ элСмСнтом Π² ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ большом Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π΅, Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠΈΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использованиС Ρ‚Π°ΠΊΠΈΡ… инструмСнтов, ΠΊΠ°ΠΊ ΠΊΠ°Ρ€Ρ‚Π° ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€.

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

Π—Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ мысли

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

.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python

МногиС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Python Π½Π΅ освСдомлСны ΠΎ Ρ‚ΠΎΠΌ, Π² ΠΊΠ°ΠΊΠΎΠΉ стСпСни Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python, ΠΈ это ΠΏΠΎΠ·ΠΎΡ€: Π·Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ позволяСт ΠΏΠΈΡΠ°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ сТатый ΠΈ эффСктивный ΠΊΠΎΠ΄. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Python ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ±ΡˆΠΈΡ€Π½ΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅.

Π—Π΄Π΅ΡΡŒ я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Π½Π° самом Π΄Π΅Π»Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Π½Π° нашСм любимом языкС.

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

НачнСм с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Π½Π΅ чистой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая удаляСт послСдний элСмСнт Π² спискС:

  def remove_last_item (mylist):
    "" "УдаляСт послСдний элСмСнт ΠΈΠ· списка."" "
    mylist.pop (-1) # Π­Ρ‚ΠΎ измСняСт mylist
  

Π­Ρ‚Π° функция Π½Π΅ являСтся чистой: Ρƒ Π½Π΅Π΅ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° измСняСт ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π΅ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ Π΅Π³ΠΎ ΠΊΠ°ΠΊ чисто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ:

  def butlast (mylist):
    "" "Подобно butlast Π² ЛиспС; Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список Π±Π΅Π· послСднСго элСмСнта." ""
    return mylist [: - 1] # Π­Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ копию mylist
  

ΠœΡ‹ опрСдСляСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ butlast () (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, butlast Π² Lisp), которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список Π±Π΅Π· послСднСго элСмСнта Π±Π΅Π· измСнСния исходного списка.ВмСсто этого ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ копию списка, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΅ΡΡ‚ΡŒ измСнСния, Ρ‡Ρ‚ΠΎ позволяСт Π½Π°ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π». К практичСским прСимущСствам использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования ΠΌΠΎΠΆΠ½ΠΎ отнСсти ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

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

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ c

.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Python Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования?

ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка

  1. Около
  2. ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹

  3. Для ΠΊΠΎΠΌΠ°Π½Π΄
  1. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка
    ΠžΠ±Ρ‰Π΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ вопросы ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹

  2. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка для ΠΊΠΎΠΌΠ°Π½Π΄
    Π“Π΄Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈ дСлятся частными знаниями с ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌΠΈ

  3. Вакансии
    ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ связанныС с Π½ΠΈΠΌ тСхничСскиС возмоТности ΠΊΠ°Ρ€ΡŒΠ΅Ρ€Π½ΠΎΠ³ΠΎ роста

  4. Π’Π°Π»Π°Π½Ρ‚
    НанимайтС тСхничСских спСциалистов ΠΈ создавайтС свой Π±Ρ€Π΅Π½Π΄ работодатСля

  5. Π Π΅ΠΊΠ»Π°ΠΌΠ°
    ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³Π°ΠΌ со всСго ΠΌΠΈΡ€Π°

.Π£Ρ‡Π΅Π±Π½ΠΈΠΊΠΈ ΠΈ примСчания ΠΏΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ

| Python

Python ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅:

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

Python ΠΈΠΌΠ΅Π΅Ρ‚ мноТСство конструкций, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ программисту Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с нашими Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌΠΈ ΠΏΠΎ этой Ρ‚Π΅ΠΌΠ΅.

Π’ этом ΡƒΡ€ΠΎΠΊΠ΅ Π²Ρ‹ посмотритС Π½Π°:

  1. КакиС особСнности Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования
  2. Как Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ этих характСристик.
  3. Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса.
  4. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ чистота.
  5. Как ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ.

Π₯арактСристики Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ чистый язык Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ конструкции:

  • Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ всС конструкции использования Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ ΠΊ функциям.
  • ЧистыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ; Π² Π½ΠΈΡ… Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов
  • Бпособы ΠΈ конструкции для ограничСния использования Ρ†ΠΈΠΊΠ»ΠΎΠ² for
  • Π₯ΠΎΡ€ΠΎΡˆΠ°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° рСкурсии

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса Π² Python:

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

  >>> список (map (int, ["1", "2", "3"]))
[1, 2, 3]
  

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΈΡ…. НапримСр, Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ hello_world , ΠΈ Ρ‚ΠΎΠ³Π΄Π° пСрСмСнная Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ функция.

  >>> def hello_world (h):
... def world (w):
... ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (Ρ‡, ш)
... return world # Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
...
>>> h = hello_world # Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
>>> x = h ("hello") # присваиваСм
>>> Ρ…
<Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΈΡ€ ΠΏΠΎ адрСсу 0x7fec47afc668>
>>> x ("ΠΌΠΈΡ€")
('ΠŸΡ€ΠΈΠ²Π΅Ρ‚ ΠΌΠΈΡ€')
  

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… структурах Π΄Π°Π½Π½Ρ‹Ρ….НапримСр, Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² спискС.

  >>> function_list = [h, x]
>>> список_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
[, ]
  

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ чистота Python:

Π’ Python Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π² функциях. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ этого

  def naive_sum (список):
    s = 0
    для l в спискС:
        s + = l
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ s
  

ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ конструкциСй:

  сум (список)
  

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ map, reduce ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ itertools Π² Python, ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов Π² вашСм ΠΊΠΎΠ΄Π΅.

УмСньшСниС использования Ρ†ΠΈΠΊΠ»ΠΎΠ² Π² Python:

Π¦ΠΈΠΊΠ»Ρ‹ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

  для x в л:
    func (x)
  

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

  ΠΊΠ°Ρ€Ρ‚Π° (func, l)
  

Π­Ρ‚ΠΎ читаСтся ΠΊΠ°ΠΊ Β«ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ со списком», Ρ‡Ρ‚ΠΎ соотвСтствуСт нашСй ΠΈΠ΄Π΅Π΅ опрСдСлСния вопроса Β«Ρ‡Ρ‚ΠΎΒ».

Если Π²Ρ‹ Π²ΠΎΠ·ΡŒΠΌΠ΅Ρ‚Π΅ эту идСю ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ Π΅Π΅ ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ.

  def func1 ():
    ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ

def func2 ():
    ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ

def func3 ():
    ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ

Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ = лямбда f: f ()
ΠΊΠ°Ρ€Ρ‚Π° (Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, [func1, func2, func3])
  

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

РСкурсия Python:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ рСкурсия

РСкурсия — это ΠΌΠ΅Ρ‚ΠΎΠ΄ разбиСния ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π½Π° ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎ сути ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ‚ΠΈΠΏ, Ρ‡Ρ‚ΠΎ ΠΈ исходная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. Π’Ρ‹ Ρ€Π΅ΡˆΠ°Π΅Ρ‚Π΅ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ² самой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ рСкурсии ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ:

ΡΡŠΠ΅ΡΡ‚ΡŒ пСльмСни:
1.ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒ сколько Π²Π°Ρ€Π΅Π½ΠΈΠΊΠΎΠ² Π½Π° Ρ‚Π°Ρ€Π΅Π»ΠΊΠ΅
2. Ссли Π½Π΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ пСльмСнСй, ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚Π΅ Π΅ΡΡ‚ΡŒ
3. Π΅Ρ‰Π΅ ΡΡŠΠ΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ пСльмСнь
4. Β«ΡΡŠΠ΅ΡΡ‚ΡŒ пСльмСни»

Как Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ Π² вашСм ΠΊΠΎΠ΄Π΅

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

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ числа Π€ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ посрСдством рСкурсии.

  def fib (n):
    Ссли n == 0: Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ 0
    elif n == 1: Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ 1
    ΠΈΠ½Π°Ρ‡Π΅: Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ fib (n-1) + fib (n-2)
  

НСбольшой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ, ΠΊΠ°ΠΊ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄:

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим нСбольшой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρƒ вас Π΅ΡΡ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ число, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ возводится Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ увСличиваСтся Π½Π° 1, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ возводится Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ 3, Π·Π°Ρ‚Π΅ΠΌ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅.ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ поэтапно.

  # ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ ΠΊΠΎΠ΄
start_number = 96

# ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ числа
ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ = Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅_число ** 2

# ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ число Π½Π° 1
ΠΏΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ = ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ + 1

# ΠΊΡƒΠ± числа
ΠΊΡƒΠ± = ΠΏΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ** 3

# ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ ΠΊΡƒΠ± Π½Π° 1
Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ = ΠΊΡƒΠ± - 1

# ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ = ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅) # Π²Ρ‹Π²ΠΎΠ΄ 783012621312
  

Π­Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ написан Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄Π° вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Π²Π°Ρ‚ΡŒ явныС инструкции ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π²Ρ‹ Π΄Π°Π΅Ρ‚Π΅ инструкции ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ.ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π½ΠΈΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π° Π±ΠΎΠ»Π΅Π΅ высоком ΡƒΡ€ΠΎΠ²Π½Π΅ абстракции.

  # ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ `call`, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹
def call (x, f):
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ f (x)

# опрСдСляСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚
ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ = лямбда x: x * x

# опрСдСляСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅
ΠΏΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ = лямбда x: x + 1

# опрСдСляСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΡƒΠ±
ΠΊΡƒΠ± = лямбда x: x * x * x

# ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚
Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ = лямбда x: x-1

# помСститС всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² список Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡ… Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ
funcs = [ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚, ΠΏΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅, ΠΊΡƒΠ±, Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚]

# ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ всС вмСстС.НиТС находится Π½Π΅Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ.
# Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π²Ρ‹ раздСляСтС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΡƒΡŽ ΠΈ Π½Π΅Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΡƒΡŽ части.
from functools import reduce # reduce находится Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ functools
print (reduce (call, funcs, 96)) # output 783012621312
  

ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΠ»: Π”ΠΆΠΎΠΉΠ΄ΠΈΠΏ Π‘Ρ…Π°Ρ‚Ρ‚Π°Ρ‡Π°Ρ€Π΄ΠΆΠΈ

.

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *