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

Python | Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π―Π·Ρ‹ΠΊ программирования Python

ПослСднСС обновлСниС: 24.01.2018

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

Π’ΠΏΠ΅Ρ€Π²Ρ‹Π΅ язык Python Π±Ρ‹Π» анонсирован Π² 1991 Π³ΠΎΠ΄Ρƒ голландским Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ Π“Π²ΠΈΠ΄ΠΎ Π’Π°Π½ Россумом. Π‘ Ρ‚Π΅Ρ… ΠΏΠΎΡ€ Π΄Π°Π½Π½Ρ‹ΠΉ язык ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Π» большой ΠΏΡƒΡ‚ΡŒ развития. Π’ 2000 Π³ΠΎΠ΄Ρƒ Π±Ρ‹Π»Π° ΠΈΠ·Π΄Π°Π½Π° вСрсия 2.0, Π° Π² 2008 Π³ΠΎΠ΄Ρƒ — вСрсия 3.0. НСсмотря Π½Π° Π²Ρ€ΠΎΠ΄Π΅ Ρ‚Π°ΠΊΠΈΠ΅ большиС ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ вСрсиями постоянно выходят подвСрсии. Π’Π°ΠΊ, Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ вСрсиСй Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° являСтся 3.7. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ всСх Ρ€Π΅Π»ΠΈΠ·Π°Ρ…, вСрсиях ΠΈ измСнСния языка, Π° Ρ‚Π°ΠΊΠΆΠ΅ собствСнно ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ ΠΏΡ€ΠΎΡ‡ΡƒΡŽ ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ сайтС https://www.python.org/.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ особСнности языка программирования Python:

  • Π‘ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ²Ρ‹ΠΉ язык. Код ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ опрСдСляСтся Π² Π²ΠΈΠ΄Π΅ скриптов.

  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° самых Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌ программирования, Π² Ρ‚ΠΎΠΌ числС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌ.

  • Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со скриптами Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запускаСт ΠΈ выполняСт скрипт.

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

    Π—Π΄Π΅ΡΡŒ стоит ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ хотя Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ трансляция ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ исходного ΠΊΠΎΠ΄Π° Π² Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машиной Π² Π½Π°Π±ΠΎΡ€ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… процСсса, Π½ΠΎ фактичСски ΠΎΠ½ΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Ρ‹ Π² самом ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π΅.

  • ΠŸΠΎΡ€Ρ‚Π°Ρ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΎΠ½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ. НС ΠΈΠΌΠ΅Π΅Ρ‚ значСния, какая Ρƒ нас опСрационная систСма — Windows, Mac OS, Linux, Π½Π°ΠΌ достаточно Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ Π½Π° всСх этих ОБ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°

  • АвтоматичСскоС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ памяти

  • ДинамичСская типизация

Python — ΠΎΡ‡Π΅Π½ΡŒ простой язык программирования, ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹ΠΉ ΠΈ Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя довольно простой ΠΈ понятный синтаксис. БоотвСтствСнно Π΅Π³ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ, ΠΈ собствСнно это ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΡ€ΠΈΡ‡ΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· самых популярных языков программирования ΠΈΠΌΠ΅Π½Π½ΠΎ для обучСния. Π’ частности, Π² 2014 Π³ΠΎΠ΄Ρƒ ΠΎΠ½ Π±Ρ‹Π» ΠΏΡ€ΠΈΠ·Π½Π°Π½ самым популярным языком программирования для обучСния Π² БША.

Python Ρ‚Π°ΠΊΠΆΠ΅ популярСн Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² сфСрС обучСния, Π½ΠΎ Π² написании ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π² Ρ‚ΠΎΠΌ числС коммСрчСского Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π°. Π’ Π½Π΅ΠΌΠ°Π»ΠΎΠΉ стСпСни поэтому для этого языка написано мноТСство Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρƒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ языка программирования ΠΎΡ‡Π΅Π½ΡŒ большоС ΠΊΠΎΠΌΠΌΡŒΡŽΠ½ΠΈΡ‚ΠΈ, Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΌΡƒ языку мноТСство ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ², ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΏΠΎΠΌΠΎΡ‰ΡŒ спСциалистов.

Установка Python

Для создания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π° Python Π½Π°ΠΌ потрСбуСтся ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€. Для Π΅Π³ΠΎ установки ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π½Π° сайт https://www.python.org/ ΠΈ Π½Π° Π³Π»Π°Π²Π½ΠΎΠΉ станицС Π² сСкции Downloads Π½Π°ΠΉΠ΄Π΅ΠΌ ссылку Π½Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ послСднСй вСрсии языка (Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ это 3.7.2):

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΏΠΎ ссылкС ΠΊ страницС с описаниСм послСднСй вСрсии языка. Π‘Π»ΠΈΠΆΠ΅ ΠΊ Π½ΠΈΠ·Ρƒ Π½Π° Π½Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ список дистрибутивов для Ρ€Π°Π·Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм. Π’Ρ‹Π±Π΅Ρ€Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π½Π°ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ Π΅Π³ΠΎ. НапримСр, Π² ΠΌΠΎΠ΅ΠΌ случаС это ОБ Windows 64-Ρ… разрядная, поэтому я Π²Ρ‹Π±ΠΈΡ€Π°ΡŽ ссылку Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ Windows x86-64 executable installer. ПослС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ дистрибутива установим Π΅Π³ΠΎ.

БоотвСтствСнно для MacOS ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΏΡƒΠ½ΠΊΡ‚ macOS 64-bit installer.

На ОБ Windows ΠΏΡ€ΠΈ запускС инсталлятора запускаСт ΠΎΠΊΠ½ΠΎ мастСра установки:

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΡƒΡ‚ΡŒ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€. ΠžΡΡ‚Π°Π²ΠΈΠΌ Π΅Π³ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ C:\Users\[имя_ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ]\AppData\Local\Programs\Python\Python36\.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² самом Π½ΠΈΠ·Ρƒ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ Ρ„Π»Π°ΠΆΠΎΠΊ «Add Python 3.6 to PATH», Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды.

ПослС установки Π² мСню ΠŸΡƒΡΠΊ Π½Π° ОБ Windows ΠΌΡ‹ смоТСм Π½Π°ΠΉΡ‚ΠΈ ΠΈΠΊΠΎΠ½ΠΊΠΈ для доступа ΠΊ Ρ€Π°Π·Π½Ρ‹ΠΌ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°ΠΌ ΠΏΠΈΡ‚ΠΎΠ½Π°:

Π—Π΄Π΅ΡΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° Python 3.7 (64-bit) прСдставляСт ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ скрипт. Π’ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС сам Ρ„Π°ΠΉΠ» ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠ»Π°ΡΡŒ установка. На Windows ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это ΠΏΡƒΡ‚ΡŒ C:\Users\[имя_ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ]\AppData\Local\Programs\Python\Python37, Π° сам ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ прСдставляСт Ρ„Π°ΠΉΠ» python.exe. На ОБ Linux установка производится ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ /usr/local/bin/python3.7.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python / Π₯Π°Π±Ρ€

РассуТдая ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, люди часто Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΡƒΡ‡Ρƒ Β«Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ…Β» характСристик. НСизмСняСмыС Π΄Π°Π½Π½Ρ‹Π΅, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса ΠΈ оптимизация хвостовой рСкурсии. Π­Ρ‚ΠΎ свойства языка, ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Они ΡƒΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‚ ΠΌΠ°ΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΊΠ°Ρ€Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‘ΠΌΡ‹ программирования, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ΡΡ для написания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Они ΡƒΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‚ распараллСливаниС, Π»Π΅Π½ΠΈΠ²Ρ‹Π΅ вычислСния ΠΈ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠ΅Π½ΠΈΠ·ΠΌ. Π­Ρ‚ΠΎ прСимущСства Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

Π—Π°Π±Π΅ΠΉΡ‚Π΅. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ отличаСтся ΠΎΠ΄Π½ΠΈΠΌ свойством: отсутствиСм ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов. Он Π½Π΅ полагаСтся Π½Π° Π΄Π°Π½Π½Ρ‹Π΅ Π²Π½Π΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ Π½Π΅ мСняСт Π΄Π°Π½Π½Ρ‹Π΅, находящиСся Π²Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ВсС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ «свойства» ΠΌΠΎΠΆΠ½ΠΎ вывСсти ΠΈΠ· этого.

ΠΠ΅Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ функция:

a = 0
def increment1():
    global a
    a += 1

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ функция:

def increment2(a):
    return a + 1

ВмСсто ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΎΠ² ΠΏΠΎ списку ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ map ΠΈ reduce

Map

ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ…. Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Π½ΠΎΠ²ΡƒΡŽ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ, выполняСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ добавляСт Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π½ΠΎΠ²ΡƒΡŽ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ.

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ map, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ список ΠΈΠΌΡ‘Π½ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΉ список Π΄Π»ΠΈΠ½:

name_lengths = map(len, ['Маша', 'ΠŸΠ΅Ρ‚Ρ', 'Вася'])

print name_lengths
# => [4, 4, 3]

Π­Ρ‚ΠΎΡ‚ map Π²ΠΎΠ·Π²ΠΎΠ΄ΠΈΡ‚ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт:

squares = map(lambda x: x * x, [0, 1, 2, 3, 4])

print squares
# => [0, 1, 4, 9, 16]

Он Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π° Π±Π΅Ρ€Ρ‘Ρ‚ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡƒΡŽ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΡƒΡŽ Ρ‡Π΅Ρ€Π΅Π· lambda. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ lambda ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ слСва ΠΎΡ‚ двоСточия. Π’Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ – справа. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ возвращаСтся нСявным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

ΠΠ΅Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список ΠΈΠΌΡ‘Π½ ΠΈ замСняСт ΠΈΡ… случайными ΠΏΡ€ΠΎΠ·Π²ΠΈΡ‰Π°ΠΌΠΈ.

import random

names = ['Маша', 'ΠŸΠ΅Ρ‚Ρ', 'Вася']
code_names = ['Π¨ΠΏΡƒΠ½Ρ‚ΠΈΠΊ', 'Π’ΠΈΠ½Ρ‚ΠΈΠΊ', 'Π€ΡƒΠ½Ρ‚ΠΈΠΊ']

for i in range(len(names)):
    names[i] = random.choice(code_names)

print names
# => ['Π¨ΠΏΡƒΠ½Ρ‚ΠΈΠΊ', 'Π’ΠΈΠ½Ρ‚ΠΈΠΊ', 'Π¨ΠΏΡƒΠ½Ρ‚ΠΈΠΊ']

Алгоритм ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΎΠ·Π²ΠΈΡ‰Π° Ρ€Π°Π·Π½Ρ‹ΠΌ сСкрСтным Π°Π³Π΅Π½Ρ‚Π°ΠΌ. Π‘ΡƒΠ΄Π΅ΠΌ Π½Π°Π΄Π΅ΡΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ это Π½Π΅ послуТит источником ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π²ΠΎ врСмя сСкрСтной миссии.

ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ это Ρ‡Π΅Ρ€Π΅Π· map:

import random

names = ['Маша', 'ΠŸΠ΅Ρ‚Ρ', 'Вася']

secret_names = map(lambda x: random.choice(['Π¨ΠΏΡƒΠ½Ρ‚ΠΈΠΊ', 'Π’ΠΈΠ½Ρ‚ΠΈΠΊ', 'Π€ΡƒΠ½Ρ‚ΠΈΠΊ']), names)

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 1. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Ρ‡Π΅Ρ€Π΅Π· map. Он ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΡ‘Π½ ΠΈ замСняСт ΠΈΡ… ΠΏΡ€ΠΎΠ·Π²ΠΈΡ‰Π°ΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄.

names = ['Маша', 'ΠŸΠ΅Ρ‚Ρ', 'Вася']

for i in range(len(names)):
    names[i] = hash(names[i])

print names
# => [6306819796133686941, 8135353348168144921, -1228887169324443034]
ΠœΠΎΡ‘ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅:
names = ['Маша', 'ΠŸΠ΅Ρ‚Ρ', 'Вася']

secret_names = map(hash, names)

Reduce

Reduce ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ Π½Π°Π±ΠΎΡ€ ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ². Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΠΎΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ всСх ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ².

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ простого reduce. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ сумму всСх ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² Π² Π½Π°Π±ΠΎΡ€Π΅:

sum = reduce(lambda a, x: a + x, [0, 1, 2, 3, 4])

print sum
# => 10

x – Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΡƒΠ½ΠΊΡ‚, Π° – аккумулятор. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ lambda Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡƒΠ½ΠΊΡ‚Π΅. reduce() ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ всС значСния, ΠΈ запускаСт для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ lambda Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… значСниях Π° ΠΈ Ρ…, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² Π° для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ.

А Ρ‡Π΅ΠΌΡƒ Ρ€Π°Π²Π½ΠΎ Π° Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ? Оно Ρ€Π°Π²Π½ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ элСмСнту ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ, ΠΈ reduce() Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ элСмСнта. Π’ΠΎ Π΅ΡΡ‚ΡŒ, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ… Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Ρƒ Π½Π°Π±ΠΎΡ€Π°.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ считаСт, ΠΊΠ°ΠΊ часто слово Β«ΠΊΠ°ΠΏΠΈΡ‚Π°Π½Β» встрСчаСтся Π² спискС строк:

sentences = ['ΠΊΠ°ΠΏΠΈΡ‚Π°Π½ Π΄ΠΆΠ΅ΠΊ Π²ΠΎΡ€ΠΎΠ±Π΅ΠΉ',
             'ΠΊΠ°ΠΏΠΈΡ‚Π°Π½ дальнСго плавания',
             'ваша Π»ΠΎΠ΄ΠΊΠ° Π³ΠΎΡ‚ΠΎΠ²Π°, ΠΊΠ°ΠΏΠΈΡ‚Π°Π½']

cap_count = 0
for sentence in sentences:
    cap_count += sentence.count('ΠΊΠ°ΠΏΠΈΡ‚Π°Π½')

print cap_count
# => 3

Π’ΠΎΡ‚ ΠΆΠ΅ ΠΊΠΎΠ΄ с использованиСм reduce:

sentences = ['ΠΊΠ°ΠΏΠΈΡ‚Π°Π½ Π΄ΠΆΠ΅ΠΊ Π²ΠΎΡ€ΠΎΠ±Π΅ΠΉ',
             'ΠΊΠ°ΠΏΠΈΡ‚Π°Π½ дальнСго плавания',
             'ваша Π»ΠΎΠ΄ΠΊΠ° Π³ΠΎΡ‚ΠΎΠ²Π°, ΠΊΠ°ΠΏΠΈΡ‚Π°Π½']

cap_count = reduce(lambda a, x: a + x.count('ΠΊΠ°ΠΏΠΈΡ‚Π°Π½'),
                   sentences,
                   0)

А ΠΎΡ‚ΠΊΡƒΠ΄Π° здСсь бСрётся Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°? Оно Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ вычислСно ΠΈΠ· количСства ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ строкС. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠ½ΠΎ задаётся ΠΊΠ°ΠΊ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reduce().

ΠŸΠΎΡ‡Π΅ΠΌΡƒ map ΠΈ reduce Π»ΡƒΡ‡ΡˆΠ΅?

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΎΠ½ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡƒΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ΄Π½Ρƒ строку.

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π²Π°ΠΆΠ½Ρ‹Π΅ части ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ,– коллСкция, опСрация ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅,– всСгда находятся Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС map ΠΈ reduce.

Π’-Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ…, ΠΊΠΎΠ΄ Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΈΠ»ΠΈ Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΊΠΎΠ΄, находящийся послС Π½Π΅Π³ΠΎ. По соглашСнию, map ΠΈ reduce – Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹.

Π’-Ρ‡Π΅Ρ‚Π²Ρ‘Ρ€Ρ‚Ρ‹Ρ…, map ΠΈ reduce – элСмСнтарныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. ВмСсто построчного чтСния Ρ†ΠΈΠΊΠ»ΠΎΠ² Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŽ ΠΏΡ€ΠΎΡ‰Π΅ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ map ΠΈ reduce, встроСнныС Π² слоТныС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹.

Π’-пятых, Ρƒ Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ·Π΅ΠΉ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅, слСгка ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. НапримСр, filter, all, any ΠΈ find.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 2: ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ map, reduce ΠΈ filter. Filter ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ Ρ‚Π΅Ρ… Π²Π΅Ρ‰Π΅ΠΉ, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ True.

people = [{'имя': 'Маша', 'рост': 160},
    {' рост ': 'Баша', ' рост ': 80},
    {'name': 'Паша'}]

height_total = 0
height_count = 0
for person in people:
    if 'рост' in person:
        height_total += person[' рост ']
        height_count += 1

if height_count > 0:
    average_height = height_total / height_count

    print average_height
    # => 120
ΠœΠΎΡ‘ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅:
people = [{'имя': 'Маша', 'рост': 160},
    {' рост ': 'Баша', ' рост ': 80},
    {'name': 'Паша'}]

heights = map(lambda x: x['рост'],
              filter(lambda x: 'рост' in x, people))

if len(heights) > 0:
    from operator import add
    average_height = reduce(add, heights) / len(heights)

