Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² Python: ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΈ ΠΏΠΎΠ»ΡŽΠ±ΠΈΡ‚ΡŒ

Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² Python β€” полСзная Π²Π΅Ρ‰ΡŒ, Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΈ Π΅Ρ‘ Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΈ обходят стороной. ОбъясняСм, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΈΠ· сСбя ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΈ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚.

ОблоТка: Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² Python: ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΈ ΠΏΠΎΠ»ΡŽΠ±ΠΈΡ‚ΡŒ

Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ β€” ΠΎΠ΄ΠΈΠ½ ΠΈΠ· самых ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… инструмСнтов Π² Python, ΠΎΠ΄Π½Π°ΠΊΠΎ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°ΠΌ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ нСпонятными. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ ΡƒΠΆΠ΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Π»ΠΈΡΡŒ с Π½ΠΈΠΌΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Flask, Π½ΠΎ Π½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΈ особо Π²Π½ΠΈΠΊΠ°Ρ‚ΡŒ Π² ΡΡƒΡ‚ΡŒ ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Π΅ΠΌ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€?

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

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

Как Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

ВсС ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π΅ Ρ‚Π°ΠΊ Π»ΠΈ? НС Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΡΡ‚ΠΎΠ»ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹ Π² этом. Π£ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Python Π΅ΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ аспСкты, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΡ‹ нСчасто ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ, ΠΈ, ΠΊΠ°ΠΊ слСдствиС, ΠΎΠ½ΠΈ Π·Π°Π±Ρ‹Π²Π°ΡŽΡ‚ΡΡ. Π”Π°Π²Π°ΠΉΡ‚Π΅ проясним, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ прСдставлСны Π² Python.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹

Π‘ этим аспСктом Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΡ‹ Π·Π½Π°ΠΊΠΎΠΌΡ‹ Π»ΡƒΡ‡ΡˆΠ΅ всСго. ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° β€” это имСнованная ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… шагов. Π›ΡŽΠ±ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π² любом мСстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π² Ρ‚ΠΎΠΌ числС Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ самой сСбя. По этой части большС Π½Π΅Ρ‡Π΅Π³ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, поэтому ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ аспСкту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Python.

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

Π’ Python всё являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ создаётС ΠΈΠ· классов. Π’ этом смыслС ΠΎΠ½ (Python) ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ соотвСтствуСт идСям ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π² Python всё это β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹:

  • числа;
  • строки;
  • классы (Π΄Π°, Π΄Π°ΠΆΠ΅ классы!);
  • Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ нас интСрСсуСт).

Π’ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ всё являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°ΠΌΠΈ мноТСство возмоТностСй. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡ… Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. МоТно Π΄Π°ΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Π˜Π½Ρ‹ΠΌΠΈ словами, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса. Из опрСдСлСния Π² Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ:

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

И Ρ‚ΡƒΡ‚ Π² Π΄Π΅Π»ΠΎ вступаСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π° вмСстС с Π½ΠΈΠΌ β€” Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠΈΡ… порядков

Π’ Python ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… языков Π²Ρ€ΠΎΠ΄Π΅ Haskell ΠΈ OCaml. ΠŸΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΠΌ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ языка ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Ρ‘ΠΌ ΠΊ Π΄Π²ΡƒΠΌ Π΅Π³ΠΎ характСристикам, свойствСнным Python:

  • Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса;
  • ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, язык ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠΈΡ… порядков.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ присущи ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ свойства Π²Ρ€ΠΎΠ΄Π΅ отсутствия ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов, Π½ΠΎ ΠΌΡ‹ здСсь Π½Π΅ Π·Π° этим. Π›ΡƒΡ‡ΡˆΠ΅ сконцСнтрируСмся Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ β€” функциях Π²Ρ‹ΡΡˆΠΈΡ… порядков. Π§Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ функция Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка? Π‘Π½ΠΎΠ²Π° обратимся ΠΊ Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ:

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

Если Π²Ρ‹ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с основами Π²Ρ‹ΡΡˆΠ΅ΠΉ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΈ, Ρ‚ΠΎ Π²Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ матСматичСскиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠΈΡ… порядков порядка Π²Ρ€ΠΎΠ΄Π΅ Π΄ΠΈΡ„Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° d/dx. Он ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡƒΡŽ ΠΎΡ‚ исходной. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠΈΡ… порядков Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ β€” ΠΎΠ½ΠΈ Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ(ΠΈ) Π½Π° Π²Ρ…ΠΎΠ΄Π΅ ΠΈ/ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ(ΠΈ).

ΠŸΠ°Ρ€Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ²

Π Π°Π· ΡƒΠΆ ΠΌΡ‹ ознакомились со всСми аспСктами Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Python, Π΄Π°Π²Π°ΠΉΡ‚Π΅ продСмонстрируСм ΠΈΡ… Π² ΠΊΠΎΠ΄Π΅:

			def hello_world():
    print('Hello world!')
		

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Из Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π° Π΄Π°Π»Π΅Π΅ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ эта функция, ΠΊΠ°ΠΊ ΠΈ классы с числами, являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Π² Python:

			>>> def hello_world():
...     print('Hello world!')
...
>>> type(hello_world)
<class 'function'>
>>> class Hello:
...     pass
...
>>> type(Hello)
<class 'type'>
>>> type(10)
<class 'int'>
		

Как Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ, функция hello_worldΒ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Ρ‚ΠΈΠΏΡƒ <class 'function'>. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ класса function. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ классу type. ΠžΡ‚ этого всСго Π³ΠΎΠ»ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΉΡ‚ΠΈ ΠΊΡ€ΡƒΠ³ΠΎΠΌ, Π½ΠΎ Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠΈΠ³Ρ€Π°Π²ΡˆΠΈΡΡŒ с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ type Π²Ρ‹ со всСм Ρ€Π°Π·Π±Π΅Ρ€Ρ‘Ρ‚Π΅ΡΡŒ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ класса.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…:

			>>> hello = hello_world
>>> hello()
Hello world!
		

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

			>>> def wrapper_function():
...     def hello_world():
...         print('Hello world!')
...     hello_world()
...
>>> wrapper_function()
Hello world!
		

ΠŸΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΈΡ… ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

			>>> def higher_order(func):
...     print('ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π° функция {} Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°'.format(func))
...     func()
...     return func
...
>>> higher_order(hello_world)
ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π° функция <function hello_world at 0x032C7FA8> Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°
Hello world!
<function hello_world at 0x032C7FA8>
		

Из этих ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΡ‚Π°Ρ‚ΡŒ понятно, насколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python Π³ΠΈΠ±ΠΊΠΈΠ΅. Π‘ ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ этого ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΠΎΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΡŽ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ².

Как Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹

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

Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ β€” это функция, которая позволяСт ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π΅Ρ‘ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±Π΅Π· нСпосрСдствСнного измСнСния Π΅Ρ‘ ΠΊΠΎΠ΄Π°.

Π Π°Π· ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠΈΡ… порядков, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹. Π‘Π½Π°Ρ‡Π°Π»Π° посмотрим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π°:

			def decorator_function(func):
    def wrapper():
        print('Ѐункция-ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠ°!')
        print('ΠžΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌΠ°Ρ функция: {}'.format(func))
        print('ВыполняСм ΠΎΠ±Ρ‘Ρ€Π½ΡƒΡ‚ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ...')
        func()
        print('Π’Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ· ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ')
    return wrapper
		

Π—Π΄Π΅ΡΡŒ decorator_function() являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ-Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ. Как Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, ΠΎΠ½Π° являСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π’Π½ΡƒΡ‚Ρ€ΠΈ decorator_function() ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΡƒ, Ρ‚Π°ΠΊ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, которая ΠΎΠ±Ρ‘Ρ€Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΈ Π·Π°Ρ‚Π΅ΠΌ измСняСт Π΅Ρ‘ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ эту ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΡƒ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ посмотрим Π½Π° Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ Π² дСйствии:

			>>> @decorator_function