ΠŸΠΈΡˆΠΈΡ‚Π΅ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ, Π° Π½Π΅ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° эмулируСт Π³ΠΎΠ½ΠΊΡƒ Ρ‚Ρ€Ρ‘Ρ… Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΉ. Π’ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ машина Π»ΠΈΠ±ΠΎ двигаСтся Π²ΠΏΠ΅Ρ€Ρ‘Π΄, Π»ΠΈΠ±ΠΎ Π½Π΅Ρ‚. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π½Ρ‹ΠΉ автомобилями ΠΏΡƒΡ‚ΡŒ. Π§Π΅Ρ€Π΅Π· ΠΏΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠΎΠ² Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π³ΠΎΠ½ΠΊΠ° заканчиваСтся.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π²Ρ‹Π²ΠΎΠ΄Π°:

 -
 - -
 - -

 - -
 - -
 - - -

 - - -
 - -
 - - -

 - - - -
 - - -
 - - - -

 - - - -
 - - - -
 - - - - -

ВСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

from random import random

time = 5
car_positions = [1, 1, 1]

while time:
    # decrease time
    time -= 1

    print ''
    for i in range(len(car_positions)):
        # move car
        if random() > 0.3:
            car_positions[i] += 1

        # draw car
        print '-' * car_positions[i]

Код ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π΅Π½. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ вСрсия Π±Ρ‹Π»Π° Π±Ρ‹ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ – ΠΎΠ½Π° Π±Ρ‹ описывала, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π° Π½Π΅ Ρ‚ΠΎ, ΠΊΠ°ΠΊ это Π½Π°Π΄ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

ДСкларативности ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ, вставляя ΠΊΠΎΠ΄ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:
from random import random

def move_cars():
    for i, _ in enumerate(car_positions):
        if random() > 0.3:
            car_positions[i] += 1

def draw_car(car_position):
    print '-' * car_position

def run_step_of_race():
    global time
    time -= 1
    move_cars()

def draw():
    print ''
    for car_position in car_positions:
        draw_car(car_position)

time = 5
car_positions = [1, 1, 1]

while time:
    run_step_of_race()
    draw()

Для понимания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ просматриваСт основной Ρ†ΠΈΠΊΠ». «Если ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ врСмя, ΠΏΡ€ΠΎΠΉΠ΄Ρ‘ΠΌ ΠΎΠ΄ΠΈΠ½ шаг Π³ΠΎΠ½ΠΊΠΈ ΠΈ Π²Ρ‹Π²Π΅Π΄Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π‘Π½ΠΎΠ²Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ врСмя». Если Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŽ Π½Π°Π΄ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ шаг Π³ΠΎΠ½ΠΊΠΈ, ΠΎΠ½ смоТСт ΠΏΡ€ΠΎΡ‡Π΅ΡΡ‚ΡŒ Π΅Π³ΠΎ ΠΊΠΎΠ΄ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ.

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹, ΠΊΠΎΠ΄ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ сам сСбя.

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

Π’ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ вСрсия этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

from random import random

def move_cars(car_positions):
    return map(lambda x: x + 1 if random() > 0.3 else x,
               car_positions)

def output_car(car_position):
    return '-' * car_position

def run_step_of_race(state):
    return {'time': state['time'] - 1,
            'car_positions': move_cars(state['car_positions'])}

def draw(state):
    print ''
    print '\n'.join(map(output_car, state['car_positions']))

def race(state):
    draw(state)
    if state['time']:
        race(run_step_of_race(state))

race({'time': 5,
      'car_positions': [1, 1, 1]})

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΠ΄ Ρ€Π°Π·Π±ΠΈΡ‚ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ΠΎΠΌΡƒ Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠ°. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ – Π½Π΅Ρ‚ Ρ€Π°ΡΡˆΠ°Ρ€Π΅Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. time ΠΈ car_positions ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ прямиком Π² race(). Π’Ρ‚ΠΎΡ€ΠΎΠ΅ – Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. Π’Ρ€Π΅Ρ‚ΡŒΠ΅ – ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π½Π΅ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, всС значСния Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° run_step_of_race() ΠΏΡ€ΠΎΠ΄Π΅Π»Ρ‹Π²Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг, ΠΎΠ½ пСрСдаётся ΠΎΠΏΡΡ‚ΡŒ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ.

Π’ΠΎΡ‚ Π²Π°ΠΌ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ zero() ΠΈ one():

def zero(s):
    if s[0] == "0":
        return s[1:]

def one(s):
    if s[0] == "1":
        return s[1:]

zero() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ строку s. Если ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ – 0, Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ остаток строки. Если Π½Π΅Ρ‚ – Ρ‚ΠΎΠ³Π΄Π° None. one() Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ самоС, Ссли ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ – 1.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ rule_sequence(). Она ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ строку ΠΈ список ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-ΠΏΡ€Π°Π²ΠΈΠ», состоящий ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ zero ΠΈ one. Она Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, пСрСдавая Π΅ΠΌΡƒ строку. Если Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΎ None, Ρ‚ΠΎ Π±Π΅Ρ€Ρ‘Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Ρ‘Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ. И Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Если возвращаСтся None, rule_sequence() останавливаСтся ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ None. Π˜Π½Π°Ρ‡Π΅ – Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ послСднСго ΠΏΡ€Π°Π²ΠΈΠ»Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…:

print rule_sequence('0101', [zero, one, zero])
# => 1

print rule_sequence('0101', [zero, zero])
# => None

Π˜ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Π°Ρ вСрсия rule_sequence():

def rule_sequence(s, rules):
    for rule in rules:
        s = rule(s)
        if s == None:
            break

    return s

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 3. Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ†ΠΈΠΊΠ». ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈΡ‚Π΅ Π΅Π³ΠΎ Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ с использованиСм рСкурсии.

ΠœΠΎΡ‘ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅:
def rule_sequence(s, rules):
    if s == None or not rules:
        return s
    else:
        return rule_sequence(rules[0](s), rules[1:])

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρ‹ (pipelines)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²ΠΈΠ΄ Ρ†ΠΈΠΊΠ»ΠΎΠ² ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΏΡ€ΠΈΡ‘ΠΌΠ° ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ†ΠΈΠΊΠ» измСняСт словари, содСрТащиС имя, Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ страну происхоТдСния ΠΈ статус Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π³Ρ€ΡƒΠΏΠΏ.

bands = [{'name': 'sunset rubdown', 'country': 'UK', 'active': False},
         {'name': 'women', 'country': 'Germany', 'active': False},
         {'name': 'a silver mt. zion', 'country': 'Spain', 'active': True}]

def format_bands(bands):
    for band in bands:
        band['country'] = 'Canada'
        band['name'] = band['name'].replace('.', '')
        band['name'] = band['name'].title()

format_bands(bands)

print bands
# => [{'name': 'Sunset Rubdown', 'active': False, 'country': 'Canada'},
#     {'name': 'Women', 'active': False, 'country': 'Canada' },
#     {'name': 'A Silver Mt Zion', 'active': True, 'country': 'Canada'}]

НазваниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Β«formatΒ» слишком ΠΎΠ±Ρ‰Π΅Π΅. И Π²ΠΎΠΎΠ±Ρ‰Π΅, ΠΊΠΎΠ΄ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ бСспокойство. Π’ ΠΎΠ΄Π½ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅ происходят Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° ‘country’ мСняСтся Π½Π° ‘Canada’. Π£Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΈ пСрвая Π±ΡƒΠΊΠ²Π° ΠΈΠΌΠ΅Π½ΠΈ мСняСтся Π½Π° Π·Π°Π³Π»Π°Π²Π½ΡƒΡŽ. Π‘Π»ΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π΅Π»Π°Ρ‚ΡŒ, ΠΈ слоТно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Π΄Π΅Π»Π°Π΅Ρ‚ Π»ΠΈ ΠΎΠ½ это. Π•Π³ΠΎ тяТСло ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Ρ€Π°ΡΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ²Π°Ρ‚ΡŒ.

Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅:

print pipeline_each(bands, [set_canada_as_country,
                            strip_punctuation_from_name,
                            capitalize_names])

Всё просто. Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ выглядят Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ связаны Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ. Π’Ρ‹Ρ…ΠΎΠ΄ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ – Π²Ρ…ΠΎΠ΄ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ. Π˜Ρ… просто ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΈ Ρ€Π°ΡΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ²Π°Ρ‚ΡŒ.

pipeline_each() ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ, ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ ΠΈΡ… функциям прСобразования, Π²Ρ€ΠΎΠ΄Π΅ set_canada_as_country(). ПослС примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠΎ всСм Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌ, pipeline_each() Π΄Π΅Π»Π°Π΅Ρ‚ ΠΈΠ· Π½ΠΈΡ… список ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ прСобразования.

def assoc(_d, key, value):
    from copy import deepcopy
    d = deepcopy(_d)
    d[key] = value
    return d

def set_canada_as_country(band):
    return assoc(band, 'country', "Canada")

def strip_punctuation_from_name(band):
    return assoc(band, 'name', band['name'].replace('.', ''))

def capitalize_names(band):
    return assoc(band, 'name', band['name'].title())

КаТдая связываСт ΠΊΠ»ΡŽΡ‡ Π³Ρ€ΡƒΠΏΠΏΡ‹ с Π½ΠΎΠ²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. Π‘Π΅Π· измСнСния ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… это тяТСло ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, поэтому ΠΌΡ‹ Ρ€Π΅ΡˆΠ°Π΅ΠΌ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ assoc(). Она ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ deepcopy() для создания ΠΊΠΎΠΏΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ словаря. КаТдая функция ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ копию ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ эту копию.

Всё Π²Ρ€ΠΎΠ΄Π΅ ΠΊΠ°ΠΊ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ. ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Ρ‹ ΠΎΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. Но Π² ΠΊΠΎΠ΄Π΅ Π΅ΡΡ‚ΡŒ Π΄Π²Π° ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… мСста для ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. Π’ strip_punctuation_from_name() создаётся имя Π±Π΅Π· Ρ‚ΠΎΡ‡Π΅ΠΊ Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Π·ΠΎΠ² calling replace() с ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Π’ capitalize_names() создаётся имя с ΠΏΠ΅Ρ€Π²ΠΎΠΉ прописной Π±ΡƒΠΊΠ²ΠΎΠΉ Π½Π° основС title() ΠΈ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Если replace ΠΈ time Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹, Ρ‚ΠΎ ΠΈ strip_punctuation_from_name() с capitalize_names() Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹.

К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, ΠΎΠ½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹. Π’ Python строки нСизмСняСмы. Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с копиями строк. Π£Ρ„Ρ„, слава Π±ΠΎΠ³Ρƒ.

Π’Π°ΠΊΠΎΠΉ контраст ΠΌΠ΅ΠΆΠ΄Ρƒ строками ΠΈ словарями (ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒΡŽ) Π² Python дСмонстрируСт прСимущСства языков Ρ‚ΠΈΠΏΠ° Clojure. Π’Π°ΠΌ программисту Π½Π΅ Π½Π°Π΄ΠΎ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ, Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ Π»ΠΈ ΠΎΠ½ Π΄Π°Π½Π½Ρ‹Π΅. НС ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 4. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pipeline_each. Π—Π°Π΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ΡΡŒ Π½Π°Π΄ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. Π“Ρ€ΡƒΠΏΠΏΡ‹ – Π² массивС, ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ для ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ прСобразования. Π—Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ массив пСрСдаётся ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΡˆΡ‚ΡƒΡ‡ΠΊΠ΅ для Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

ΠœΠΎΡ‘ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅:
def pipeline_each(data, fns):
    return reduce(lambda a, x: map(x, a),
                  fns,
                  data)

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

set_canada_as_country = call(lambda x: 'Canada', 'country')
strip_punctuation_from_name = call(lambda x: x.replace('.', ''), 'name')
capitalize_names = call(str.title, 'name')

print pipeline_each(bands, [set_canada_as_country,
                            strip_punctuation_from_name,
                            capitalize_names])

Или, ТСртвуя Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒΡŽ:

print pipeline_each(bands, [call(lambda x: 'Canada', 'country'),
                            call(lambda x: x.replace('.', ''), 'name'),
                            call(str.title, 'name')])

Код для call():

def assoc(_d, key, value):
    from copy import deepcopy
    d = deepcopy(_d)
    d[key] = value
    return d

def call(fn, key):
    def apply_fn(record):
        return assoc(record, key, fn(record.get(key)))
    return apply_fn

Π§Ρ‚ΠΎ Ρ‚ΡƒΡ‚ Ρƒ нас происходит.

Один. call – функция Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка, Ρ‚.ΠΊ. ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

Π”Π²Π°. apply_fn() ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ прСобразования. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ запись (Π³Ρ€ΡƒΠΏΠΏΡƒ). Π˜Ρ‰Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ record[key]. Π’Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ fn. ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² копию записи ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Ρ‘.

Π’Ρ€ΠΈ. call сам Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚. Π’ΡΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π΄Π΅Π»Π°Π΅Ρ‚ apply_fn(). Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ использования pipeline_each(), ΠΎΠ΄ΠΈΠ½ экзСмпляр apply_fn() Π·Π°Π΄Π°Ρ‘Ρ‚ ‘country’ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ‘Canada’. Π”Ρ€ΡƒΠ³ΠΎΠΉ – Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²ΡƒΡŽ Π±ΡƒΠΊΠ²Ρƒ прописной.

Π§Π΅Ρ‚Ρ‹Ρ€Π΅. ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ экзСмпляра apply_fn() Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fn ΠΈ key Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ доступны Π² области видимости. Π­Ρ‚ΠΎ Π½Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ apply_fn() ΠΈ Π½Π΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Но доступ ΠΊ Π½ΠΈΠΌ Π±ΡƒΠ΄Π΅Ρ‚. ΠŸΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ½Π° сохраняСт ссылки Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½Π° Π·Π°ΠΌΡ‹ΠΊΠ°Π΅Ρ‚ – Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ снаруТи Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ. ΠŸΡ€ΠΈ запускС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ищутся срСди Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ…, Π·Π°Ρ‚Π΅ΠΌ срСди Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π° Π·Π°Ρ‚Π΅ΠΌ срСди ссылок Π½Π° Π·Π°ΠΌΠΊΠ½ΡƒΡ‚Ρ‹Π΅. Π’Π°ΠΌ ΠΈ найдутся fn ΠΈ key.

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

ΠœΠΎΠ»ΠΎΠ΄Ρ†ΠΎΠΌ. Замыкания, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка ΠΈ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости – всё Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π°Ρ…. МоТно ΠΈ Ρ‡Π°ΠΉΠΊΡƒ с ΠΏΠ΅Ρ‡Π΅Π½ΡŒΠΊΠ°ΠΌΠΈ Π²Ρ‹ΠΏΠΈΡ‚ΡŒ.

ΠžΡΡ‚Π°Ρ‘Ρ‚ΡΡ Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… Π³Ρ€ΡƒΠΏΠΏ. Π£Π±Ρ€Π°Ρ‚ΡŒ всё, ΠΊΡ€ΠΎΠΌΠ΅ ΠΈΠΌΠ΅Π½ΠΈ ΠΈ страны. Ѐункция extract_name_and_country():

def extract_name_and_country(band):
    plucked_band = {}
    plucked_band['name'] = band['name']
    plucked_band['country'] = band['country']
    return plucked_band

print pipeline_each(bands, [call(lambda x: 'Canada', 'country'),
                            call(lambda x: x.replace('.', ''), 'name'),
                            call(str.title, 'name'),
                            extract_name_and_country])

# => [{'name': 'Sunset Rubdown', 'country': 'Canada'},
#     {'name': 'Women', 'country': 'Canada'},
#     {'name': 'A Silver Mt Zion', 'country': 'Canada'}]

extract_name_and_country() ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΠΎΠ±ΠΎΠ±Ρ‰Ρ‘Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ pluck(). Использовалась Π±Ρ‹ ΠΎΠ½Π° Ρ‚Π°ΠΊ:

print pipeline_each(bands, [call(lambda x: 'Canada', 'country'),
                            call(lambda x: x.replace('.', ''), 'name'),
                            call(str.title, 'name'),
                            pluck(['name', 'country'])])

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5. pluck ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π΄ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈΠ· записСй. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π΅Ρ‘ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ. Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅ функция Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка.

ΠœΠΎΡ‘ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅:
def pluck(keys):
    def pluck_fn(record):
        return reduce(lambda a, x: assoc(a, x, record[x]),
                      keys,
                      {})
    return pluck_fn

И Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ?

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Ρ…ΠΎΡ€ΠΎΡˆΠΎ сочСтаСтся с Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ· этой ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² любом языкС. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΈ Π²Ρ‹ для своСго ΠΊΠΎΠ΄Π°.

ВспомнитС ΠΏΡ€ΠΎ ΠœΠ°ΡˆΡƒ, ΠŸΠ΅Ρ‚ΡŽ ΠΈ Π’Π°ΡΡŽ. ΠŸΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚Π΅ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ спискам Π² map ΠΈ reduces.

ВспомнитС Π³ΠΎΠ½ΠΊΠΈ. Π Π°Π·Π±Π΅ΠΉΡ‚Π΅ ΠΊΠΎΠ΄ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ сдСлайтС ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ. ΠŸΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Ρ†ΠΈΠΊΠ» Π² Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ.

ВспомнитС ΠΏΡ€ΠΎ Π³Ρ€ΡƒΠΏΠΏΡ‹. ΠŸΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€.

ВозмоТности Python 3, достойныС Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠΈ пользовались

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

ВсС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹Π΅ Π² этом ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π΅, написаны с использованиСм Python 3.7. Π’ описании ΠΊΠ°ΠΆΠ΄ΠΎΠΉ возмоТности ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ свСдСния ΠΎ минимальной вСрсии Python, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ для Π΅Ρ‘ примСнСния.

Π€ΠΎΡ€ΠΌΠ°Ρ‚Π½Ρ‹Π΅ строки (3.6+)