... def hello_world():
...     print('Hello world!')
...
>>> hello_world()
ΠžΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌΠ°Ρ функция: <function hello_world at 0x032B26A8>
ВыполняСм ΠΎΠ±Ρ‘Ρ€Π½ΡƒΡ‚ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ...
Hello world!
Π’Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ· ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ
		

Магия, Π½Π΅ ΠΈΠ½Π°Ρ‡Π΅! ΠŸΡ€ΠΎΡΡ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ² @decorator_function ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ hello_world(), ΠΌΡ‹ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π΅Ρ‘ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. Однако ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΠΆΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с @ являСтся всСго лишь синтаксичСским сахаром для hello_world = decorator_function(hello_world).

Π˜Π½Ρ‹ΠΌΠΈ словами, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ @decorator_function Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ decorator_function() с hello_world Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ присваиваСт ΠΈΠΌΠ΅Π½ΠΈ hello_world Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

И хотя этот Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ ΠΌΠΎΠ³ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π²Π°Ρƒ-эффСкт, ΠΎΠ½ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ. Π”Π°Π²Π°ΠΉΡ‚Π΅ взглянСм Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅, Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ (Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅):

			def benchmark(func):
    import time
    
    def wrapper():
        start = time.time()
        func()
        end = time.time()
        print('[*] ВрСмя выполнСния: {} сСкунд.'.format(end-start))
    return wrapper

@benchmark
def fetch_webpage():
    import requests
    webpage = requests.get('https://google.com')

fetch_webpage()
		

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ создаём Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€, Π·Π°ΠΌΠ΅Ρ€ΡΡŽΡ‰ΠΈΠΉ врСмя выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΅Π³ΠΎ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая Π΄Π΅Π»Π°Π΅Ρ‚ GET-запрос ΠΊ Π³Π»Π°Π²Π½ΠΎΠΉ страницС Google. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ, ΠΌΡ‹ сначала сохраняСм врСмя ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±Ρ‘Ρ€Π½ΡƒΡ‚ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, выполняСм Π΅Ρ‘, снова сохраняСм Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π΅ΠΌ ΠΈΠ· Π½Π΅Π³ΠΎ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅.

ПослС выполнСния ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

			[*] ВрСмя выполнСния: 1.4475083351135254 сСкунд.
		

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

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ значСния

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π»ΠΈ ΠΈ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»ΠΈ. ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ наш Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния:

			def benchmark(func):
    import time
    
    def wrapper(*args, **kwargs):
        start = time.time()
        return_value = func(*args, **kwargs)
        end = time.time()
        print('[*] ВрСмя выполнСния: {} сСкунд.'.format(end-start))
        return return_value
    return wrapper

@benchmark
def fetch_webpage(url):
    import requests
    webpage = requests.get(url)
    return webpage.text

webpage = fetch_webpage('https://google.com')
print(webpage)
		

Π’Ρ‹Π²ΠΎΠ΄ послС выполнСния:

			[*] ВрСмя выполнСния: 1.4475083351135254 сСкунд.
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage"........
		

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

Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

			def benchmark(iters):
    def actual_decorator(func):
        import time
        
        def wrapper(*args, **kwargs):
            total = 0
            for i in range(iters):
                start = time.time()
                return_value = func(*args, **kwargs)
                end = time.time()
                total = total + (end-start)
            print('[*] Π‘Ρ€Π΅Π΄Π½Π΅Π΅ врСмя выполнСния: {} сСкунд.'.format(total/iters))
            return return_value

        return wrapper
    return actual_decorator


@benchmark(iters=10)
def fetch_webpage(url):
    import requests
    webpage = requests.get(url)
    return webpage.text