Π‘Π΅Π· использования строк слоТно Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ Π½Π° любом языкС программирования. Но для эффСктивной Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строками Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ Π½ΡƒΠΆΠ½Ρ‹ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ инструмСнты. Π’Π°ΠΊΠΈΠ΅ инструмСнты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ слоТными структурами, Π½Π΅ тСряя ΠΏΡ€ΠΈ этом Π΄ΡƒΡˆΠ΅Π²Π½ΠΎΠ³ΠΎ равновСсия. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Python-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ format:
user = "Jane Doe"
action = "buy"
log_message = 'User {} has logged in and did an action {}.'.format(
 Β user,
 Β action
)
print(log_message)
# User Jane Doe has logged in and did an action buy.

Python 3, наряду с ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ format, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π½Ρ‹Π΅ строки (f-strings, f-строки). Они ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π³ΠΈΠ±ΠΊΠΈΠΉ инструмСнт для выполнСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… манипуляций со строками. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, пСрСписанный с использованиСм Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π½Ρ‹Ρ… строк:
user = "Jane Doe"
action = "buy"
log_message = f'User {user} has logged in and did an action {action}.'
print(log_message)
# User Jane Doe has logged in and did an action buy.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ pathlib (3.4+)


Π€ΠΎΡ€ΠΌΠ°Ρ‚Π½Ρ‹Π΅ строки β€” Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ тСхнология, Π½ΠΎ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ строками, Π²Ρ€ΠΎΠ΄Π΅ ΠΏΡƒΡ‚Π΅ΠΉ ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ, созданы ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ инструмСнты, сильно ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‰ΠΈΠ΅ манипуляции с Π½ΠΈΠΌΠΈ. Π’ Python 3 имССтся ΠΌΠΎΠ΄ΡƒΠ»ΡŒ pathlib, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт собой ΡƒΠ΄ΠΎΠ±Π½ΡƒΡŽ Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡŽ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с путями ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ. Если Π²Ρ‹ ΠΏΠΎΠΊΠ° Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹ Π² полСзности этого модуля для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π²Π°ΡˆΠΈΡ… Π·Π°Π΄Π°Ρ‡ β€” взглянитС Π½Π° этот ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π».
from pathlib import Path
root = Path('post_sub_folder')
print(root)
# post_sub_folder
path = root / 'happy_user'
# Π”Π΅Π»Π°Π΅ΠΌ ΠΏΡƒΡ‚ΡŒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΌ
print(path.resolve())
# /home/weenkus/Workspace/Projects/DataWhatNow-Codes/how_your_python3_should_look_like/post_sub_folder/happy_user

Аннотации Ρ‚ΠΈΠΏΠΎΠ² (3.5+)


Π§Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ β€” статичСская ΠΈΠ»ΠΈ динамичСская типизация? ΠŸΠΎΠΆΠ°Π»ΡƒΠΉ, ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ программист ΠΈΠΌΠ΅Π΅Ρ‚ собствСнный ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° этот нСпростой вопрос. Π― ΠΎΡΡ‚Π°Π²Π»ΡΡŽ Π½Π° усмотрСниС Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½ΠΈ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ свои ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Но я ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ всСм ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ хотя Π±Ρ‹ Π·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Python 3 ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ².
def sentence_has_animal(sentence: str) -> bool:
 Β return "animal" in sentence
sentence_has_animal("Donald had a farm without animals")
# True

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ (3.4+)


Python 3 ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚, благодаря классу Enum, простой ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с пСрСчислСниями. ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для хранСния списков констант. ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ бСспорядочно разбросанными Π² ΠΊΠΎΠ΄Π΅.
from enum import Enum, auto
class Monster(Enum):
 Β Β Β ZOMBIE = auto()
 Β Β Β WARRIOR = auto()
 Β Β Β BEAR = auto()
 Β Β Β 
print(Monster.ZOMBIE)
# Monster.ZOMBIE

Из Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ Python 3 ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ пСрСчислСниС β€” это Π½Π°Π±ΠΎΡ€ символичСских ΠΈΠΌΡ‘Π½ (Ρ‡Π»Π΅Π½ΠΎΠ²), привязанных ΠΊ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ, Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ значСниям. Π§Π»Π΅Π½Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ пСрСчислСния ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Π½Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ. ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ.
for monster in Monster:
 Β Β Β print(monster)
# Monster.ZOMBIE
# Monster.WARRIOR
# Monster.BEAR

ВстроСнный LRU-кэш (3.2+)


Π’ наши Π΄Π½ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ практичСски Π²ΠΎ всСх ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… ΠΈ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… систСмах. Python 3 Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ благодаря Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρƒ lru_cache, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ LRU-ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ (Least Recently Used).

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

import time
def fib(number: int) -> int:
 Β Β Β if number == 0: return 0
 Β Β Β if number == 1: return 1
 Β Β Β 
 Β Β Β return fib(number-1) + fib(number-2)
start = time.time()
fib(40)
print(f'Duration: {time.time() - start}s')
# Duration: 30.684099674224854s

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ lru_cache для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (такая Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ называСтся ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ). Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ врСмя выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ€Π°Π½ΡŒΡˆΠ΅ ΠΈΠ·ΠΌΠ΅Ρ€ΡΠ»ΠΎΡΡŒ сСкундами, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ измСряСтся наносСкундами.
from functools import lru_cache
@lru_cache(maxsize=512)
def fib_memoization(number: int) -> int:
 Β Β Β if number == 0: return 0
 Β Β Β if number == 1: return 1
 Β Β Β 
 Β Β Β return fib_memoization(number-1) + fib_memoization(number-2)
start = time.time()
fib_memoization(40)
print(f'Duration: {time.time() - start}s')
# Duration: 6.866455078125e-05s

Распаковка ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (3.0+)


ΠŸΡ€ΠΈ распаковкС ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ставят Π·Π²Ρ‘Π·Π΄ΠΎΡ‡ΠΊΡƒ. Π’ Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ всё Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΏΠΎΠΏΠ°Π»ΠΎ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Π’Π°ΠΊ, Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ head ΠΈ tail ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΈ послСднСС значСния ΠΈΠ· списка, сформированного ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ range(5). Π’ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ body ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ всё Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ находится ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΈ послСдним Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ.
head, *body, tail = range(5)
print(head, body, tail)
# 0 [1, 2, 3] 4
py, filename, *cmds = "python3.7 script.py -n 5 -l 15".split()
print(py)
print(filename)
print(cmds)
# python3.7
# script.py
# ['-n', '5', '-l', '15']
first, _, third, *_ = range(10)
print(first, third)
# 0 2

ΠšΠ»Π°ΡΡΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… (3.7+)


Π’ Python 3 появились классы Π΄Π°Π½Π½Ρ‹Ρ… (data classes). Они Π΄Π°ΡŽΡ‚ программисту достаточно Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ свободу дСйствий. Π˜Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ ΠΎΠ±ΡŠΡ‘ΠΌΠ° шаблонного ΠΊΠΎΠ΄Π°. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ dataclass автоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ __init__() ΠΈ __repr__(). Π’ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ тСкстС ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ прСдлоТСния ΠΎΠ½ΠΈ описаны ΠΊΠ°ΠΊ «измСняСмыС ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ со значСниями ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽΒ». Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ создания класса Π±Π΅Π· использования Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π° dataclass:
class Armor:
 Β Β Β 
 Β Β Β def __init__(self, armor: float, description: str, level: int = 1):
 Β Β Β Β Β Β Β self.armor = armor
 Β Β Β Β Β Β Β self.level = level
 Β Β Β Β Β Β Β self.description = description
 Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β 
 Β Β Β def power(self) -> float:
 Β Β Β Β Β Β Β return self.armor * self.level
 Β Β Β 
armor = Armor(5.2, "Common armor.", 2)
armor.power()
# 10.4
print(armor)
# <__main__.Armor object at 0x7fc4800e2cf8>

Π’ΠΎΡ‚ Ρ‚ΠΎ ΠΆΠ΅ самоС, Π½ΠΎ ΡƒΠΆΠ΅ написанноС с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ dataclass:
from dataclasses import dataclass
@dataclass
class Armor:
 Β Β Β armor: float
 Β Β Β description: str
 Β Β Β level: int = 1
 Β Β Β 
 Β Β Β def power(self) -> float:
 Β Β Β Β Β Β Β return self.armor * self.level
 Β Β Β 
armor = Armor(5.2, "Common armor.", 2)
armor.power()
# 10.4
print(armor)
# Armor(armor=5.2, description='Common armor.', level=2)

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠ°ΠΏΠΎΠΊ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π±Π΅Π· Ρ„Π°ΠΉΠ»Π° __init__.py (3.3+)


Один ΠΈΠ· способов структурирования Python-ΠΊΠΎΠ΄Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² использовании ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² (ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΏΠ°ΠΏΠΊΠ°Ρ…, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ» __init__.py). Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ:
sound/ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β ΠŸΠ°ΠΊΠ΅Ρ‚ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня
 Β Β Β Β Β __init__.py Β Β Β Β Β Β Β Β Β Β Β Β Β Β Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΠ°ΠΊΠ΅Ρ‚Π° sound
 Β Β Β Β Β formats/ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β ΠŸΠΎΠ΄ΠΏΠ°ΠΊΠ΅Ρ‚ для прСобразования Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² Ρ„Π°ΠΉΠ»ΠΎΠ²
 Β Β Β Β Β Β Β Β Β Β Β Β Β __init__.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β wavread.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β wavwrite.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β aiffread.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β aiffwrite.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β auread.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β auwrite.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β ...
 Β Β Β Β Β effects/ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β ΠŸΠΎΠ΄ΠΏΠ°ΠΊΠ΅Ρ‚ для Π·Π²ΡƒΠΊΠΎΠ²Ρ‹Ρ… эффСктов
 Β Β Β Β Β Β Β Β Β Β Β Β Β __init__.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β echo.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β surround.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β reverse.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β ...
 Β Β Β Β Β filters/ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β ΠŸΠΎΠ΄ΠΏΠ°ΠΊΠ΅Ρ‚ для Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²
 Β Β Β Β Β Β Β Β Β Β Β Β Β __init__.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β equalizer.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β vocoder.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β karaoke.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β ...

ΠŸΡ€ΠΈ использовании Python 2 Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΠΏΠ°ΠΏΠΎΠΊ, упомянутых Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Π» Π±Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» __init__.py. Благодаря этому Ρ„Π°ΠΉΠ»Ρƒ ΠΏΠ°ΠΏΠΊΠ° воспринимаСтся Π² Π²ΠΈΠ΄Π΅ Python-ΠΏΠ°ΠΊΠ΅Ρ‚Π°. Π’ Python 3, с появлСниСм возмоТности Implicit Namespace Packages, Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π² ΠΏΠ°ΠΏΠΊΠ°Ρ… ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² большС Π½Π΅ являСтся ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ.
sound/ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β ΠŸΠ°ΠΊΠ΅Ρ‚ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня
 Β Β Β Β Β __init__.py Β Β Β Β Β Β Β Β Β Β Β Β Β Β Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΠ°ΠΊΠ΅Ρ‚Π° sound
 Β Β Β Β Β formats/ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β ΠŸΠΎΠ΄ΠΏΠ°ΠΊΠ΅Ρ‚ для прСобразования Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² Ρ„Π°ΠΉΠ»ΠΎΠ²
 Β Β Β Β Β Β Β Β Β Β Β Β Β wavread.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β wavwrite.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β aiffread.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β aiffwrite.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β auread.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β auwrite.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β ...
 Β Β Β Β Β effects/ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β ΠŸΠΎΠ΄ΠΏΠ°ΠΊΠ΅Ρ‚ для Π·Π²ΡƒΠΊΠΎΠ²Ρ‹Ρ… эффСктов
 Β Β Β Β Β Β Β Β Β Β Β Β Β echo.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β surround.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β reverse.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β ...
 Β Β Β Β Β filters/ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β ΠŸΠΎΠ΄ΠΏΠ°ΠΊΠ΅Ρ‚ для Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²
 Β Β Β Β Β Β Β Β Β Β Β Β Β equalizer.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β vocoder.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β karaoke.py
 Β Β Β Β Β Β Β Β Β Β Β Β Β ...

Надо ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ всё Π½Π΅ Ρ‚Π°ΠΊ просто. А ΠΈΠΌΠ΅Π½Π½ΠΎ, Π² соотвСтствии с этой ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ спСцификациСй, Ρ„Π°ΠΉΠ» __init__.py всё Π΅Ρ‰Ρ‘ Π½ΡƒΠΆΠ΅Π½ для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ². Если ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ, Ρ‚ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ прСвращаСтся Π² Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ пространства ΠΈΠΌΡ‘Π½, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ограничСния.

Π˜Ρ‚ΠΎΠ³ΠΈ


Π’ этом ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π΅ рассмотрСны Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ всС интСрСсныС возмоТности Python 3, Π½ΠΎ ΠΌΡ‹ надССмся, Ρ‡Ρ‚ΠΎ Π²Ρ‹ нашли здСсь Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅. Код ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² этом Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ.

Π£Π²Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ! КакиС возмоТности Python 3 Π²Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π±Ρ‹ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ здСсь список?

ΠŸΠΎΡ‡Π΅ΠΌΡƒ сущСствуСт Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ ΠŸΠΈΡ‚ΠΎΠ½ΠΎΠ²? / Π₯Π°Π±Ρ€

ΠŸΠΈΡ‚ΠΎΠ½ ΠΈΠ·ΡƒΠΌΠΈΡ‚Π΅Π»Π΅Π½.

Π£Π΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π½ΠΎ это довольно Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΠ΅ заявлСниС. Π§Ρ‚ΠΎ я имСю Π²Π²ΠΈΠ΄Ρƒ ΠΏΠΎΠ΄ β€œΠŸΠΈΡ‚ΠΎΠ½ΠΎΠΌβ€? ΠœΠΎΠΆΠ΅Ρ‚, абстрактный интСрфСйс ΠŸΠΈΡ‚ΠΎΠ½Π°? Или CPython, распространСнная рСализация ΠŸΠΈΡ‚ΠΎΠ½Π° (Π½Π΅ ΠΏΡƒΡ‚Π°Ρ‚ΡŒ с ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ ΠΏΠΎ названию Cython)? Или я имСю Π²Π²ΠΈΠ΄Ρƒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ совсСм ΠΈΠ½ΠΎΠ΅? ΠœΠΎΠΆΠ΅Ρ‚, я косвСнно ΡΡΡ‹Π»Π°ΡŽΡΡŒ Π½Π° Jython, ΠΈΠ»ΠΈ IronPython, ΠΈΠ»ΠΈ PyPy. Или ΠΌΠΎΠΆΠ΅Ρ‚ я отвлСкся Ρ‚Π°ΠΊ сильно, Ρ‡Ρ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΡŽ ΠΎ RPython ΠΈΠ»ΠΈ RubyPython (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‡Π΅Π½ΡŒ сильно ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ).

НС смотря Π½Π° ΡΡ…ΠΎΠΆΠ΅ΡΡ‚ΡŒ Π² названиях ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… ΠΈΠΌΠ΅ΡŽΡ‚ совсСм Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ (ΠΈΠ»ΠΈ, ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΈΠ½Ρ‹ΠΌΠΈ способами)

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠŸΠΈΡ‚ΠΎΠ½ΠΎΠΌ я столкнулся с ΠΊΡƒΡ‡Π΅ΠΉ Ρ‚Π°ΠΊΠΈΡ… Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ *ython. Но лишь Π½Π΅Π΄Π°Π²Π½ΠΎ я ΡƒΠ΄Π΅Π»ΠΈΠ» врСмя, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ собой ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½ΠΈ (каТдая ΠΏΠΎ-своСму) Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹.

Π’ этом постС я Π½Π°Ρ‡Π½Ρƒ с нуля ΠΈ ΠΏΡ€ΠΎΠΉΠ΄ΡƒΡΡŒ ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ рСализациям ΠŸΠΈΡ‚ΠΎΠ½Π°, Π° Π·Π°ΠΊΠΎΠ½Ρ‡Ρƒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΌ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Π² PyPy, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ, ΠΏΠΎ ΠΌΠΎΠ΅ΠΌΡƒ мнСнию, Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅ языка.

ВсС начинаСтся с понимания Ρ‚ΠΎΠ³ΠΎ, Ρ‡Π΅ΠΌ Π½Π° самом Π΄Π΅Π»Π΅ являСтся β€œΠŸΠΈΡ‚ΠΎΠ½β€.

Если Ρƒ вас Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ машинного ΠΊΠΎΠ΄Π°, Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ этот Ρ€Π°Π·Π΄Π΅Π».

ΠŸΠΈΡ‚ΠΎΠ½ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ?

Π­Ρ‚ΠΎ распространСнный источник нСпонимания срСди Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ² ΠŸΠΈΡ‚ΠΎΠ½Π°.

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ: β€œΠŸΠΈΡ‚ΠΎΠ½β€ – это интСрфСйс. БущСствуСт спСцификация, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π°Ρ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠŸΠΈΡ‚ΠΎΠ½, ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ сСбя вСсти (Ρ‡Ρ‚ΠΎ справСдливо для любого интСрфСйса). И сущСствуСт нСсколько ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΉ (Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ справСдливо для любого интСрфСйса).

Π’Ρ‚ΠΎΡ€ΠΎΠ΅: β€œΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉβ€ ΠΈ β€œΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉβ€ это свойства ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, Π½ΠΎ Π½Π΅ интСрфСйса.

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ сам вопрос Π½Π΅ совсСм ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π΅Π½.

Π’ случаС с самой распространСнной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ (CPython: написанный Π½Π° C, часто Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ просто β€œPython”, ΠΈ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅, Ссли понятия Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ ΠΎ Ρ‡Π΅ΠΌ я Ρ‚ΠΎΠ»ΠΊΡƒΡŽ) ΠΎΡ‚Π²Π΅Ρ‚: ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ, с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ компиляциСй. CPython ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚* исходный ΠΊΠΎΠ΄ Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ Π² Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ этот Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄, запуская Π΅Π³ΠΎ Π² процСссС.

* Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: это Π½Π΅ совсСм β€œΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡβ€ Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠΌ смыслС. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΌΡ‹ считаСм, Ρ‡Ρ‚ΠΎ β€œΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡβ€ это конвСртация ΠΈΠ· высокоуровнСвого языка Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ – Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€ΠΎΠ΄Π΅ это β€œΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡβ€.

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΠ·ΡƒΡ‡ΠΈΠΌ этот ΠΎΡ‚Π²Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΡˆΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ нас Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅.

Π‘Π°ΠΉΡ‚ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

ΠžΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΌ (ΠΈΠ»ΠΈ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ) ΠΊΠΎΠ΄ΠΎΠΌ. ΠŸΠΎΠΆΠ°Π»ΡƒΠΉ, Π»Π΅Π³Ρ‡Π΅ всСго Π΅Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

β€” CΠΈ компилируСтся Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ впослСдствии запускаСтся Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ процСссором. КаТдая инструкция заставляСт процСссор ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ дСйствия.
β€” Java компилируСтся Π² Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ впослСдствии запускаСтся Π½Π° Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС Java (Java Virtual Machine, JVM), абстрактном ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запускаСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. КаТдая инструкция обрабатываСтся JVM, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ взаимодСйствуСт с ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ.

Бильно упрощая: ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ быстрСС, Π½ΠΎ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ Π»ΡƒΡ‡ΡˆΠ΅ пСрСносим ΠΈ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½.

ΠœΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Π² зависимости ΠΎΡ‚ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Π½Π° всСх ΠΌΠ°ΡˆΠΈΠ½Π°Ρ…. МоТно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠΎΠ΄ Π²Π°ΡˆΡƒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ CPython, Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

1. CPython ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ваш исходный ΠΊΠΎΠ΄ Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ Π² Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄.
2. Π­Ρ‚ΠΎΡ‚ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ запускаСтся Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС CPython.

Новички Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠŸΠΈΡ‚ΠΎΠ½ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΈΠ·-Π·Π° наличия .pyc-Ρ„Π°ΠΉΠ»ΠΎΠ². Π­Ρ‚ΠΎ отчасти Π²Π΅Ρ€Π½ΠΎ: .pyc-Ρ„Π°ΠΉΠ»Ρ‹ – это скомпилированный Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ впослСдствии интСрпрСтируСтся. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ запускали ваш ΠΊΠΎΠ΄ Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅, ΠΈ Ρƒ вас Π΅ΡΡ‚ΡŒ .pyc-Ρ„Π°ΠΉΠ», Ρ‚ΠΎ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π· ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ быстрСС, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΎΠ²ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄.
ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°ΡˆΠΈΠ½Ρ‹: Jython, IronPython ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅

Как я Π³ΠΎΠ²ΠΎΡ€ΠΈΠ» Π²Ρ‹ΡˆΠ΅, Ρƒ ΠŸΠΈΡ‚ΠΎΠ½Π° сущСствуСт нСсколько Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ. ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, ΠΊΠ°ΠΊ Π³ΠΎΠ²ΠΎΡ€ΠΈ-лось Π²Ρ‹ΡˆΠ΅, самой популярной являСтся CPython. Π­Ρ‚Π° вСрсия ΠŸΠΈΡ‚ΠΎΠ½Π° написана Π½Π° C ΠΈ считаСтся ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ β€œΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽβ€.

Но ΠΊΠ°ΠΊ насчСт Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²? Одна ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²ΠΈΠ΄Π½Ρ‹Ρ… это Jython, рСализация ΠŸΠΈΡ‚ΠΎΠ½Π° Π½Π° Java, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ JVM. Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ CPython Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ для запуска Π½Π° CPython VM, Jython Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ Java для запуска Π½Π° JVM (это Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ гСнСрируСтся ΠΏΡ€ΠΈ компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Java).

β€œΠ—Π°Ρ‡Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ?”, спроситС Π²Ρ‹. Ну, для Π½Π°Ρ‡Π°Π»Π°, Ρ€Π°Π·Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ладят с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ.

CPython ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ написаниС C-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ для ΠΊΠΎΠ΄Π° Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΎΠ½ запускаСтся ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ CΠΈ. Jython Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ Π½Π° Java: Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Java-классы Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… усилий, призывая ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ваши Java-классы ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π° Jython. (Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Ссли Π²Ρ‹ Π΅Ρ‰Π΅ Π½Π΅ Π΄ΡƒΠΌΠ°Π»ΠΈ ΠΎΠ± этом Π²ΡΠ΅Ρ€ΡŒΠ΅Π·, это довольно Π±Π΅Π·ΡƒΠΌΠ½ΠΎ. ΠœΡ‹ Π΄ΠΎΠΆΠΈΠ»ΠΈ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ языки ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² ΠΎΠ΄Π½Ρƒ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ. Как Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ» Rostin, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΡΠΌΠ΅ΡˆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠ΄ Π½Π° Π€ΠΎΡ€Ρ‚Ρ€Π°Π½Π΅ с CΠΈ появились довольно Π΄Π°Π²Π½ΠΎ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ это Π½Π΅ совсСм Π½ΠΎΠ²ΠΈΠ½ΠΊΠ°. Но это всС ΠΆΠ΅ ΠΊΡ€ΡƒΡ‚ΠΎ.)

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Π²ΠΎΡ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π° Jython:

[Java HotSpot(TM) 64-Bit Server VM (Apple Inc.)] on java1.6.0_51
>>> from java.util import HashSet
>>> s = HashSet(5)
>>> s.add("Foo")
>>> s.add("Bar")
>>> s
[Foo, Bar]

IronPython это другая популярная рСализация ΠŸΠΈΡ‚ΠΎΠ½Π°, написанная ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π½Π° C# ΠΈ прСдназначСнная для .NET. Π’ частности, ΠΎΠ½Π° запускаСтся Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС .NET, Ссли Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊ Π½Π°Π·Π²Π°Ρ‚ΡŒ, Π½Π° Common Language Runtime (CLR), ΠΎΡ‚ ΠœΠ°ΠΉΠΊΡ€ΠΎΡΠΎΡ„Ρ‚, сравнимым с JVM.

МоТно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Jython: Java :: IronPython: C#. Они Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ…, Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ классы C# Π² ΠΊΠΎΠ΄ IronPython ΠΈ классы Java Π² ΠΊΠΎΠ΄ Jython, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Π’ΠΏΠΎΠ»Π½Π΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ Π²Ρ‹ΠΆΠΈΡ‚ΡŒ, Π½Π΅ ΠΏΡ€ΠΈΠΊΠ°ΡΠ°ΡΡΡŒ ΠΊ Π½ΠΈ ΠΊ Ρ‡Π΅ΠΌΡƒ, ΠΊΡ€ΠΎΠΌΠ΅ CPython. Но, пСрСходя Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ прСимущСство, Π² основном ΠΈΠ·-Π·Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ стСка Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΌΠ½ΠΎΠ³ΠΎ языков, основанных Π½Π° JVM? Jython ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ ΠΏΠΎΠ΄ΠΎΠΉΡ‚ΠΈ. ВсС Π½Π° .NET? Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, стоит ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ IronPython (ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ ΡƒΠΆΠ΅ сдСлали).

ΠšΡΡ‚Π°Ρ‚ΠΈ, Ρ…ΠΎΡ‚ΡŒ это ΠΈ Π½Π΅ станСт ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ для ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ, стоит ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ эти Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ. Π­Ρ‚ΠΎ касаСтся Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ способов ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅. Однако эти отличия, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½Π΅-Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹, ΠΎΠ½ΠΈ ΠΈΡΡ‡Π΅Π·Π°ΡŽΡ‚ ΠΈ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΈΠ·-Π·Π° Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, IronPython ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ строки Unicode ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ; ΠΎΠ΄Π½Π°ΠΊΠΎ CPython ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ASCII Π² вСрсиях 2.x (выдавая ΠΎΡˆΠΈΠ±ΠΊΡƒ UnicodeEncodeError для Π½Π΅-ASCII символов), ΠΈ ΠΏΡ€ΠΈ этом ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ символы Unicode ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² вСрсиях 3.x.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Π½Π° Π»Π΅Ρ‚Ρƒ (Just-in-Time Compilation): PyPy ΠΈ Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅

Π˜Ρ‚Π°ΠΊ, Ρƒ нас Π΅ΡΡ‚ΡŒ имплСмСнтация ΠŸΠΈΡ‚ΠΎΠ½Π°, написанная Π½Π° Π‘ΠΈ, Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° – Π½Π° Java, ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒΡ Π½Π° C#. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ шаг: имплСмСнтация ΠŸΠΈΡ‚ΠΎΠ½Π°, написанная на… ΠŸΠΈΡ‚ΠΎΠ½Π΅. (ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚, Ρ‡Ρ‚ΠΎ это ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΠΌΠ°Π½Ρ‡ΠΈΠ²ΠΎ).

Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ это ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ±ΠΈΠ²Π°Ρ‚ΡŒ с Ρ‚ΠΎΠ»ΠΊΡƒ. Для Π½Π°Ρ‡Π°Π»Π°, Π΄Π°Π²Π°ΠΉΡ‚Π΅ обсудим ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ Π½Π° Π»Π΅Ρ‚Ρƒ (just-in-time ΠΈΠ»ΠΈ JIT).

JIT. ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΈ ΠΊΠ°ΠΊ

Напомню, Ρ‡Ρ‚ΠΎ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ быстрСС Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π°. Ну, Π° Ρ‡Ρ‚ΠΎ, Ссли Π±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π° ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΊΠΎΠ΄? ΠŸΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ β€œΠ·Π°ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒβ€ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ†Π΅Π½Ρƒ (ΠΈΠ½Ρ‹ΠΌΠΈ словами: врСмя) Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π°, Π½ΠΎ Ссли Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ быстрСС, Ρ‚ΠΎ это Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ! Π­Ρ‚ΠΈΠΌ ΠΈ мотивируСтся JIT-компиляция, гибридная Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ°, которая совмСщаСт Π² сСбС прСимущСства ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎ-Ρ€ΠΎΠ² ΠΈ компиляторов. Π’ Π΄Π²ΡƒΡ… словах – JIT стараСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ систСму ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ.

НапримСр, Π²ΠΎΡ‚ распространСнный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ JIT:

  1. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запускаСтся часто.
  2. Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄.
  3. Π—Π°ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.
  4. ВсСгда ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΆΠ΅ скомпилированный ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈ ΠΏΠΎΠΆΠΈΠ½Π°Ρ‚ΡŒ ΠΏΠ»ΠΎΠ΄Ρ‹ (Π² частности, прирост скорости).

Π’ этом вся ΡΡƒΡ‚ΡŒ PyPy: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ JIT Π² ΠŸΠΈΡ‚ΠΎΠ½Π΅ (Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ). ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ†Π΅Π»ΠΈ: PyPy Π½Π°Ρ†Π΅Π»Π΅Π½ Π½Π° ΠΊΡ€ΠΎΡΡΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎΡΡ‚ΡŒ, Ρ€Π°Π±ΠΎΡ‚Ρƒ с нСбольшим количСством памяти ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ stackless (ΠΎΡ‚ΠΊΠ°Π·Π° ΠΎΡ‚ стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² языка Π‘ΠΈ Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ собствСнного стСка). Но JIT это Π³Π»Π°Π²Π½ΠΎΠ΅ прСимущСство. Π’ срСднСм Π½Π° основС Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… тСстов, Ρ„Π°ΠΊΡ‚ΠΎΡ€ ускорСния составляСт 6.27. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ· схСмы ΠΎΡ‚ PyPy Speed Center:

Π’ PyPy слоТно Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ

Π£ PyPy Π΅ΡΡ‚ΡŒ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π», ΠΈ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΎΠ½ Ρ…ΠΎΡ€ΠΎΡˆΠΎ совмСстим с CPython (Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π° Π½Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Flask, Django, ΠΈ Ρ‚.Π΄.).

Но с PyPy Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρ‹. (ΠΎΡ†Π΅Π½ΠΈΡ‚Π΅, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, это бСссмыслСнноС ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ PyPyPy…). По ΠΌΠΎΠ΅ΠΌΡƒ мнСнию основная ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ PyPy ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ являСтся:

1. Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠŸΠΈΡ‚ΠΎΠ½Π°, написанным Π½Π° RPython (Π½Π΅ Python (я ΠΎΠ±ΠΌΠ°Π½ΡƒΠ» вас Π΄ΠΎ этого)). RPython это подмноТСство Python со статичной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ. Π’ Python, вСсти Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ бСсСды ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… β€œΠ² Ρ†Π΅Π»ΠΎΠΌ нСвозмоТно” ΠΏΠΎΡ‡Π΅ΠΌΡƒ это Ρ‚Π°ΠΊ слоТно? рассмотритС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

x = random.choice([1, "foo"])

это ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π° Python (спасибо Ademanβ€˜Ρƒ). Какой Ρ‚ΠΈΠΏ Ρƒ x? Как ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΠ³Π΄Π° Ρ‚ΠΈΠΏΡ‹ Π΄Π°ΠΆΠ΅ Π½Π΅ Ρ„ΠΎΡ€ΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ?). Π’ RPython ΠΌΡ‹ ΠΆΠ΅Ρ€Ρ‚Π²ΡƒΠ΅ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒΡŽ, Π½ΠΎ Π²Π·Π°ΠΌΠ΅Π½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Ρ‡Π΅Π³ΠΎ Π΅Ρ‰Π΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΡ€ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

2. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄ Π½Π° RPython Π² Ρ€Π°Π·Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ JIT. ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΎΠΉ ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ являСтся Π‘ΠΈ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ компилятор RPython-Π²-Π‘ΠΈ, Π½ΠΎ Π² качСствС Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ JVM ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅.

Для простоты описания, я Π±ΡƒΠ΄Ρƒ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… PyPy (1) ΠΈ PyPy (2).

Π—Π°Ρ‡Π΅ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ эти Π΄Π²Π΅ Π²Π΅Ρ‰ΠΈ, ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ – Π² ΠΎΠ΄Π½ΠΎΠΌ Π½Π°Π±ΠΎΡ€Π΅? Π”ΡƒΠΌΠ°ΠΉΡ‚Π΅ ΠΎΠ± этом Ρ‚Π°ΠΊ: PyPy (1) это ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€, написанный Π½Π° RPython. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ½ Π±Π΅Ρ€Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠΎΠ΄ Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ Π² Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄. Но Ρ‡Ρ‚ΠΎΠ±Ρ‹ сам ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ (написанный Π½Π° RPython) ΠΌΠΎΠ³ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Пи-Ρ‚ΠΎΠ½Π°, Π²Π΅Ρ€Π½ΠΎ?

Π˜Ρ‚Π°ΠΊ, ΠΌΠΎΠΆΠ½ΠΎ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ CPython Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€. Но это Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ слишком быстро.

ВмСсто этого ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ PyPy (2) (Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ RPython Toolchain) Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ PyPy Π² ΠΊΠΎΠ΄ для Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, C, JVM, ΠΈΠ»ΠΈ CLI) для запуска Π½Π° ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ машинС, с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ JIT. Π­Ρ‚ΠΎ волшСбно: PyPy динамичСски добавляСт JIT ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ, гСнСрируя собствСнный компилятор! (ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, это Π±Π΅Π·ΡƒΠΌΠΈΠ΅: ΠΌΡ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€, добавляя Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ, ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ компилятор).

Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ исходный ΠΊΠΎΠ΄ Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ JIT. Π’ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ! ΠŸΠΎΠ½ΡΡ‚ΡŒ слоТновато, Π½ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, эта схСма ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚:

ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠΌ: настоящая красота PyPy Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ сСбС ΠΊΡƒΡ‡Ρƒ Ρ€Π°Π·Π½Ρ‹Ρ… ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠŸΠΈΡ‚ΠΎΠ½Π° Π½Π° RPython Π½Π΅ Π²ΠΎΠ»Π½ΡƒΡΡΡŒ ΠΎ JIT (Π½Π΅ считая ΠΏΠ°Ρ€Ρ‹ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ). ПослС этого PyPy Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ для нас JIT, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ RPython Toolchain/PyPy (2).

На самом Π΄Π΅Π»Π΅, Ссли ΠΊΠΎΠΏΠ½ΡƒΡ‚ΡŒ Π³Π»ΡƒΠ±ΠΆΠ΅ Π² Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡŽ, тСорСтичСски ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ любого языка, Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² PyPy ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ JIT для этого языка. Π­Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ PyPy концСнтрируСтся Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ самого ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, Π° Π½Π΅ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ языка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΠΎΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚.

Π’ качСствС отступлСния я Π±Ρ‹ Ρ…ΠΎΡ‚Π΅Π» Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ сам JIT ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ восхититСлСн. Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ β€œΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅β€ (tracing), которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  1. Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС (Π½Π΅ добавляя JIT).
  2. ΠŸΡ€ΠΎΠ²Π΅ΡΡ‚ΠΈ Π»Π΅Π³ΠΊΠΎΠ΅ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.
  3. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡŒ Ρ€Π°Π½Π΅Π΅.
  4. Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эти части ΠΊΠΎΠ΄Π° Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄.