webpage = fetch_webpage('https://google.com')
print(webpage)
		

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ наш старый Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ выполнял Π΄Π΅ΠΊΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ iters Ρ€Π°Π·, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠ» срСднСС врСмя выполнСния. Однако Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ этого, ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈΡ€ΠΎΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Python.

Ѐункция benchmark() Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ, Π½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ Ρ‚Π°ΠΊΠΎΠ²Ρ‹ΠΌ Π½Π΅ являСтся. Π­Ρ‚ΠΎ обычная функция, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ iters, Π° Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€. Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΎΠ½ Π΄Π΅ΠΊΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ fetch_webpage(). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ использовали Π½Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ @benchmark, Π° @benchmark(iters=10) β€” это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚ΡƒΡ‚ вызываСтся функция benchmark() (функция со скобками послС Π½Π΅Ρ‘ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ), послС Ρ‡Π΅Π³ΠΎ ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ сам Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€.

Π”Π°, это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ слоТно ΡƒΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² Π³ΠΎΠ»ΠΎΠ²Π΅, поэтому Π΄Π΅Ρ€ΠΆΠΈΡ‚Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ:

Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ benchmark() Π½Π΅ удовлСтворяСт этому ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½Π° Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ функция actual_decorator(), которая возвращаСтся benchmark(), являСтся Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹-Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹

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

			from collections import deque

class Memoized:
    def __init__(self, cache_size=100):
        self.cache_size = cache_size
        self.call_args_queue = deque()
        self.call_args_to_result = {}

    def __call__(self, fn):
        def new_func(*args, **kwargs):
            memoization_key = self._convert_call_arguments_to_hash(args, kwargs)
            if memoization_key not in self.call_args_to_result:
                result = fn(*args, **kwargs)
                self._update_cache_key_with_value(memoization_key, result)
                self._evict_cache_if_necessary()
            return self.call_args_to_result[memoization_key]
        return new_func

    def _update_cache_key_with_value(self, key, value):
        self.call_args_to_result[key] = value
        self.call_args_queue.append(key)

    def _evict_cache_if_necessary(self):
        if len(self.call_args_queue) > self.cache_size:
            oldest_key = self.call_args_queue.popleft()
            del self.call_args_to_result[oldest_key]

    @staticmethod
    def _convert_call_arguments_to_hash(args, kwargs):
        return hash(str(args) + str(kwargs))


@Memoized(cache_size=5)
def get_not_so_random_number_with_max(max_value):
    import random
    return random.random() * max_value
		

Π‘Π°ΠΌΠΎ собой, этот Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ Π½ΡƒΠΆΠ΅Π½ Π² основном Π² дСмонстрационных цСлях, Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ для ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ стоит ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ functools.lru_cache.

P.S.

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

  • Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ функциями, это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ любой Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.
  • Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ Π½Π΅ обязаны Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ. Но ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ Π²Π΅Ρ€Π½ΡƒΠ» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°, Ρ‡Ρ‚ΠΎ ΠΈ Π΄Π΅ΠΊΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:>>> def decorator(func):... return 'sumit'...>>> @decorator... def hello_world():... print('hello world')...>>> hello_world'sumit'
  • Π’Π°ΠΊΠΆΠ΅ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π—Π΄Π΅ΡΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ± этом ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅.
  • ΠΠ΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π°Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠΉ Π΄ΠΎ написания Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ссли Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ каТутся Π²Π°ΠΌ бСсполСзными, посмотритС Π½Π° Π½ΠΈΡ… с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π₯ΠΎΡ€ΠΎΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ являСтся Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ прСдставлСния Π² Flask.
  • Π’Π°ΠΊΠΆΠ΅ стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° functools.wraps() β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΄Π΅ΠΊΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠΎΡ…ΠΎΠΆΠ΅ΠΉ Π½Π° ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ, дСлая Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠ°ΠΊ сохранСниС doctstring исходной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

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

НадССмся, эта ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠΌΠΎΠ³Π»Π° Π²Π°ΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ, какая «магия» Π»Π΅ΠΆΠΈΡ‚ Π² основС Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ².

Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