Π£Π·Π½Π°Ρ‚ΡŒ большС ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ· этой лСгкодоступной ΠΈ ΠΎΡ‡Π΅Π½ΡŒ интСрСсной ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

ΠŸΠΎΠ΄Ρ‹Ρ‚ΠΎΠΆΠΈΠΌ: ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ PyPy-компилятор RPython-Π²-Π‘ΠΈ (ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ†Π΅Π»Π΅Π²ΡƒΡŽ ΠΏΠ»Π°Ρ‚-Ρ„ΠΎΡ€ΠΌΡƒ), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π½Π° RPython ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚Π°Ρ‚ΠΎΡ€ PyPΡƒ.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠŸΠΎΡ‡Π΅ΠΌΡƒ всС это Ρ‚Π°ΠΊ Π²ΠΎΡΡ…ΠΈΡ‚ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ? ΠŸΠΎΡ‡Π΅ΠΌΡƒ стоит Π³Π½Π°Ρ‚ΡŒΡΡ Π·Π° этой Π±Π΅Π·ΡƒΠΌΠ½ΠΎΠΉ ΠΈΠ΄Π΅Π΅ΠΉ? По-ΠΌΠΎΠ΅ΠΌΡƒ, АлСкс Π“Π΅ΠΉΠ½ΠΎΡ€ объяснил это ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π² своСм Π±Π»ΠΎΠ³Π΅: β€œ[Π—Π° PyPy Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅] ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ [ΠΎΠ½] Π±ΠΎΠ»Π΅Π΅ быстрый, Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΉ ΠΈ являСтся Π»ΡƒΡ‡ΡˆΠ΅ΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΎΠΉ для развития ΠŸΠΈΡ‚ΠΎΠ½Π°β€.

Π’ΠΊΡ€Π°Ρ‚Ρ†Π΅:

  • Он быстрый – ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ исходный ΠΊΠΎΠ΄ Π² Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ JIT).
  • Он Π³ΠΈΠ±ΠΊΠΈΠΉ – ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ добавляСт JIT Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Π±Π΅Π· особых усилий.
  • Он Π³ΠΈΠ±ΠΊΠΈΠΉ (ΠΎΠΏΡΡ‚ΡŒ) – ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρ‹ Π² RPython, Ρ‡Ρ‚ΠΎ впослСдствии ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ‚Π΅ΠΌ ΠΆΠ΅ Π‘ΠΈ (Π½Π° самом Π΄Π΅Π»Π΅ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ Π΅ΡΡ‚ΡŒ инструкция ΠΏΠΎ написанию собствСнных ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠ²).
Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: Π΄Ρ€ΡƒΠ³ΠΈΠ΅ названия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠ»Ρ‹ΡˆΠ°Π»ΠΈ

Python 3000 (Py3k): Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Python 3.0, основной Ρ€Π΅Π»ΠΈΠ· ΠŸΠΈΡ‚ΠΎΠ½Π° с ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ появился Π² 2008. Π³ΠΎΠ΄Ρƒ. Команда Py3k прСдсказала, Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²ΠΎΠΉ вСрсии понадобится ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΏΡΡ‚ΡŒ Π»Π΅Ρ‚ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈΠΆΠΈΡ‚ΡŒΡΡ. И Π² Ρ‚ΠΎ врСмя, ΠΊΠ°ΠΊ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ (Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π½Π°Π΄ΡƒΠΌΠ°Π½Π½ΠΎΠ΅ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅) Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Python 2.x, люди всС большС Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎ Py3k.

Cython: надмноТСство Python, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π‘ΠΈ.

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

Numba: β€œΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ just-in-time компилятор”, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ добавляСт JIT Π² снабТСнный примСчаниями ΠΊΠΎΠ΄ Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅. ΠŸΡ€ΠΎΡ‰Π΅ говоря, Π²Ρ‹ Π΄Π°Π΅Ρ‚Π΅ Π΅ΠΌΡƒ подсказки, Π° ΠΎΠ½ ускоряСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ части вашСго ΠΊΠΎΠ΄Π°. Numba являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ дистрибутива Anaconda Π½Π°Π±ΠΎΡ€Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² для Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ управлСния Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

IPython: сильно отличаСтся ΠΎΡ‚ всСго, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ обсудили. Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ срСда для ΠŸΠΈΡ‚ΠΎΠ½Π°. Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Π°Ρ, с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ GUI-ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ² ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Psyco: ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠŸΠΈΡ‚ΠΎΠ½Π°, ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΠ΅Ρ€Π²Ρ‹Ρ… ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ ΠŸΠΈΡ‚ΠΎΠ½Π° Π² области JIT. Π”Π°Π²Π½ΠΎ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ β€œΠ½Π΅ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ ΠΈ мСртвый”. Π“Π»Π°Π²Π½Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Psyco Армин Π ΠΈΠ³ΠΎ сСйчас Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π°Π΄ PyPy.

ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠΈ ΠΊ языкам
  • RubyPython: мост ΠΌΠ΅ΠΆΠ΄Ρƒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ машинами Ruby ΠΈ Python. ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ Π² ΠΊΠΎΠ΄ Π½Π° Ruby. Π’Ρ‹ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚Π΅, Π³Π΄Π΅ начинаСтся ΠΈ заканчиваСтся ΠŸΠΈΡ‚ΠΎΠ½, Π° RubyPython обСспСчиваСт ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ машинами.
  • PyObjc: языковоС соСдинСниС ΠΌΠ΅ΠΆΠ΄Ρƒ Python ΠΈ Objective-C, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π΅Π΄Π΅Ρ‚ сСбя ΠΊΠ°ΠΊ мост ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Objective-C (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ всС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для создания прилоТСния ΠΏΠΎΠ΄ OS X) Π² ΠΊΠΎΠ΄Π΅ Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅, ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠŸΠΈΡ‚ΠΎΠ½Π° Π² ΠΊΠΎΠ΄Π΅ Π½Π° Objective-C. Π­Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ CPython написан Π½Π° Π‘ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся подмноТСством Objective-C.
  • PyQt: Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ PyObjc позволяСт ΡΠ²ΡΠ·Π°Ρ‚ΡŒ ΠŸΠΈΡ‚ΠΎΠ½ с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ OS X GUI, PyQt Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ для Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Qt. Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹Π΅ графичСскиС интСрфСйсы, ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ SQL Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ инструмСнт, Π½Π°Ρ†Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π½Π° пСрСнос простоты ΠŸΠΈΡ‚ΠΎΠ½Π° Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ.
JavaScript Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ
  • pyjs (Pyjamas): Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ для создания Π²Π΅Π± ΠΈ дСсктопных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅. Π’ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя компилятор Python-Π²-JavaScript, Π½Π°Π±ΠΎΡ€ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ инструмСнты.
  • Brython: Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина Python, написанная Π½Π° Javascript. ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° Py3k Π² Π²Π΅Π±-Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅.

10 шагов ΠΊ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌΡƒ Python-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ / Π‘Π»ΠΎΠ³ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ RUVDS.com / Π₯Π°Π±Ρ€

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ сСгодня ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ, посвящён инструмСнтам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΡΠ½Π°Ρ‰Π°Ρ‚ΡŒ Python-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ срСдствами форматирования ΠΊΠΎΠ΄Π°, тСстирования, Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° зависимостСй. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ процСсс Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, способствуСт ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡŽ качСства, Сдинообразия ΠΈ бСзопасности ΠΊΠΎΠ΄Π°. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Ρƒ читатСля этого ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΏΡ‹Ρ‚ Python-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π° Python, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½, Π² Ρ…ΠΎΠ΄Π΅ чтСния, Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Если Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Ρƒ вас Π½Π΅Ρ‚ β€” здСсь ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ срСду Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Python-ΠΏΠ°ΠΊΠ΅Ρ‚. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ здСсь ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ, ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Ρ‹ с использованиСм macOS ΠΈ Python 3.7.



Π¨Π°Π³ 1. Установка Black



Код ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ соглашСниям ΠΎ стилС ΠΊΠΎΠ΄Π°. Black β€” это Python-ΠΏΠ°ΠΊΠ΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ автоматичСски Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄, приводя Π΅Π³ΠΎ внСшний Π²ΠΈΠ΄ ΠΊ стандарту PEP 8. Black β€” это ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π½ΠΎ Ρƒ Π½Π΅Π³ΠΎ ΡƒΠΆΠ΅ Π½Π°Π±Ρ€Π°Π»ΠΎΡΡŒ большС ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΎΠΊ. Π•Π³ΠΎ использованиС быстро стало ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ Ρ‚ΠΎΠ½Π° Π² Python-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅. Π’ΠΎΡ‚ руководство ΠΏΠΎ Black.

Π―, Π² качСствС Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° ΠΊΠΎΠ΄Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Atom, поэтому я Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π² Atom ΠΏΠ°ΠΊΠ΅Ρ‚ Python-Black. О Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ здСсь. ПослС установки этого ΠΏΠ°ΠΊΠ΅Ρ‚Π° Atom Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ послС сохранСния Ρ„Π°ΠΉΠ»Π°.

Пока ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Black β€” Π΄Π°Π²Π°ΠΉΡ‚Π΅ оснастим этим срСдством срСду Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ вмСстС с Π½Π°ΠΌΠΈ трудится Π½Π°Π΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ. Π’ ΠΈΡ‚ΠΎΠ³Π΅ всС, ΠΊΡ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π°Π΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ, Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° форматирования ΠΊΠΎΠ΄Π°, Π° Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΈΡ… ΠΏΡƒΠ»Π»-запросы Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ.

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ black==18.9b0 Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ Π½Π°ΡˆΠ΅Π΄ΡˆΡƒΡŽΡΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡƒΡŽ строку Ρ„Π°ΠΉΠ»Π° requirements_dev.txt ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ install -r requirements_dev.txt.

Black, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, устанавливаСт Π΄Π»ΠΈΠ½Ρƒ строки ΠΊΠΎΠ΄Π° Ρ€Π°Π²Π½ΠΎΠΉ 88 символов. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… руководствах ΠΏΠΎ ΡΡ‚ΠΈΠ»ΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” Π² Sphinx, трСбуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π»ΠΈΠ½Ρƒ строки, Ρ€Π°Π²Π½ΡƒΡŽ 79 символов. Π’ настройках ΠΏΠ°ΠΊΠ΅Ρ‚Π° Black-Atom ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΆΠ΅Π»Π°Π΅ΠΌΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ строки.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ обзавСлись инструмСнтом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ врСмя Π½Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠ΄Π°, ΠΏΠΎΠ΄ΡƒΠΌΠ°Π΅ΠΌ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ ΠΈ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ ΠΊΠΎΠ΄Π° Π² PyPI.

Π¨Π°Π³ 2. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° .pypirc


Когда для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сборок прилоТСния Π² TestPyPI ΠΈ PyPI ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ twine, свСдСния для Π²Ρ…ΠΎΠ΄Π° Π² систСму трСбуСтся Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. Если Π²Ρ‹ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с twine β€” взглянитС Π½Π° этот ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π». БСйчас ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот процСсс.

Twine ΡƒΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ„Π°ΠΉΠ»ΠΎΠΌ .pypirc, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² нашСй домашнСй Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ. Π­Ρ‚ΠΎ срСдство, выгруТая Π΄Π°Π½Π½Ρ‹Π΅, Π±Π΅Ρ€Ρ‘Ρ‚ ΠΈΠ· Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° URL, Π»ΠΎΠ³ΠΈΠ½ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ.

Π˜Ρ‚Π°ΠΊ, создадим Π² домашнСй Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Ρ„Π°ΠΉΠ» .pypirc:

touch ~/.pypirc

Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π² Π½Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ тСкст:
[distutils]
index-servers =
 Β Β Β pypi
 Β Β Β testpypi

[testpypi]
repository: https://test.pypi.org/legacy
username = your_username
password = your_pypitest_password

[pypi]
username = your_username
password = your_pypi_password

ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ сюда Π½Π°Π΄ΠΎ Π²ΠΏΠΈΡΠ°Ρ‚ΡŒ ваши Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ этот Ρ„Π°ΠΉΠ» Π±Ρ‹Π» Π±Ρ‹ сохранён Π² домашнСй Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, Π° Π½Π΅ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ этот Ρ„Π°ΠΉΠ» ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅, ΠΏΠΎΠ»ΡŒΠ·ΡƒΡΡΡŒ срСдствами ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ:
chmod 600 ~/.pypirc

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ваш ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π² TestPyPI ΠΏΠΎΠ»ΡŒΠ·ΡƒΡΡΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
twine upload -r testpypi dist/*

Π’ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ PyPI ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Ρ‚Π°ΠΊ:
twine upload dist/*

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΎΠ±Π·Π°Π²Π΅Π΄Ρ‘Ρ‚Π΅ΡΡŒ Ρ„Π°ΠΉΠ»ΠΎΠΌ .pypirc, Π²Π°ΠΌ большС Π½Π΅ придётся Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ.

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

Π¨Π°Π³ 3. Установка ΠΈ настройка pytest



Pytest β€” это самая популярная, лёгкая Π² использовании Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для тСстирования ΠΊΠΎΠ΄Π°, написанного Π½Π° Python. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ простыС тСсты. Π’ΠΎΡ‚, Ссли вас ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‚ подробности ΠΎ pytest, Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅ Π²Π²ΠΎΠ΄Π½ΠΎΠ΅ руководство ΠΏΠΎ этому инструмСнту.

Π”ΠΎΠ±Π°Π²ΠΈΠΌ свСдСния ΠΎ pytest Π² Ρ„Π°ΠΉΠ» requirements_dev.txt:

pytest==4.3.0

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ установку ΠΏΠ°ΠΊΠ΅Ρ‚Π°:
pip install requirements_dev.txt

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, которая ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ pytest ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ наш ΠΏΠ°ΠΊΠ΅Ρ‚:
pip install -e .

Если Π²Ρ‹ Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ свою Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ срСду Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Ρ‚ΠΎ Π²Π°ΠΌ, для запуска тСстов, понадобится снова Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠ±Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ pip.

Π¨Π°Π³ 4. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ тСстов


Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΠ°ΠΏΠΊΡƒ test Π² ΠΊΠΎΡ€Π½Π΅Π²ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅ Π² Π½Π΅Ρ‘ Ρ„Π°ΠΉΠ» test_your_package_name.py. Мой Ρ„Π°ΠΉΠ» называСтся test_notebookc.py. Если имя Ρ„Π°ΠΉΠ»Π° начинаСтся с test_, pytest ΠΌΠΎΠΆΠ΅Ρ‚ автоматичСски ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Ρ„Π°ΠΉΠ».

Π’ Ρ„Π°ΠΉΠ» test_notebookc.py я Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ тСст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π»ΠΈ имя Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ функция. ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠΉΡ‚Π΅ этот ΠΊΠΎΠ΄ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² Π½Ρ‘ΠΌ ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ соотвСтствовали Π±Ρ‹ вашим, ΠΎΠΏΠΈΡˆΠΈΡ‚Π΅ Π² Π½Ρ‘ΠΌ собствСнныС тСсты.

"""Tests for `notebookc` package."""
import pytest
from notebookc import notebookc


def test_convert(capsys):
 Β Β Β """Correct my_name argument prints"""
 Β Β Β notebookc.convert("Jill")
 Β Β Β captured = capsys.readouterr()
 Β Β Β assert "Jall" in captured.out

Π§Ρ‚ΠΎ здСсь происходит?

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ сюда наш ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. ΠŸΠΎΡ‚ΠΎΠΌ создаём Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, имя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ строится ΠΏΠΎ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ test_my_function_name. Π­Ρ‚ΠΎ соглашСниС ΠΎΠ± ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ позволяСт Π΄Ρ€ΡƒΠ³ΠΈΠΌ людям, Ρ‡ΠΈΡ‚Π°ΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, быстро ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ провСряСтся Π² тСстах. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, это Π½ΡƒΠΆΠ½ΠΎ для ΠΏΠ°ΠΊΠ΅Ρ‚Π°, ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΊΠΎΠ΄Π° тСстами, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π½ΠΈΠΆΠ΅.

ПослС этого ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (convert), пСрСдавая Π΅ΠΉ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° имя Jill. Π”Π°Π»Π΅Π΅ β€” Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ функция. Π’ΡƒΡ‚ стоит ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ рассматриваСмая функция ΠΊΡ€Π°ΠΉΠ½Π΅ проста. Она Π±Π΅Ρ€Ρ‘Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ my_name ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

print(f"I’ll convert a notebook for you some day, {my_name}.")

Pytest провСряСт, содСрТится Π»ΠΈ Jall Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ функция. Π’Π°ΠΌ этой строки Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Jill. Π’ΠΎΡ‚ докумСнтация ΠΏΠΎ pytest, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ свСдСния ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π΅ Π²Ρ‹Π²ΠΎΠ΄Π°.

Запустим тСстированиС, ввСдя Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС pytest. Π­Ρ‚ΠΎΡ‚ тСст Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ. БвСдСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π²Ρ‹Π²Π΅Π΄Π΅Π½Ρ‹ красным Ρ†Π²Π΅Ρ‚ΠΎΠΌ.


Π’ Ρ…ΠΎΠ΄Π΅ тСста выявлСна ошибка

Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ тСсты Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ, описывая ΠΈΡ… Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹, Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… условиях, ΠΎΠ½ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π»ΠΈΡΡŒ Π±Ρ‹ с ошибкой. НС стоит ΠΏΠΈΡΠ°Ρ‚ΡŒ тСсты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π΄Π°ΡŽΡ‚ лишь сообщСния Π·Π΅Π»Ρ‘Π½ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ тСсты ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ совсСм Π½Π΅ Ρ‚ΠΎ, для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‡Π΅Π³ΠΎ ΠΈΡ… ΠΏΠΈΡˆΡƒΡ‚.

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΡƒΠ±Π΅Π΄ΠΈΠ»ΠΈΡΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ тСст Π΄Π°Π» сбой β€” помСняСм Π² ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΈ Jall Π½Π° Jill ΠΈ снова запустим тСстированиС. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.


УспСшноС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ тСста

Π’Π΅ΠΏΠ΅Ρ€ΡŒ всё Ρ…ΠΎΡ€ΠΎΡˆΠΎ. ВСст позволяСт ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ строку, эта строка ΠΏΠΎΠΏΠ°Π΄Ρ‘Ρ‚ Π² Ρ‚ΠΎΡ‚ тСкст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ эта функция.

Π•Ρ‰Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ тСст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ провСряСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½Π° обращаСтся с ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π΅ΠΉ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. А ΠΈΠΌΠ΅Π½Π½ΠΎ, Ссли ΠΎΠ½Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅, Ρ‚ΠΈΠΏ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… отличаСтся ΠΎΡ‚ строкового, ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ TypeError. Π’ΠΎΡ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΠΏΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌ ΠΈ ΠΏΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ошибок Π² Python.

Когда ΠΌΡ‹ создавали ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ тСст, ΠΌΡ‹ писали ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌΡƒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ тСста. Π­Ρ‚ΠΎ называСтся Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Ρ‡Π΅Ρ€Π΅Π· тСстировании (Test-Driven Development, TDD). TDD β€” это доказавший свою Ρ†Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ, ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ оказываСтся мСньшС ошибок, Ρ‡Π΅ΠΌ Π² Π½Ρ‘ΠΌ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π±Π΅Π· использования TDD. Π’ΠΎΡ‚ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΠΏΠΎ TDD.

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

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠ°ΠΊΠ΅Ρ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΏΡ€ΠΎΡˆΡ‘Π» тСсты β€” ΠΌΡ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ систСмой Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ.

Π¨Π°Π³ 5. РСгистрация Π² сСрвисС Travis CI ΠΈ Π΅Π³ΠΎ настройка



Travis CI β€” это «распрСдСлённый Π²Π΅Π±-сСрвис для сборки ΠΈ тСстирования ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния». Π•Π³ΠΎ Π½Π΅Π΄Π°Π²Π½ΠΎ ΠΊΡƒΠΏΠΈΠ»Π° компания Idera. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ систСмы Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ, Π½ΠΎ Travis CI β€” это популярный, бСсплатный для опСнсорсного примСнСния ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ инструмСнт, поэтому ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΠΌ.

Travis CI позволяСт ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ Π² ваш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ тСсты ΠΈ соотвСтствуСт стандартам. Π—Π΄Π΅ΡΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ подробности ΠΎ Travis CI, Π° здСсь β€” ΠΎ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ.

CΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΡƒΡ‡Ρ‘Ρ‚Π½ΡƒΡŽ запись Π½Π° сайтС https://travis-ci.org/. Π”Π°Π»Π΅Π΅, Ρ‰Ρ‘Π»ΠΊΠ½ΠΈΡ‚Π΅ ΠΏΠΎ ссылкС Review and add your authorized organizations Π½Π° страницС профиля. Π’Π°ΠΌ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ°Ρ‚ ввСсти ΠΏΠ°Ρ€ΠΎΠ»ΡŒ для доступа ΠΊ GitHub. Π©Ρ‘Π»ΠΊΠ½ΠΈΡ‚Π΅ ΠΏΠΎ Grant Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Organization access.


Настройка ΡƒΡ‡Ρ‘Ρ‚Π½ΠΎΠΉ записи Travis CI

МнС понадобилось ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² ΡƒΡ‡Ρ‘Ρ‚Π½ΠΎΠΉ записи появились Π±Ρ‹ свСдСния ΠΎ notebooktoall ΠΈ ΠΎ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ notebookc. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠΎΠ΄Π° срСдствами Travis CI Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° Π±Ρ‹, трСбуСтся Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΎΠΊΠΎΠ»ΠΎ ΠΌΠΈΠ½ΡƒΡ‚Ρ‹. ПослС этого Π½ΡƒΠΆΠ½ΠΎ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, воспользовавшись ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Π΅ΠΌ, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ рисункС.


Активация рСпозитория

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ Ρ‰Ρ‘Π»ΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ΅ Settings. Π’ΡƒΡ‚ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ Travis Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ сборку Π½Π° основС ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΏΡƒΠ»Π»-запросов ΠΈΠ»ΠΈ Π²Π΅Ρ‚ΠΎΠΊ.


Настройка сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

БСйчас ΠΏΡ€ΠΈΡˆΠ»ΠΎ врСмя Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π½Π°Π΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ даст Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Travis Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ сборку ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡƒΠ»Π»-запроса.

Π¨Π°Π³ 6. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° .travis.yml


Π’ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° создайтС Ρ„Π°ΠΉΠ» .travis.yml со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ содСрТимым:
dist: xenial
language: python
python: 3.7.2
install:
 Β - pip install -r requirements_dev.txt
 Β - pip install -e .

script:
 Β - pytest

Π‘Ρ‚Ρ€ΠΎΠΊΠ° dist: xenial Π½ΡƒΠΆΠ½Π° для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Travis Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ использования для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ окруТСния Ubuntu Xenial 16.04. Для тСстирования ΠΊΠΎΠ΄Π° Python 3.7 Π½ΡƒΠΆΠ½Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Ubuntu Xenial, подробности ΠΎΠ± этом ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ здСсь.

Π Π°Π·Π΄Π΅Π» install позволяСт ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ установку ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Команда pip install -e . выполняСт установку нашСго ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Travis. ПослС этого Travis, запуская pytest, смоТСт Π½Π°ΠΉΡ‚ΠΈ наш ΠΏΠ°ΠΊΠ΅Ρ‚.

Π¨Π°Π³ 7. ВСстированиС Π² Travis CI


Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠΌΠΈΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΎΡ‚ΠΏΡ€Π°Π²ΡŒΡ‚Π΅ ΠΈΡ… Π½Π° GitHub, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ PR. Travis Π΄ΠΎΠ»ΠΆΠ΅Π½, Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… сСкунд, Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ.
Travis Π·Π° Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ

Π’ΠΎΡ‚ Ρ‡Π΅ΠΌ занимаСтся Travis, обрабатывая ΠΏΡ€ΠΎΠ΅ΠΊΡ‚.


ДСйствия, выполняСмыС Travis ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

Если PR оказался Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ β€” Travis ΠΎΠ± этом сообщит. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ссли ΠΏΡƒΠ»Π»-запрос оказался Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ измСнСния Π² Ρ‚Ρƒ ΠΆΠ΅ Π²Π΅Ρ‚ΠΊΡƒ ΠΈ Travis автоматичСски примСтся Π·Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ.

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ ΠΊ страницС своСго рСпозитория Π½Π° сайтС Travis ΠΈ ΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ΡΡŒ Ρ‚Π°ΠΌ. Π’ΡƒΡ‚ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ интСрСсного ΠΎ сборках. ВСроятно, Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ Π²Ρ‹ станСтС частым гостСм этой страницы, ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ стало ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Π½Π΅ΡƒΠ΄Π°Π²ΡˆΠ΅ΠΉΡΡ сборки.

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


Π‘Π±ΠΎΡ€ΠΊΠ° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ

Если ΠΆΠ΅ Π½Π° страницС Π½Π΅Ρ‚ Π½ΠΈ Π·Π΅Π»Ρ‘Π½Ρ‹Ρ…, Π½ΠΈ красных надписСй, ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ мСню More options ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΡƒΠ½ΠΊΡ‚ Requests. Если Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Ρ‚ΡƒΡ‚ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ красным Ρ†Π²Π΅Ρ‚ΠΎΠΌ β€” ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΈΡ…. Если Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ сообщСниС ΠΎΠ± ошибкС Build config file is required, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Travis Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ваш Ρ„Π°ΠΉΠ» .travis.yml. Π˜ΡΠΏΡ€Π°Π²ΡŒΡ‚Π΅ это ΠΈ ошибка исчСзнСт.

Travis отправляСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ элСктронныС письма Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° сборка ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° оказываСтся Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΉ, ΠΈ Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° это удаётся ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ.

ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ PR ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ ΠΈ Travis Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ процСсс сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ наш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ покрытия ΠΊΠΎΠ΄Π° тСстами.

Π¨Π°Π³ 8. ΠžΡ†Π΅Π½ΠΊΠ° покрытия ΠΊΠΎΠ΄Π° тСстами


ΠžΡ‚Ρ‡Ρ‘Ρ‚ ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΊΠΎΠ΄Π° тСстами позволяСт ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, какая Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΏΡƒΡΡ‚ΡŒ ΠΈ нСбольшая, протСстирована. Для создания ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΎΡ‚Ρ‡Ρ‘Ρ‚ΠΎΠ² ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ pytest-cov.

Π’ Ρ„Π°ΠΉΠ» requirements_dev.txt Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку:

pytest-cov==2.6.1

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:
pytest --cov=my_project_name

Π’ ΠΌΠΎΡ‘ΠΌ случаС, послС выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ pytest --cov=notebookc Π±Ρ‹Π» Π²Ρ‹Π²Π΅Π΄Π΅Π½ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΡ‚Ρ‡Ρ‘Ρ‚.
ΠžΡ‚Ρ‡Ρ‘Ρ‚ ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΊΠΎΠ΄Π° тСстами

Как оказалось, вСсь ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° обСспСчСн тСстами. Π’Π°ΠΊΠΈΡ… ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Π² Ρ‚ΠΎΠΌ случаС, Ссли вСсь ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ состоит ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… строк ΠΊΠΎΠ΄Π°.

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

Шаг 9. ИспользованиС Coveralls


ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ Coveralls позволяСт ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ историчСскиС свСдСния ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΊΠΎΠ΄Π° тСстами.
Coveralls

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ возмоТностями этого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π½ΡƒΠΆΠ½ΠΎ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° сайтС https://coveralls.io/, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄Π°Π½Π½Ρ‹Π΅ ΡƒΡ‡Ρ‘Ρ‚Π½ΠΎΠΉ записи GitHub. ΠŸΠΎΡ‚ΠΎΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ.

Π’ Ρ„Π°ΠΉΠ» requirements_dev.txt Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ строку coveralls==1.6.0. Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ», кстати, Π½Π° Π΄Π°Π½Π½ΠΎΠΌ этапС Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

pip==19.0.3
wheel==0.33.0
twine==1.13.0
pytest==4.3.0
pytest-cov==2.6.1
coveralls==1.6.0

ΠžΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ Ρ„Π°ΠΉΠ» .travis.yml, привСдя Π΅Π³ΠΎ ΠΊ Ρ‚Π°ΠΊΠΎΠΌΡƒ Π²ΠΈΠ΄Ρƒ (Π² вашСм случаС здСсь Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°):
dist: xenial
language: python
python: 3.7.2
install:
 Β β€” pip install -r requirements_dev.txt
 Β β€” pip install -e .

script:
 Β β€” pytest --cov=my_package_name
after_success:
 Β β€” coveralls

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Travis Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΎΠ½ установит Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, запустит тСсты ΠΈ создаст ΠΎΡ‚Ρ‡Ρ‘Ρ‚ ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΊΠΎΠ΄Π° тСстами. Π—Π°Ρ‚Π΅ΠΌ этот ΠΎΡ‚Ρ‡Ρ‘Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ Π½Π° сСрвис Coveralls.

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠΌΠΈΡ‚, ΠΎΡ‚ΠΏΡ€Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠ΄ Π² GitHub ΠΈ ΠΏΠΎΠ½Π°Π±Π»ΡŽΠ΄Π°ΠΉΡ‚Π΅ Π·Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ происходит. На Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Ρ‡Ρ‘Ρ‚ ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΊΠΎΠ΄Π° тСстами ΠΏΠΎΠΏΠ°Π» Π±Ρ‹ Π² Coveralls, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ нСсколько ΠΌΠΈΠ½ΡƒΡ‚.


ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΎΡ‚Ρ‡Ρ‘Ρ‚ ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΊΠΎΠ΄Π° тСстами

Π’Π΅ΠΏΠ΅Ρ€ΡŒ срСди ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ PR присутствуСт ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, выполняСмая срСдствами Coveralls.

На страницС Coveralls ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ тСстами Π½Π° 100%.


БвСдСния ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΊΠΎΠ΄Π° тСстами

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ оснастим наш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ инструмСнтом.

Π¨Π°Π³ 10. Π Π°Π±ΠΎΡ‚Π° с PyUp


БСрвис PyUp.io позволяСт Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ ΡƒΠ·Π½Π°Π²Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, устарСли Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈΠΌ зависимости, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎ Ρ‚ΠΎΠΌ, ΠΈΠΌΠ΅ΡŽΡ‚ Π»ΠΈ ΠΎΠ½ΠΈ уязвимости. Π­Ρ‚ΠΎΡ‚ сСрвис автоматичСски выполняСт ΠΏΡƒΠ»Π»-запросы, Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ Π½Π° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π½Π° GitHub. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ возмоТностями этого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π½ΡƒΠΆΠ½ΠΎ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, ΠΏΠΎΠ»ΡŒΠ·ΡƒΡΡΡŒ ΡƒΡ‡Ρ‘Ρ‚Π½ΠΎΠΉ записью GitHub, Π½Π° Π΅Π³ΠΎ сайтС β€” https://pyup.io/. ΠŸΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ рСпозитория рСкомСндуСтся ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ (Update Schedules) Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ every week. ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅, Ссли Ρƒ вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° мноТСство зависимостСй, Π²Ρ‹ Π½Π΅ ΡΡ‚ΠΎΠ»ΠΊΠ½Ρ‘Ρ‚Π΅ΡΡŒ со слишком большим количСством ΠΏΡƒΠ»Π»-запросов.
Настройка ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядят свСдСния ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ…, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… устарСли, Π½Π° сайтС PyUp.io.


БвСдСния ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ…

ΠŸΠΎΠ»ΡŒΠ·ΡƒΡΡΡŒ этим сСрвисом, Π²Ρ‹ всСгда Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° выходят свСТиС вСрсии ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π²Π°ΠΌΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ². Π—Π½Π°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ говорится, Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° ΠΏΠΎΠ±Π΅Π΄Ρ‹. А вторая ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° β€” это, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, автоматичСскиС ΠΏΡƒΠ»Π»-запросы Π½Π° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ зависимостСй.

Π˜Ρ‚ΠΎΠ³ΠΈ


Из этого ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Python-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚Π°ΠΊΠΈΠΌΠΈ срСдствами, ΠΊΠ°ΠΊ Black, pytest, Travis CI, Coveralls ΠΈ PyUp. Они ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ зависимости ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΈ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹. НадССмся, Π²Π°ΠΌ эти инструмСнты пригодятся.

Π£Π²Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ! Какими инструмСнтами Π²Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Python-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²?

Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ 30-ΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ ускорСниС Python-ΠΊΠΎΠ΄Π° / Π‘Π»ΠΎΠ³ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ RUVDS.com / Π₯Π°Π±Ρ€

Python β€” это язык, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π»ΡŽΠ±ΡΡ‚ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ программисты. Π­Ρ‚ΠΈΠΌ языком нСвСроятно Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ. Всё Π΄Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄, написанный Π½Π° Python, отличаСтся ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎΠΉ ΠΏΠΎΠ½ΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ. Однако Π² Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π°Ρ… ΠΎ Python часто ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Ρ‹ΡˆΠ°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΆΠ°Π»ΠΎΠ±Ρƒ Π½Π° этот язык. ОсобСнно Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΎ Python говорят Π·Π½Π°Ρ‚ΠΎΠΊΠΈ языка C. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΎΠ½Π° Π·Π²ΡƒΡ‡ΠΈΡ‚: Β«Python β€” это ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΒ». И Ρ‚Π΅, ΠΊΡ‚ΠΎ Ρ‚Π°ΠΊ говорят, Π½Π΅ Π³Ρ€Π΅ΡˆΠ°Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΈΠ² истины.

Π’ сравнСнии со ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ языками программирования Python β€” это, ΠΈ ΠΏΡ€Π°Π²Π΄Π°, ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. Π’ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ испытаний, Π² Ρ…ΠΎΠ΄Π΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… сопоставляСтся ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Ρ… языков программирования ΠΏΡ€ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡.

Π•ΡΡ‚ΡŒ нСсколько способов ускорСния Python-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, рассчитанныС Π½Π° использованиС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ядСр процСссора. Π’Π΅ΠΌ, ΠΊΡ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Numpy, Pandas ΠΈΠ»ΠΈ Scikit-Learn, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΎΠ²Π΅Ρ‚ΠΎΠ²Π°Ρ‚ΡŒ Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ комплСкс Rapids, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ GPU ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ Π½Π°ΡƒΡ‡Π½Ρ‹Ρ… расчётов.

ВсС эти ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΈ ускорСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΈ Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° Ρ€Π΅ΡˆΠ°Π΅ΠΌΡ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ распараллСлСны. НапримСр β€” это Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ.

Но ΠΊΠ°ΠΊ Π±Ρ‹Ρ‚ΡŒ Π² Ρ‚ΠΎΠΌ случаС, Ссли ваш ΠΊΠΎΠ΄ β€” это чистый Python? Π§Ρ‚ΠΎ Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ большой Ρ†ΠΈΠΊΠ» for, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π°ΠΌ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ просто нСльзя Ρ€Π°ΡΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΡ‚ΡŒ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π² Π½Ρ‘ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ? МоТно Π»ΠΈ ΠΊΠ°ΠΊ-Ρ‚ΠΎ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ сам Python?

ΠžΡ‚Π²Π΅Ρ‚ Π½Π° этот вопрос Π΄Π°Ρ‘Ρ‚ Cython β€” ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄, написанный Π½Π° Python.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Cython?


Cython, ΠΏΠΎ своСй сути, это ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ слой ΠΌΠ΅ΠΆΠ΄Ρƒ Python ΠΈ C/C++. Cython позволяСт ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Python-ΠΊΠΎΠ΄ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ модификациями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ транслируСтся Π² C-ΠΊΠΎΠ΄.

ЕдинствСнноС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Python-ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈ этом Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± Π΅Ρ‘ Ρ‚ΠΈΠΏΠ΅. ΠŸΡ€ΠΈ написании ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π½Π° Python ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ:

x = 0.5

ΠŸΡ€ΠΈ использовании Cython ΠΏΡ€ΠΈ объявлСнии ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΅Ρ‘ Ρ‚ΠΈΠΏ:
cdef float x = 0.5

Π­Ρ‚Π° конструкция сообщаСт Cython ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ пСрСмСнная прСдставляСт собой число с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ. По Ρ‚Π°ΠΊΠΎΠΌΡƒ ΠΆΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Π² C. ΠŸΡ€ΠΈ использовании ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Python Ρ‚ΠΈΠΏΡ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ динамичСски. Π―Π²Π½ΠΎΠ΅ объявлСниС Ρ‚ΠΈΠΏΠΎΠ², примСняСмоС Π² Cython β€” это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Python-ΠΊΠΎΠ΄Π° Π² C-ΠΊΠΎΠ΄. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² C Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ явноС объявлСниС Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

Установка Cython ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎ проста:

pip install cython

Π’ΠΈΠΏΡ‹ Π² Cython


ΠŸΡ€ΠΈ использовании Cython ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄Π²Π° Π½Π°Π±ΠΎΡ€Π° Ρ‚ΠΈΠΏΠΎΠ². Один β€” для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Если Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Ρ‘Ρ‚ ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ Ρ‚ΡƒΡ‚ Π½Π°ΠΌ доступны ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹:

  • cdef int a, b, c
  • cdef char *s
  • cdef float x = 0.5 (число ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ точности)
  • cdef double x = 63.4 (число Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ точности)
  • cdef list names
  • cdef dict goals_for_each_play
  • cdef object card_deck

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚ΡƒΡ‚, фактичСски, ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Ρ‚ΠΈΠΏΡ‹ C/C++!

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с функциями Π½Π°ΠΌ доступны ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹:

  • def β€” обычная Python-функция, вызываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· Python.
  • cdef β€” Cython-функция, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ нСльзя Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΈΠ· ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Python-ΠΊΠΎΠ΄Π°. Π’Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Cython-ΠΊΠΎΠ΄Π°.
  • cpdef β€” Ѐункция, доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈ ΠΈΠ· C, ΠΈ ΠΈΠ· Python.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Python, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π½ΡΡ‚ΡŒΡΡ ускорСниСм Python-ΠΊΠΎΠ΄Π°.

УскорСниС ΠΊΠΎΠ΄Π° с использованиСм Cython


Начнём с создания Python-Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ°. Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ†ΠΈΠΊΠ» for, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ выполняСтся вычислСниС Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π° числа. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π½Π° чистом Python Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:
def test(x):
Β Β Β Β y = 1
Β Β Β Β for i in range(1, x+1):
Β Β Β Β Β Β Β Β y *= i
Β Β Β Β return y

Cython-эквивалСнт этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° Π΅Ρ‘ исходный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² Ρ„Π°ΠΉΠ» с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .pyx. ЕдинствСнноС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½ΡƒΠΆΠ½ΠΎ внСсти Π² ΠΊΠΎΠ΄, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π² Π½Π΅Π³ΠΎ свСдСний ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:
cpdef int test(int x):
Β Β Β Β cdef int y = 1
Β Β Β Β cdef int i
Β Β Β Β for i in range(1, x+1):
Β Β Β Β Β Β Β Β y *= i
Β Β Β Β return y

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ стоит ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово cpdef. Π­Ρ‚ΠΎ позволяСт Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ· Python. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‚ΠΈΠΏ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ i, ΠΈΠ³Ρ€Π°ΡŽΡ‰Π΅ΠΉ Ρ€ΠΎΠ»ΡŒ счётчика Ρ†ΠΈΠΊΠ»Π°. НС Π±ΡƒΠ΄Π΅ΠΌ Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎ всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ компилятору C ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΈΠΏΡ‹ Π΅ΠΌΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ создадим Ρ„Π°ΠΉΠ» setup.py, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Cython-ΠΊΠΎΠ΄ Π² C-ΠΊΠΎΠ΄:

from distutils.core import setup
from Cython.Build import cythonize

setup(ext_modules = cythonize('run_cython.pyx'))

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ:
python setup.py build_ext --inplace

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π‘-ΠΊΠΎΠ΄ Π³ΠΎΡ‚ΠΎΠ² ΠΊ использованию.

Если Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² ΠΏΠ°ΠΏΠΊΡƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находится Cython-ΠΊΠΎΠ΄, Ρ‚Π°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ всС Ρ„Π°ΠΉΠ»Ρ‹, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для запуска C-ΠΊΠΎΠ΄Π°, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ„Π°ΠΉΠ» run_cython.c. Если Π²Π°ΠΌ интСрСсно β€” ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ этот Ρ„Π°ΠΉΠ» ΠΈ посмотритС Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ Π‘-ΠΊΠΎΠ΄ сгСнСрировал Cython.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ всё Π³ΠΎΡ‚ΠΎΠ²ΠΎ ΠΊ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ нашСго свСрхбыстрого C-ΠΊΠΎΠ΄Π°. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½ ΠΊΠΎΠ΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для тСстирования ΠΈ сравнСния Π΄Π²ΡƒΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

import run_python
import run_cython
import time

number = 10

start = time.time()
run_python.test(number)
end =Β  time.time()

py_time = end - start
print("Python time = {}".format(py_time))

start = time.time()
run_cython.test(number)
end =Β  time.time()

cy_time = end - start
print("Cython time = {}".format(cy_time))

print("Speedup = {}".format(py_time / cy_time))

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

ВзглянитС Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ. МоТно Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Cython-вСрсия ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ оказываСтся быстрСй Π΅Ρ‘ Python-вСрсии Π²ΠΎ всСх случаях. Π§Π΅ΠΌ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Π΅Π΅ Π·Π°Π΄Π°Ρ‡Π° β€” Ρ‚Π΅ΠΌ большС ΠΈ ускорСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄Π°Ρ‘Ρ‚ использованиС Cython.


Π˜Ρ‚ΠΎΠ³ΠΈ


ИспользованиС Cython позволяСт Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ практичСски любой ΠΊΠΎΠ΄, написанный Π½Π° Python, Π½Π΅ прилагая ΠΊ этому особСнных усилий. Π§Π΅ΠΌ большС Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ†ΠΈΠΊΠ»ΠΎΠ² ΠΈ Ρ‡Π΅ΠΌ большС Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ½Π° ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ β€” Ρ‚Π΅ΠΌ Π»ΡƒΡ‡ΡˆΠΈΡ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΆΠ΄Π°Ρ‚ΡŒ ΠΎΡ‚ примСнСния Cython.

Π£Π²Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ! Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ Cython Π² своих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…?

Бинтаксис языка Python | Python 3 для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… ΠΈ Ρ‡Π°ΠΉΠ½ΠΈΠΊΠΎΠ²

Бинтаксис языка Python, ΠΊΠ°ΠΊ ΠΈ сам язык, ΠΎΡ‡Π΅Π½ΡŒ прост.

Бинтаксис

  • ΠšΠΎΠ½Π΅Ρ† строки являСтся ΠΊΠΎΠ½Ρ†ΠΎΠΌ инструкции (Ρ‚ΠΎΡ‡ΠΊΠ° с запятой Π½Π΅ трСбуСтся).

  • Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ инструкции ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ Π² Π±Π»ΠΎΠΊΠΈ ΠΏΠΎ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π΅ отступов. ΠžΡ‚ΡΡ‚ΡƒΠΏ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹ΠΌ, Π³Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° отступ Π±Ρ‹Π» ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ². И ΠΏΡ€ΠΎ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° Π½Π΅ Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅. ΠžΡ‚ΡΡ‚ΡƒΠΏ Π² 1 ΠΏΡ€ΠΎΠ±Π΅Π», ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π½Π΅ Π»ΡƒΡ‡ΡˆΠ΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ 4 ΠΏΡ€ΠΎΠ±Π΅Π»Π° (ΠΈΠ»ΠΈ Π·Π½Π°ΠΊ табуляции, Π½Π° Ρ…ΡƒΠ΄ΠΎΠΉ ΠΊΠΎΠ½Π΅Ρ†).

  • Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ инструкции Π² Python Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² соотвСтствии с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ шаблоном, ΠΊΠΎΠ³Π΄Π° основная инструкция Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ΠΌ, вслСд Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ располагаСтся Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ с отступом ΠΏΠΎΠ΄ строкой основной инструкции.

    Основная инструкция:
        Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ инструкций

НСсколько ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… случаСв

  • Иногда Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ нСсколько инструкций Π² ΠΎΠ΄Π½ΠΎΠΉ строкС, раздСляя ΠΈΡ… Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ с запятой:

    a = 1; b = 2; print(a, b)

    Но Π½Π΅ Π΄Π΅Π»Π°ΠΉΡ‚Π΅ это слишком часто! ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅ ΠΎΠ± удобочитаСмости. А Π»ΡƒΡ‡ΡˆΠ΅ Π²ΠΎΠΎΠ±Ρ‰Π΅ Ρ‚Π°ΠΊ Π½Π΅ Π΄Π΅Π»Π°ΠΉΡ‚Π΅.

  • Допустимо Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… строках. Достаточно Π΅Π΅ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² ΠΏΠ°Ρ€Ρƒ ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ…, ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… ΠΈΠ»ΠΈ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобок:

    if (a == 1 and b == 2 and
        c == 3 and d == 4):  # НС Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ ΠΏΡ€ΠΎ Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅
          print('spam' * 3)
  • Π’Π΅Π»ΠΎ составной инструкции ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ строкС, Ρ‡Ρ‚ΠΎ ΠΈ Ρ‚Π΅Π»ΠΎ основной, Ссли Ρ‚Π΅Π»ΠΎ составной инструкции Π½Π΅ содСрТит составных инструкций. Ну я Π΄ΡƒΠΌΠ°ΡŽ, Π²Ρ‹ поняли :). Π”Π°Π²Π°ΠΉΡ‚Π΅ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ:

    if x > y: print(x)

ПолноС ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ синтаксиса, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ с ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ, поэтому я ΡΠΎΠ²Π΅Ρ‚ΡƒΡŽ Π²Π°ΠΌ Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² Ρ€ΡƒΠ±Ρ€ΠΈΠΊΡƒ «ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ».

Π’Π°ΠΊΠΆΠ΅ ΡΠΎΠ²Π΅Ρ‚ΡƒΡŽ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ PEP 8 β€” руководство ΠΏΠΎ написанию ΠΊΠΎΠ΄Π° Π½Π° Python ΠΈ Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π² Python. PEP 257.

Для вставки ΠΊΠΎΠ΄Π° Π½Π° Python Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΠΉΡ‚Π΅ Π΅Π³ΠΎ Π² Ρ‚Π΅Π³ΠΈ <pre><code>Π’Π°Ρˆ ΠΊΠΎΠ΄</code></pre>

Как ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ описаниС ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Python?

ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка
  1. Около
  2. Π’ΠΎΠ²Π°Ρ€Ρ‹
  3. Для ΠΊΠΎΠΌΠ°Π½Π΄
  1. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка ΠžΠ±Ρ‰Π΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ вопросы ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹
  2. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка для ΠΊΠΎΠΌΠ°Π½Π΄ Π“Π΄Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈ дСлятся частными знаниями с ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌΠΈ
  3. Вакансии ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ связанныС с Π½ΠΈΠΌ тСхничСскиС возмоТности ΠΊΠ°Ρ€ΡŒΠ΅Ρ€Π½ΠΎΠ³ΠΎ роста
  4. Π’Π°Π»Π°Π½Ρ‚ НанимайтС тСхничСских спСциалистов ΠΈ создавайтС свой Π±Ρ€Π΅Π½Π΄ работодатСля
  5. Π Π΅ΠΊΠ»Π°ΠΌΠ° ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³Π°ΠΌ со всСго ΠΌΠΈΡ€Π°
  6. О компании
.ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ руководство ΠΏΠΎ дСскриптору

— докумСнтация Python 3.8.5

Автор

Π Π°ΠΉΠΌΠΎΠ½Π΄ Π₯Π΅Ρ‚Ρ‚ΠΈΠ½Π³Π΅Ρ€

ΠšΠΎΠ½Ρ‚Π°ΠΊΡ‚

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

Π˜Π·ΡƒΡ‡Π΅Π½ΠΈΠ΅ дСскрипторов Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ обСспСчиваСт доступ ΠΊ Π±ΠΎΠ»ΡŒΡˆΠ΅ΠΌΡƒ Π½Π°Π±ΠΎΡ€Ρƒ инструмСнтов, Π½ΠΎ ΠΈ Π΄Π°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Python, ΠΈ ΠΏΡ€ΠΈΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π·Π° ΡΠ»Π΅Π³Π°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ Π΅Π³ΠΎ Π΄ΠΈΠ·Π°ΠΉΠ½Π°.

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, дСскриптор — это Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° с Β«ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ привязки», ΠΎΠ΄ΠΈΠ½ доступ ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±Ρ‹Π» ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ Π² дСскрипторС ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ». Π­Ρ‚ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹: __get __ () , __set __ () ΠΈ __ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ __ () . Если ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ· этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΎΠ½ называСтся дСскриптором.

ПовСдСниС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для доступа ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ — ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΈΠ· словаря ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. НапримСр, a.x ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΠΈΡΠΊΠΎΠ²ΡƒΡŽ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ начиная с a .__ dict __ ['x'] , Π·Π°Ρ‚Π΅ΠΌ type (a) .__ dict __ ['x'] ΠΈ продолТая Ρ‡Π΅Ρ€Π΅Π· Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы Ρ‚ΠΈΠΏΠ° (a) , ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ мСтаклассы. Если искомоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ — это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² дСскриптора, Π·Π°Ρ‚Π΅ΠΌ Python ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ вмСсто этого Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ дСскриптора.Π’ΠΎ, Π³Π΄Π΅ это происходит Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ², зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ дСскриптора Π±Ρ‹Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹.

ДСскрипторы — это ΠΌΠΎΡ‰Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния. Они ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π·Π° свойствами, ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, статичСскими ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ класса ΠΈ super () . Они ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² самом Python для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½ΠΎΠ²Ρ‹Ρ… классов стилСй. Π²Π²Π΅Π΄Π΅Π½ Π² вСрсии 2.2. ДСскрипторы ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ C-ΠΊΠΎΠ΄ ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Π³ΠΈΠ±ΠΊΠΈΠΉ Π½Π°Π±ΠΎΡ€ Π½ΠΎΠ²Ρ‹Ρ… инструмСнтов для повсСднСвных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π° Python.

описаниС__get __ (self, obj, type = None) -> Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

descr .__ set __ (self, obj, value) -> НСт

descr .__ delete __ (self, obj) -> НСт

Π’ΠΎΡ‚ ΠΈ всС. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ любой ΠΈΠ· этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ считаСтся дСскриптором ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈ поискС ΠΊΠ°ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚.

Если ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ опрСдСляСт __set __ () ΠΈΠ»ΠΈ __delete __ () , ΠΎΠ½ считаСтся дСскриптор Π΄Π°Π½Π½Ρ‹Ρ…. Π’Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ дСскрипторы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ __get __ () . дСскрипторы Π±Π΅Π· Π΄Π°Π½Π½Ρ‹Ρ… (ΠΎΠ½ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ примСнСния Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ).

ДСскрипторы Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π½Π΅-Π΄Π°Π½Π½Ρ‹Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ пСрСопрСдСлСния с ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ записСй Π² словарС экзСмпляра. Если ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ экзСмпляра ΠΈΠΌΠ΅Π΅Ρ‚ запись с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈ дСскриптор Π΄Π°Π½Π½Ρ‹Ρ…, дСскриптор Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚. Если Π² словарС экзСмпляра Π΅ΡΡ‚ΡŒ запись с Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ name ΠΊΠ°ΠΊ дСскриптор, Π½Π΅ связанный с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, словарная запись ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ дСскриптор Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΊΠ°ΠΊ __get __ (), ΠΈ __set __ () с __set __ () , Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ AttributeError , ΠΊΠΎΠ³Π΄Π° называСтся.ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° __set __ () с Π²ΠΎΠ·Π±ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ заполнитСля достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π³ΠΎ дСскриптором Π΄Π°Π½Π½Ρ‹Ρ….

ДСскриптор ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. НапримСр, d .__ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ __ (obj) .

Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹, дСскриптор ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ вызываСтся автоматичСски ΠΏΡ€ΠΈ доступС ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρƒ. НапримСр, obj.d ΠΈΡ‰Π΅Ρ‚ d Π² словарС. ΠΈΠ· obj . Если d опрСдСляСт ΠΌΠ΅Ρ‚ΠΎΠ΄ __get __ () , Ρ‚ΠΎ d.__get __ (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚) вызываСтся Π² соотвСтствии с ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°, пСрСчислСнными Π½ΠΈΠΆΠ΅.

Π”Π΅Ρ‚Π°Π»ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° зависят ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, являСтся Π»ΠΈ obj ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΈΠ»ΠΈ классом.

Для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ находится Π² object .__ getattribute __ () ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ b.x Π² Ρ‚ΠΈΠΏΠ° (b) .__ dict __ ['x'] .__ get __ (b, type (b)) . Π’ рСализация Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ², которая Π΄Π°Π΅Ρ‚ дСскрипторы Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π½Π°Π΄ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ экзСмпляра, ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… экзСмпляра Π½Π°Π΄ Π½Π΅ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ дСскрипторы ΠΈ Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚ самый Π½ΠΈΠ·ΠΊΠΈΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ __getattr __ () , Ссли ΠΎΠ½ прСдоставлСн.ΠŸΠΎΠ»Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ C ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² PyObject_GenericGetAttr () Π² ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ / object.c.

Для классов ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ относится ΠΊ Ρ‚ΠΈΠΏΡƒ .__ getattribute __ () , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ B.x Π² B .__ dict __ ['x'] .__ get __ (None, B) . На чистом Python это выглядит нравится:

 def __getattribute __ (self, key):
    "Π­ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ type_getattro () Π² Objects / typeobject.c"
    v = ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ .__ getattribute __ (сам, ΠΊΠ»ΡŽΡ‡)
    Ссли hasattr (v, '__get__'):
        return v .__ get __ (НСт, сам)
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ v
 

Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ:

ΠžΠ±ΡŠΠ΅ΠΊΡ‚, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ super () , Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ собствСнный __getattribute __ () ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Ρ‹Π·ΠΎΠ²Π° дСскрипторов.Поиск ΠΏΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρƒ super (B, obj) .m ΠΈΡ‰Π΅Ρ‚ obj .__ class __.__ mro__ для Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса A сразу послС B Π° Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ A .__ dict __ ['m'] .__ get __ (obj, B) . Если Π½Π΅ дСскриптор, ΠΌ. Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΎ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. Если Π½Π΅Ρ‚ Π² словарС, m возвращаСтся ΠΊ поиск с использованиСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° .__ getattribute __ () .

РСализация

.

Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Python


Ѐункция — это Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅.

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ функция ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅.


Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π’ Python функция опрСдСляСтся с использованиСм def ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово:

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

def my_function ():
print (Β«ΠŸΡ€ΠΈΠ²Π΅Ρ‚ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΒ»)


Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки:

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

def my_function ():
print (Β«ΠŸΡ€ΠΈΠ²Π΅Ρ‚ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΒ»)

my_function ()

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

АргумСнты

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹.

АргумСнты ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ послС ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобках. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ сколько ΡƒΠ³ΠΎΠ΄Π½ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², просто Ρ€Π°Π·Π΄Π΅Π»ΠΈΠ² ΠΈΡ… запятой.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΅ΡΡ‚ΡŒ функция с ΠΎΠ΄Π½ΠΈΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ (fname). Когда функция вызываСтся, ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ имя, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ:

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

def my_function ( fname ):
print (fname + «Refsnes»)

my_function ( «Emil» )
my_function ( «Tobias» )
my_function ( «Linus» )

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

АргумСнты часто ΡΠΎΠΊΡ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π΄ΠΎ args Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Python.



ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈΠ»ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹?

Π’Π΅Ρ€ΠΌΠΈΠ½Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅: ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, которая пСрСдаСтся Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ — это пСрСмСнная, указанная Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобках Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

АргумСнт — это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ отправляСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈ Π΅Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅.


ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ функция Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ с ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ количСством Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли ваша функция ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ 2 Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с 2 Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, Π½Π΅ большС ΠΈ Π½Π΅ мСньшС.

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

Π­Ρ‚Π° функция ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ 2 Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ 2 Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°:

def my_function (fname, lname):
print (fname + «» + lname)

my_function («Emil», «Refsnes»)

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉ сам » Если Π²Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с 1 ΠΈΠ»ΠΈ 3 Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ:

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

Π­Ρ‚Π° функция ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ 2 Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 1:

def my_function (fname, lname):
print (fname + «» + lname)

my_function («Emil»)

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

ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, * args

Если Π²Ρ‹ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅, сколько Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ вашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ * ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, функция ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ смоТСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ элСмСнтам соотвСтствСнно:

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

Если количСство Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² нСизвСстно, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° * :

def my_function (* kids):
print (Β«Π‘Π°ΠΌΡ‹ΠΉ младший Ρ€Π΅Π±Π΅Π½ΠΎΠΊ is «+ kids [2])

my_function (» Эмиль «,» Вобиас «,» Линус «)

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

ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ часто ΡΠΎΠΊΡ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π΄ΠΎ * args Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Python.


АргумСнты ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ с синтаксисом ΠΊΠ»ΡŽΡ‡ = Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ .

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, порядок Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния.

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

def my_function (child3, child2, child1):
print («Π‘Π°ΠΌΡ‹ΠΉ младший Ρ€Π΅Π±Π΅Π½ΠΎΠΊ is «+ child3»

my_function (child1 = «Emil», child2 = «Tobias», child3 = «Linus»)

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

Π€Ρ€Π°Π·Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова часто сокращаСтся Π΄ΠΎ kwargs Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Python.


АргумСнты ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова, ** kwargs

Если Π²Ρ‹ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅, сколько Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ вашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π΄Π²Π΅ Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠΈ: ** ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, функция ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ смоТСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ элСмСнтам соотвСтствСнно:

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

Если количСство Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова нСизвСстно, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ ** ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

def my_function (** kid):
print («Π•Π³ΠΎ фамилия» + kid [«lname»])

my_function (fname = «Tobias», lname = «Refsnes»)

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

ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Kword часто ΡΠΎΠΊΡ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π΄ΠΎ ** kwargs Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Python.


Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

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

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

def my_function ( country = «ΠΠΎΡ€Π²Π΅Π³ΠΈΡ» ):
print («Π― ΠΈΠ·» + страна)

my_function («ШвСция»)
my_function («Индия»)
my_function ()
my_function («Бразилия»)

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

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° списка Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π»ΡŽΠ±Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (строка, число, список, ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ ΠΈ Ρ‚. Π”.).), ΠΈ это Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

НапримСр, Ссли Π²Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ список Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΎΠ½ всС Ρ€Π°Π²Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ списком, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ достигаСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

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

def my_function (food):
для x в food:
print (x)

fruit = [«ΡΠ±Π»ΠΎΠΊΠΎ», «Π±Π°Π½Π°Π½», «Π²ΠΈΡˆΠ½Ρ»]

my_function (fruit)

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

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния

Π§Ρ‚ΠΎΠ±Ρ‹ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ выписка:

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

def my_function (x):
return 5 * x

print (my_function (3))
print (my_function (5))
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (моя_функция (9))

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

ΠŸΡ€ΠΎΠΏΡƒΡΠΊ ЗаявлСниС

ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ пустым, Π½ΠΎ Ссли ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π· содСрТимого, Π²Π²Π΅Π΄ΠΈΡ‚Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ pass , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ошибки.


РСкурсия

Python Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ опрСдСлСнная функция ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ сама сСбя.

РСкурсия — это общая матСматичСская ΠΈ программная концСпция. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ функция Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ сама сСбя. Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎ прСимущСство, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ для достиТСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.

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

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ tri_recursion () — это функция, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ для Π²Ρ‹Π·ΠΎΠ²Π° самой сСбя («рСкурсивная»). Π’ качСствС Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ k, которая ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π½Π° (-1) ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ выполняСм Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ. РСкурсия заканчиваСтся, ΠΊΠΎΠ³Π΄Π° условиС Π½Π΅ большС 0 (Ρ‚.Π΅. ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ Ρ€Π°Π²Π½ΠΎ 0).

Новому Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π»ΡƒΡ‡ΡˆΠΈΠΉ способ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ это — ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ.

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ рСкурсии

def tri_recursion (k):
Ссли (k> 0):
Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ = k + tri_recursion (k — 1)
print (Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚)
Π΅Ρ‰Π΅:
Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ = 0
Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

print («\ n \ nΠ Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рСкурсии»)
tri_recursion (6)

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

.

3. МодСль Π΄Π°Π½Π½Ρ‹Ρ… — докумСнтация Python 3.8.5

3.1. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, значСния ΠΈ Ρ‚ΠΈΠΏΡ‹

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ — это абстракция Π΄Π°Π½Π½Ρ‹Ρ… Python. ВсС Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Python прСдставлСн ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΈΠ»ΠΈ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. (Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ смыслС ΠΈ Π² соотвСтствиС ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ„ΠΎΠ½ НСймана Β«ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ с Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉΒ», ΠΊΠΎΠ΄ Ρ‚Π°ΠΊΠΆΠ΅ прСдставлСны ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ.)

Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΅ΡΡ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, Ρ‚ΠΈΠΏ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½ΠΈΠΊΠΎΠ³Π΄Π° измСняСтся послС создания; Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎΠ± этом ΠΊΠ°ΠΊ ΠΎΠ± адрСсС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² объСм памяти.ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Β« is Β» сравниваСт ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ Π΄Π²ΡƒΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²; Π² id () Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ†Π΅Π»ΠΎΠ΅ число, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ Π΅Π³ΠΎ Π»ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ.

Π”Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ CPython: Для CPython id (x) — это адрСс памяти, Π³Π΄Π΅ хранится x .

Π’ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° опрСдСляСт ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, «выполняСт ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π»ΠΈΠ½Ρƒ? Β»), Π° Ρ‚Π°ΠΊΠΆΠ΅ опрСдСляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ значСния для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² этого Ρ‚ΠΈΠΏ. Ѐункция type () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ сам).Как ΠΈ Π΅Π³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π΅Π½.

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

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

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

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ использованиС срСдств трассировки ΠΈΠ»ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π² ΠΆΠΈΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π’Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ловля ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ Β« ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ … ΠΊΡ€ΠΎΠΌΠ΅ Β» ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΆΠΈΠ²Ρ‹Π΅.

НСкоторыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ содСрТат ссылки Π½Π° «внСшниС» рСсурсы, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ»ΠΈ ΠΎΠΊΠ½Π°. ΠŸΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ эти рСсурсы ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ сборщиком мусора, Π½ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сборка мусора Π½Π΅ гарантируСтся, Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ явный способ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ внСшний рСсурс, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ close () .ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ рСкомСндуСтся явно Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. ЗаявлСниС Β« ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ … , Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Β» ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Β« с Β» ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ способы ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это.

НСкоторыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ содСрТат ссылки Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹; ΠΎΠ½ΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ . ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ²: ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ, списки ΠΈ словари. Бсылки Ρ‡Π°ΡΡ‚ΡŒ стоимости ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ стоимости ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, ΠΌΡ‹ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅ΠΌ значСния, Π° Π½Π΅ идСнтичности содСрТащихся Π² Π½Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²; ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎΠ± измСнчивости ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ тоТдСства ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΡŽΡ‚ΡΡ нСпосрСдствСнно содСрТащиСся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.Π˜Ρ‚Π°ΠΊ, Ссли нСизмСняСмый ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ (ΠΊΠ°ΠΊ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ) содСрТит ссылку Π½Π° измСняСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ измСняСтся, Ссли этот измСняСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½.

Π’ΠΈΠΏΡ‹ Π²Π»ΠΈΡΡŽΡ‚ практичСски Π½Π° всС аспСкты повСдСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π”Π°ΠΆΠ΅ Π²Π°ΠΆΠ½ΠΎΡΡ‚ΡŒ Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ смыслС затрагиваСтся ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°: для нСизмСняСмых Ρ‚ΠΈΠΏΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, вычислСниС Π½ΠΎΠ²Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ фактичСски Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ссылку Π½Π° любой ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ‚ΠΈΠΏ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° для измСняСмых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² это Π½Π΅ допускаСтся. НапримСр., послС a = 1; b = 1 , a ΠΈ b ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ»ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒΡΡ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ΄ΠΈΠ½, Π² зависимости ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π½ΠΎ послС c = []; d = [] , c ΠΈ d Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ относятся ΠΊ Π΄Π²ΡƒΠΌ Ρ€Π°Π·Π½Ρ‹ΠΌ, ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ, Π½ΠΎΠ²Ρ‹ΠΌ создал пустыС списки.(ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ c = d = [] Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΠ±ΠΎΠΈΠΌ c ΠΈ d .)

3.2. Бтандартная иСрархия Ρ‚ΠΈΠΏΠΎΠ²

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

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

НСт

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

NotImplemented

Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ ΠΈΠΌΠ΅Π΅Ρ‚ СдинствСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ СдинствСнный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с этим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. это Доступ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· встроСнноС имя NotImplemented . ЧисловыС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ³ΠΎ сравнСния Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли ΠΎΠ½ΠΈ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ опСрация для прСдоставлСнных ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ². (Π—Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚ отраТСнная опСрация ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΡ‚ΠΊΠ°Ρ‚, Π² зависимости ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°.) Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ истины Π²Π΅Ρ€Π½ΠΎ.

Π‘ΠΌ. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π‘ΠΎΠ»ΡŒΡˆΠ΅ подробностСй.

Ellipsis

Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ СдинствСнный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с этим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. это Доступ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· Π»ΠΈΡ‚Π΅Ρ€Π°Π» ... ΠΈΠ»ΠΈ встроСнноС имя Эллипсис . Π•Π³ΠΎ ΠΈΡΡ‚ΠΈΠ½Π½ΠΎΡΡ‚ΡŒ истинна.

чисСл.НомСр

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

Python Ρ€Π°Π·Π»ΠΈΡ‡Π°Π΅Ρ‚ Ρ†Π΅Π»Ρ‹Π΅ числа, числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой ΠΈ комплСксныС числа. Π½ΠΎΠΌΠ΅Ρ€Π°:

числа. Π˜Π½Ρ‚Π΅Π³Ρ€Π°Π»

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой элСмСнты матСматичСского Π½Π°Π±ΠΎΡ€Π° Ρ†Π΅Π»Ρ‹Ρ… чисСл (ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ).

Π•ΡΡ‚ΡŒ Π΄Π²Π° Ρ‚ΠΈΠΏΠ° Ρ†Π΅Π»Ρ‹Ρ… чисСл:

Π¦Π΅Π»Ρ‹Π΅ числа ( int )

Π­Ρ‚ΠΎ числа Π² Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅, Π² зависимости ΠΎΡ‚ наличия (Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ) Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ°ΠΌΡΡ‚ΡŒ.Для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ сдвига ΠΈ маски Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ прСдполагаСтся прСдставлСниС, Π° ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ числа прСдставлСны Π² Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎ 2, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ создаСт иллюзию бСсконСчной строки Π·Π½Π°ΠΊΠΎΠ²Ρ‹Ρ… Π±ΠΈΡ‚ΠΎΠ² простираСтся Π²Π»Π΅Π²ΠΎ.

Booleans ( bool )

Они ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ истинныС значСния False ΠΈ True. Π”Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ значСния False ΠΈ True — СдинствСнныС логичСскиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. ЛогичСский Ρ‚ΠΈΠΏ — это ΠΏΠΎΠ΄Ρ‚ΠΈΠΏ цСлочислСнного Ρ‚ΠΈΠΏΠ°, Π° логичСскиС значСния Π²Π΅Π΄ΡƒΡ‚ сСбя ΠΊΠ°ΠΊ значСния 0 ΠΈ 1, соотвСтствСнно, ΠΏΠΎΡ‡Ρ‚ΠΈ Π²ΠΎ всСх контСкстах, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ Π² строка, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ строки Β«Π›ΠΎΠΆΡŒΒ» ΠΈΠ»ΠΈ Β«Π˜ΡΡ‚ΠΈΠ½Π°Β» соотвСтствСнно.

ΠŸΡ€Π°Π²ΠΈΠ»Π° для цСлочислСнного прСдставлСния ΠΏΡ€ΠΈΠ·Π²Π°Π½Ρ‹ Π΄Π°Ρ‚ΡŒ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π·Π½Π°Ρ‡ΠΈΠΌΠΎΠ΅ интСрпрСтация ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ сдвига ΠΈ маски с использованиСм ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ†Π΅Π»Ρ‹Ρ… чисСл.

числа. Π Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ ( с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой )

Они ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ точности машинного уровня. Π’Ρ‹ Π²ΠΎ власти Π±Π°Π·ΠΎΠ²ΠΎΠΉ машинной Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ (ΠΈ C ΠΈΠ»ΠΈ Java рСализация) для допустимого Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° пСрСполнСния. Python Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ точности; экономия процСссора ΠΈ использованиС памяти, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ являСтся ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ ΠΈΡ… использования, затмСваСтся Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы Π½Π° использованиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Python, поэтому Π½Π΅Ρ‚ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ ΡƒΡΠ»ΠΎΠΆΠ½ΡΡ‚ΡŒ язык с двумя Π²ΠΈΠ΄Π°ΠΌΠΈ чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой.

числа. ΠšΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ½Ρ‹ΠΉ ( слоТный )

Они ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ комплСксныС числа ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Ρƒ машинного уровня Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ точности числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой. ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Ρ‚Π΅ ΠΆΠ΅ прСдостСрСТСния, Ρ‡Ρ‚ΠΎ ΠΈ для чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΈ мнимая части комплСксного числа z ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния z.real ΠΈ z.imag .

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ

Они ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ упорядочСнныС мноТСства, индСксированныС Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ числами.Π’ встроСнная функция

.