Π―Π΄ΡΠΎ ΠΏΠ»Π°Π½Π΅ΡΡ Python
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΏΠΎΠΊΠ° ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π» Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΡΠ°ΡΡΡΠ΅ ΡΠ΅ΡΠ½ΠΎΠ²ΠΈΠΊΠ°. Π§Π΅ΠΌ Π΄Π°Π»ΡΡΠ΅ Π²Ρ ΠΏΡΠΎΠ΄Π²ΠΈΠ½Π΅ΡΠ΅ΡΡ Π²Π³Π»ΡΠ±Ρ ΡΠ΅ΠΊΡΡΠ°, ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ΡΠ²ΡΠ·ΠΎΠΊ, ΠΊΠΎΡΠ½ΠΎΡΠ·ΡΡΠΈΡ ΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ Π²Ρ ΡΠ°ΠΌ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅, Π° Π³Π΄Π΅-ΡΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π² ΡΠ°ΠΉΠΎΠ½Π΅ ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Ρ ΡΡΠ°ΡΡΠΈ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠΏΠ°Π΄ΡΡΠ΅ Π² ΠΎΠ±Π»Π°ΡΡΡ ΡΠ°Π·ΡΠΎΠ·Π½Π΅Π½Π½ΡΡ Π·Π°ΠΌΠ΅ΡΠΎΠΊ, Π½Π΅Π²Π½ΡΡΠ½ΡΡ ΠΏΠΎΡΠ΅ΡΠΊΡΡΠ΅ΠΊ ΠΈ ΠΏΡΠΎΠ³ΠΎΠ»ΠΎΠ²ΡΡ Π²ΠΎΠΈΠ½ΠΎΠ², Π²ΠΎΡΡΡΠΈΡ Ρ Π΄ΡΠ°ΠΊΠΎΠ½Π°ΠΌΠΈ. ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, Π½Π΅ ΡΡΠ΄ΠΈΡΠ΅ ΡΡΡΠΎΠ³ΠΎ, ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π» Ρ ΠΎΡΡ ΠΈ Π½Π΅Π±ΡΡΡΡΠΎ, Π½ΠΎ ΡΠΏΠΎΡΠ½ΠΎ ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΡΠ΅ΡΡΡ, ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π΄ΡΠ΅ΠΉΡΡΡ Π² ΡΡΠΎΡΠΎΠ½Ρ Π±ΠΎΠ»ΡΡΠ΅ΠΉ ΡΠΈΡΠ°Π΅ΠΌΠΎΡΡΠΈ.
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΠΎΠ±ΡΡΠΉ Π΄Π΅Π½Ρ! ΠΠ΅Π½Ρ Π·ΠΎΠ²ΡΡ ΠΠΈΡ Π°ΠΈΠ» ΠΠΌΠ΅Π»ΡΡΠ½ΠΎΠ², ΠΏΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΈΠΈ Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, Π° ΡΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΡΡ ΠΏΠ°ΠΌΡΡΠΊΡ ΠΏΠΎ Π±Π°Π·ΠΎΠ²ΡΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌ ΡΠ·ΡΠΊΠ° Python ΠΌΠ΅Π½Ρ ΡΠΏΠΎΠ΄Π²ΠΈΠ³ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΉ, Π½Π° ΠΌΠΎΠΉ Π²Π·Π³Π»ΡΠ΄, ΡΠ°Π·ΡΡΠ² ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΡΠ΅ΠΌΡΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΌΠ°ΠΌΠΈ Π²ΡΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΠΊΡΡΡΠΎΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡΠΌΠΈ ΡΠ΅Π°Π»ΡΠ½ΡΡ , Π΄Π°ΠΆΠ΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠΊΡΠΎΠΌΠ½ΠΎΠΎΠΏΠ»Π°ΡΠΈΠ²Π°Π΅ΡΡ Π²Π°ΠΊΠ°Π½ΡΠΈΠΉ.
ΠΠΎΠ»ΡΠ·ΡΡΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠΌΠΈ ΠΈΠ· ΠΈΠ³ΡΠΎΠ²ΠΎΠ³ΠΎ ΠΌΠΈΡΠ°, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡ Π·Π°ΡΠ°ΡΡΡΡ ΡΡΠΎΠΈΡ Π½Π° Π±Π΅ΡΠ΅Π³Ρ ΠΎΠ·Π΅ΡΠ° ΠΊΠΈΠΏΡΡΠ΅ΠΉ Π»Π°Π²Ρ, Π² ΡΠ΅Π½ΡΡΠ΅ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΎΡΡΡΠΎΠ² ΡΠΎ ΡΡΠΎΠ»Ρ Π²ΠΎΠΆΠ΄Π΅Π»Π΅Π½Π½ΡΠΌΠΈ Π²Π°ΠΊΠ°Π½ΡΠΈΡΠΌΠΈ, Π° ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠ΅ ΠΎΡΡΡΠΎΠ²ΠΊΠΈ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΡΠΌ Π½Π°Π΄ΠΎ ΠΏΠ΅ΡΠ΅ΠΏΡΡΠ³ΠΈΠ²Π°ΡΡ, ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ Π½Π°ΡΠ°ΡΠΈΠ²Π°Ρ ΡΠ²ΠΎΠΈ Π½Π°Π²ΡΠΊΠΈ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΌΠΈΠ½ΠΈ-ΠΊΠ²Π΅ΡΡΠ°Ρ , Π»ΠΈΠ±ΠΎ ΠΎΡΡΡΡΡΡΠ²ΡΡΡ, Π»ΠΈΠ±ΠΎ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Ρ Π½Π΅ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎ ΠΈ Ρ Π°ΠΎΡΠΈΡΠ½ΠΎ, Π»ΠΈΠ±ΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠΎΠ²Π½Π°Ρ ΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΎΠ±ΡΡΠ²Π°Π΅ΡΡΡ, ΡΠ°ΠΊ ΠΈ Π½Π΅ ΡΡΠΏΠ΅Π² ΠΏΠΎΠΌΠΎΡΡ ΠΎΡΠΎΠΉΡΠΈ ΡΠΊΠΎΠ»ΡΠΊΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π΄Π°Π»Π΅ΠΊΠΎ ΠΎΡ Π±Π΅ΡΠ΅Π³Π°. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΠΏΠΎΡΡΡΠΎΠΈΡΡ Π΄ΠΎΡΠΎΠΆΠΊΡ ΠΎΡΡΡΠΎΠ²ΠΊΠΎΠ²-ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΎΠΊ, ΡΡΠ΄ ΠΊΠΎΡΠΎΡΡΡ , Ρ ΠΎΡΡ ΠΈ Π½Π΅ Π±Π΅Π· ΡΡΠΈΠ»ΠΈΠΉ, ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ-ΡΠ°ΠΊΠΈ Π½Π°ΠΌ Π΄ΠΎΡΡΠΈΡΡ ΡΠ΅Π»ΠΈ.
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ 100 % Π΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈ Π½Π΅ΡΠΎΡΠ½ΠΎΡΡΠΈ ΡΠ°ΠΌΡΡ ΡΠ°Π·Π½ΡΡ ΠΊΠ°Π»ΠΈΠ±ΡΠΎΠ², ΡΠ°ΠΊ ΡΡΠΎ, Π΅ΡΠ»ΠΈ ΡΡΠΎ-ΡΠΎ ΡΠ³Π»ΡΠ΄ΠΈΡΠ΅, Π½Π΅ ΡΡΠ΅ΡΠ½ΡΠΉΡΠ΅ΡΡ Π²ΡΡΠ°ΠΆΠ°ΡΡΡΡ Π² Π»ΠΈΡΠΊΡ, Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ , Π½Π° ΠΏΠΎΡΡΡ [email protected], Π²ΡΠ΅ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π±ΡΡΠ½ΠΎ ΠΏΡΠΈΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ.
ΠΠΎΠ³ΡΡΠΆΠ°ΡΡΡ Π² Python, Π½Π΅ Π·Π°Π±ΡΠ²Π°ΠΉΡΠ΅ ΠΏΡΠΎ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΡΡ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ docs.python.org. ΠΠ·ΡΡΠΈΠ² Π΅Ρ, Ρ ΠΎΡΡ Π±Ρ ΠΏΠΎ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ, ΠΈ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ ΡΠ³Π»ΡΠ±Π»ΡΡΡΡ Π² Π½ΡΠΆΠ½ΡΠ΅ ΡΠ°Π·Π΄Π΅Π»Ρ, Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Β«Ρ Π°ΠΊΠΈΒ», Β«ΠΎΡΠΊΡΡΡΠΈΡΒ» ΠΈ ΠΏΡΠΎΡΠΈΠ΅ Π½Π΅ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠ΅ Π²Π΅ΡΠΈ ΡΠΆΠ΅ Π΄Π°Π²Π½ΠΎ ΡΠ°Π·ΠΆΠ΅Π²Π°Π½Ρ, ΠΎΠΏΠΈΡΠ°Π½Ρ ΠΈ ΠΈΠΌΠ΅ΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ.
Π’Π°ΠΊΠΆΠ΅ Ρ Π±Ρ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π» Π΄Π»Ρ ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° Python Π½Π° ΠΏΠΎΠ»Π½ΡΡ ΠΊΠ°ΡΡΡΠΊΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ leetcode.com. ΠΡΠ»ΠΈ ΠΎΡΡΠΈΠ»ΡΡΡΠΎΠ²Π°ΡΡ Π·Π°Π΄Π°ΡΠΈ ΠΏΠΎ ΡΡΠΎΠ²Π½Ρ Β«EasyΒ», Π° ΠΏΠΎΡΠΎΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΡ ΠΏΠΎ ΡΡΠΎΠ»Π±ΡΡ Β«AcceptanceΒ», ΡΠΎ ΠΏΠ΅ΡΠ΅Π΄ Π²Π°ΠΌΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π½Π΅Ρ Π½Π΅ Π²ΠΎΠ»ΡΠΈΠΉ ΠΎΡΠΊΠ°Π» ΡΠΎΡΠ΅Π²Π½ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ, Π° Π²Π°Π½ΠΈΠ»ΡΠ½ΡΠΉ Π±ΡΠΊΠ²Π°ΡΡ Ρ ΠΏΠ»Π°Π²Π½ΠΎ Π½Π°ΡΠ°ΡΡΠ°ΡΡΠΈΠΌ ΡΡΠΎΠ²Π½Π΅ΠΌ Π·Π°Π΄Π°ΡΠ΅ΠΊ.
Π§ΡΠΎ ΠΆ, ΠΏΠΎΠΆΠ°Π»ΡΠΉ, Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π·Π°ΠΏΡΡΠ³Π°ΡΡ. ΠΠΎΠ³Π½Π°Π»ΠΈ!
ΠΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅
ΠΠΈΠΆΠ΅ Π²Ρ Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΎΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅, ΡΠ΄Π΅Π»Π°Π½Π½ΠΎΠ΅ Π΄Π»Ρ Π»ΡΡΡΠ΅Π³ΠΎ ΡΡΠ²ΠΎΠ΅Π½ΠΈΡ Π½Π΅ ΠΏΠ»ΠΎΡΠΊΠΈΠΌ, Π° Π² Π²ΠΈΠ΄Π΅ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΡ-ΠΏΡΡΠ΅Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ.
ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΏΡΡΠ΅Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΌ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ. ΠΠ°ΠΊ Π² ΠΎΠ±ΡΡΠ½ΠΎΠΌ ΡΠ΅ΠΊΡΡΠ΅, ΠΈΠ΄ΠΈΡΠ΅ ΡΠ»Π΅Π²Π° Π½Π°ΠΏΡΠ°Π²ΠΎ ΠΈ ΡΠ²Π΅ΡΡ Ρ Π²Π½ΠΈΠ·. ΠΡΠ»ΠΈ Π²Ρ ΡΠΎΠ»ΡΠΊΠΎ Π½Π°ΡΠΈΠ½Π°Π΅ΡΠ΅ ΠΈΠ·ΡΡΠ°ΡΡ Python, ΡΠΎ ΠΈΠ΄ΠΈΡΠ΅ ΠΏΠΎ Π·Π΅Π»Π΅Π½ΡΠΌ ΠΏΡΠ½ΠΊΡΠ°ΠΌ ΠΏΡΡΠ΅Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ. ΠΡΠ»ΠΈ Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½ΡΠΉ ΠΎΠΏΡΡ, Π»ΡΠ±ΠΎΠΏΡΡΡΡΠ²ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΡΠΎΠ»ΠΊΠ°ΡΡ Π²Π°Ρ Π³Π»ΡΠ±ΠΆΠ΅, Π½Π°ΡΠ½ΠΈΡΠ΅ ΠΈΠ·ΡΡΠ°ΡΡ ΡΠ°Π·Π΄Π΅Π»Ρ, ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Π½ΡΠ΅ ΡΠ΅ΡΡΠΌ. ΠΡΠ°Π½ΠΆΠ΅Π²ΡΠΌ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Ρ ΡΠ΅ΠΌΡ, ΡΡΠ΅Π±ΡΡΡΠΈΠ΅ ΡΠ³Π»ΡΠ±Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ, ΠΈΠΌΠΈ Π»ΡΡΡΠ΅ Π·Π°Π½ΡΡΡΡΡ (Ρ ΠΎΡΡ Π±Ρ ΠΈ Π½Π΅ ΠΊΠΎΠΏΠ°Ρ, Π΄Π»Ρ Π½Π°ΡΠ°Π»Π°, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π³Π»ΡΠ±ΠΎΠΊΠΎ) Π² ΡΡΠ΅ΡΠΈΠΉ ΠΏΡΠΎΡ ΠΎΠ΄. ΠΠ°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π²Ρ Π½Π΅ ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΠ΅ΡΡ ΠΏΠ»ΠΎΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ ΠΈΠ· ΠΎΡΠ°Π½ΠΆΠ΅Π²ΡΡ ΡΠ΅ΠΌ, ΡΠ°ΡΡΠΌΠΎΡΡΠΈΡΠ΅ ΠΈΡ Ρ ΠΎΡΡ Π±Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΡΡΡΠΊΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, ΡΡΠΎ ΡΡΠΎ, Π΄Π»Ρ ΡΠ΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, ΠΏΠ»ΡΡΡ ΠΈ ΠΌΠΈΠ½ΡΡΡ; Π΄Π΅ΡΠΆΠ°ΡΡ, ΡΠ°ΠΊ ΡΠΊΠ°Π·Π°ΡΡ, Π² Β«Π³ΠΎΡΡΡΠ΅ΠΌ ΡΠ΅Π·Π΅ΡΠ²Π΅Β».
1. Π‘ΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ
Β«ΠΠ° Π²ΠΎΡΡΠΎΠΊΠ΅ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ Π Π°ΠΉ; ΠΌΠ΅ΡΡΠΎ ΡΡΠΎ ΠΏΡΠ΅ΠΎΠ±ΠΈΠ»ΡΠ½ΠΎΠ΅ ΠΈ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ ΡΠ²ΠΎΠΈΠΌΠΈ Π½Π°ΡΠ»Π°ΠΆΠ΄Π΅Π½ΠΈΡΠΌΠΈ, Π½ΠΎ Π΄Π»Ρ Π»ΡΠ΄Π΅ΠΉ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎ. ΠΠ΅ΡΡΠΎ ΡΡΠΎ ΠΎΠ³ΡΠ°ΠΆΠ΄Π΅Π½ΠΎ ΠΎΠ³Π½Π΅Π½Π½ΠΎΠΉ ΡΡΠ΅Π½ΠΎΠΉ Π΄ΠΎ ΡΠ°ΠΌΠΎΠ³ΠΎ Π½Π΅Π±Π°Β».
ΠΠ±ΡΡΠΎΡΡΡΠΊΠ°Ρ ΠΊΠ°ΡΡΠ°.
ΠΠ°ΠΊ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ = ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ + Π°Π»Π³ΠΎΡΠΈΡΠΌΡ (Ρ ΠΠΈΠΊΠ»Π°ΡΡΠ° ΠΠΈΡΡΠ° Π΄Π°ΠΆΠ΅ ΠΊΠ½ΠΈΠΆΠΊΠ° ΡΠ°ΠΊΠ°Ρ Π΅ΡΡΡ). ΠΠ°ΡΠ½Π΅ΠΌ Ρ Π΄Π°Π½Π½ΡΡ , Π° ΠΏΠΎΡΠΎΠΌ ΠΏΠ»Π°Π²Π½Π΅Π½ΡΠΊΠΎ ΠΏΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌ ΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ.
Π‘ΠΏΠΈΡΠΎΠΊ (list)
Π‘ΠΏΠΈΡΠΎΠΊ β ΡΠ°ΠΌΠ°Ρ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½Π°Ρ ΠΈ ΠΏΠΎΠΏΡΠ»ΡΡΠ½Π°Ρ ΡΡΡΡΠΊΡΡΡΠ° Π΄Π°Π½Π½ΡΡ
Π² Python. ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΎΠΊΠ° ΡΠΎΡΠ½ΠΎ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈΡΡ, ΠΊΠ°ΠΊΠ°Ρ ΡΡΡΡΠΊΡΡΡΠ° ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π² Π²Π°ΡΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅, ΠΏΡΠΎΡΡΠΎ Π²ΠΎΠ·ΡΠΌΠΈΡΠ΅ ΡΠΏΠΈΡΠΎΠΊ, Ρ Π½Π΅Π³ΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ ΠΌΠΈΠ³ΡΠΈΡΠΎΠ²Π°ΡΡ Π½Π° ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅.
Π‘ΠΏΠΈΡΠΎΠΊ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Π½ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΡ
ΡΠΈΠΏΠΎΠ². ΠΠ½ΡΡΡΠ΅Π½Π½Π΅Π΅ ΡΡΡΠΎΠ΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° - ΠΌΠ°ΡΡΠΈΠ² (ΡΠΎΡΠ½Π΅Π΅, vector) ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ, Ρ. Π΅. ΡΠΏΠΈΡΠΎΠΊ ΡΠ²Π»ΡΠ΅ΡΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ.
a = [] # Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΡΡΡΠΎΠΉ ΡΠΏΠΈΡΠΎΠΊ
a: list[int] = [10, 20]
b: list[int] = [30, 40]
a.append(50) # ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΊΠΎΠ½Π΅Ρ ΡΠΏΠΈΡΠΊΠ°
b.insert(2, 60) # ΠΡΡΠ°Π²Π»ΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡ ΠΈΠ½Π΄Π΅ΠΊΡΡ
print(a, b)
a += b
print(f"Add: {a}")
a.reverse()
b = list(reversed(a)) # reversed() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΡΠ΅ΡΠ°ΡΠΎΡ, Π° Π½Π΅ ΡΠΏΠΈΡΠΎΠΊ
print(f"Reverse: {a}, {b}")
b = sorted(a) # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΠΎΠ²ΡΠΉ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ
a.sort() # ΠΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΠ΅Ρ ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΈ Π½Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΠΈΡΠ΅Π³ΠΎ
print(f"Sort: {a}, {b}")
s: str = "A whole string"
list_of_chars: list = list(s)
print(list_of_chars)
list_of_words: list = s.split()
print(list_of_words)
i: int = list_of_chars.index("w") # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΠ½Π΄Π΅ΠΊΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π²Ρ
ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΈΡΠΊΠΎΠΌΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈΠ»ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ValueError
print(i)
list_of_chars.remove("w") # Π£Π΄Π°Π»ΡΠ΅Ρ ΠΏΠ΅ΡΠ²ΠΎΠ΅ Π²Ρ
ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΈΡΠΊΠΎΠΌΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈΠ»ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ValueError
e = list_of_chars.pop(9) # Π£Π΄Π°Π»ΡΠ΅Ρ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡ. pop() (Π±Π΅Π· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°) ΡΠ΄Π°Π»ΠΈΡ ΠΈ Π²Π΅ΡΠ½Π΅Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΏΠΈΡΠΊΠ°
print(list_of_chars, e)
a.clear() # ΠΡΠΈΡΡΠΊΠ° ΡΠΏΠΈΡΠΊΠ°
[10, 20, 50] [30, 40, 60]
Add: [10, 20, 50, 30, 40, 60]
Reverse: [60, 40, 30, 50, 20, 10], [10, 20, 50, 30, 40, 60]
Sort: [10, 20, 30, 40, 50, 60], [10, 20, 30, 40, 50, 60]
['A', ' ', 'w', 'h', 'o', 'l', 'e', ' ', 's', 't', 'r', 'i', 'n', 'g']
['A', 'whole', 'string']
2
['A', ' ', 'h', 'o', 'l', 'e', ' ', 's', 't', 'i', 'n', 'g'] r
ΠΠΎΡΡΠ΅ΠΆ (tuple)
ΠΠΎΡΡΠ΅ΠΆ β ΡΠΎΠΆΠ΅ ΡΠΏΠΈΡΠΎΠΊ, ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΉ (immutable) ΠΈ Ρ ΡΡΠΈΡΡΠ΅ΠΌΡΠΉ (hashable). ΠΠΎΡΡΠ΅ΠΆ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΡΠ΅ ΠΆΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΡΡΠΎ ΠΈ ΡΠΏΠΈΡΠΎΠΊ, Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ ΠΌΠ΅Π½ΡΡΠ΅ ΠΌΠ΅ΡΡΠ°:
a = [2, 3, "Boson", "Higgs", 1.56e-22]
b = (2, 3, "Boson", "Higgs", 1.56e-22)
print(f"List: {a.__sizeof__()} bytes")
print(f"Tuple: {b.__sizeof__()} bytes")
List: 104 bytes
Tuple: 64 bytes
ΠΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΡΡΠ΅ΠΆ (named tuple)
Π ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ, ΠΈΠΌΠ΅Π΅Ρ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ»Ρ. Π£Π΄ΠΎΠ±Π½ΠΎ!
from collections import namedtuple
rectangle = namedtuple('rectangle', 'length width')
r = rectangle(length = 1, width = 2)
print(r)
print(r.length)
print(r.width)
print(r._fields)
rectangle(length=1, width=2)
1
2
('length', 'width')
Π‘Π»ΠΎΠ²Π°ΡΡ (dict)
Π‘Π»ΠΎΠ²Π°ΡΡ β Π²ΡΠΎΡΠ°Ρ ΠΏΠΎ ΡΠ°ΡΡΠΎΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΡΡΠΊΡΡΡΠ° Π΄Π°Π½Π½ΡΡ Π² Python. dict - ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΊΠ»ΡΡΠ° Π½Π΅Π»ΡΠ·Ρ Π±ΡΠ°ΡΡ Π½Π΅Ρ Π΅ΡΠΈΡΡΠ΅ΠΌΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΏΠΈΡΠΎΠΊ (ΡΡΡ-ΡΠΎ Π½Π°ΠΌ ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡΡ ΠΊΠΎΡΡΠ΅ΠΆ). ΠΠ»ΡΡΠΎΠΌ ΡΠ»ΠΎΠ²Π°ΡΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π»ΡΠ±ΠΎΠΉ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ: ΡΠΈΡΠ»ΠΎ, ΡΡΡΠΎΠΊΠ°, datetime ΠΈ Π΄Π°ΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΡ. Π’Π°ΠΊΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈΠΌΠ΅ΡΡ ΠΌΠ΅ΡΠΎΠ΄ __hash__(), ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ. ΠΠΎ ΡΡΠΎΠΌΡ ΡΠΈΡΠ»Ρ ΡΠ»ΠΎΠ²Π°ΡΡ ΠΈΡΠ΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΊΠ»ΡΡΠ°.
Π‘ΠΏΠΈΡΠΊΠΈ, ΡΠ»ΠΎΠ²Π°ΡΠΈ ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° (ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΡΡ Π½ΠΈΠΆΠ΅) ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡ ΠΈ Π½Π΅ ΠΈΠΌΠ΅ΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° Ρ Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΏΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ ΠΏΠΎΠ΄ΡΡΠ°Π²ΠΈΡΡ ΠΈΡ Π² ΡΠ»ΠΎΠ²Π°ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ°.
d = {} # Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΡΡΡΠΎΠΉ ΡΠ»ΠΎΠ²Π°ΡΡ
d: dict[str, str] = {"Italy": "Pizza", "US": "Hot-Dog", "China": "Dim Sum"} # ΠΠ΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ»ΠΎΠ²Π°ΡΡ
k = ["Italy", "US", "China"]
v = ["Pizza", "Hot-Dog", "Dim Sum"]
d = dict(zip(k, v)) # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ»ΠΎΠ²Π°ΡΡ ΠΈΠ· Π΄Π²ΡΡ
ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΉ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ zip
k = d.keys() # ΠΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΠΊΠ»ΡΡΠ΅ΠΉ. ΠΡΡΠ°ΠΆΠ°Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΡΠ»ΠΎΠ²Π°ΡΠ΅
v = d.values() # ΠΠΎΠ»Π»Π΅ΠΊΡΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ. Π’ΠΎΠΆΠ΅ ΠΎΡΡΠ°ΠΆΠ°Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΡΠ»ΠΎΠ²Π°ΡΠ΅
k_v = d.items() # ΠΠΎΡΡΠ΅ΠΆΠΈ ΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠΆΠ΅ ΠΎΡΡΠ°ΠΆΠ°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΡΠ»ΠΎΠ²Π°ΡΠ΅
print(d)
print(k)
print(v)
print(k_v)
print(f"Mapping: {k.mapping['Italy']}")
d.update({"China": "Dumplings"}) # ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΡΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠΈ ΠΊΠ»ΡΡΠ° ΡΡΠ°ΡΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΠ°Π½ΠΎ
print(f"Replace item: {d}")
c = d["China"] # Π§ΠΈΡΠ°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
print(f"Read item: {c}")
try:
v = d.pop("Spain") # Π£Π΄Π°Π»ΡΠ΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ KeyError
except KeyError:
print("Dictionary key doesn't exist")
# ΠΡΠΈΠΌΠ΅ΡΡ dict comprehension (Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ comprehension Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΎ Π½ΠΈΠΆΠ΅)
b = {k: v for k, v in d.items() if "a" in k} # ΠΠ΅ΡΠ½Π΅Ρ Π½ΠΎΠ²ΡΠΉ ΡΠ»ΠΎΠ²Π°ΡΡ, ΠΎΡΡΠΈΠ»ΡΡΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠ»ΡΡΠ°
print(b)
c = {k: v for k, v in d.items() if len(v) >= 7} # ΠΠ΅ΡΠ½Π΅Ρ Π½ΠΎΠ²ΡΠΉ ΡΠ»ΠΎΠ²Π°ΡΡ, ΠΎΡΡΠΈΠ»ΡΡΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΠΎ Π΄Π»ΠΈΠ½Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ
print(c)
d.clear() # ΠΡΠΈΡΡΠΊΠ° ΡΠ»ΠΎΠ²Π°ΡΡ
{'Italy': 'Pizza', 'US': 'Hot-Dog', 'China': 'Dim Sum'}
dict_keys(['Italy', 'US', 'China'])
dict_values(['Pizza', 'Hot-Dog', 'Dim Sum'])
dict_items([('Italy', 'Pizza'), ('US', 'Hot-Dog'), ('China', 'Dim Sum')])
Mapping: Pizza
Replace item: {'Italy': 'Pizza', 'US': 'Hot-Dog', 'China': 'Dumplings'}
Read item: Dumplings
Dictionary key doesn't exist
{'Italy': 'Pizza', 'China': 'Dumplings'}
{'US': 'Hot-Dog', 'China': 'Dumplings'}
Π Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Ρ Π΅ΡΠ° ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ ΡΠΎ ΡΠ»ΠΎΠ²Π°ΡΠ΅ΠΌ
ΠΡΠ±Π°Ρ Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°, Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ ΠΏΠΈΡΠΎΠ½ΠΎΠ²ΡΠΊΠΈΠΉ ΡΠ»ΠΎΠ²Π°ΡΡ, Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΌΠ΅ΡΡ ΡΠ΅ΡΠ°ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Ρ Π΅ΡΠ°. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠ΅Ρ Π½ΠΈΠΊΠΈ open addressing ΠΈΠ»ΠΈ chaining. Python ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ open addressing.
ΠΠΎΠ²ΡΠΉ ΡΠ»ΠΎΠ²Π°ΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ Ρ 8 ΠΏΡΡΡΡΠΌΠΈ ΡΠ»ΠΎΡΠ°ΠΌΠΈ.
ΠΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ ΡΠ½Π°ΡΠ°Π»Π° ΠΏΡΡΠ°Π΅ΡΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π½ΠΎΠ²ΡΡ Π·Π°ΠΏΠΈΡΡ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ, Π·Π°Π²ΠΈΡΡΡΠ΅ΠΌΡ ΠΎΡ Ρ Π΅ΡΠ° ΠΊΠ»ΡΡΠ°.
addr = hash(key) & mask,
Π³Π΄Π΅
mask = PyDictMINSIZE - 1
ΠΡΠ»ΠΈ ΡΡΠΎΡ Π°Π΄ΡΠ΅Ρ Π·Π°Π½ΡΡ, ΡΠΎ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ (ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ==) Ρ Π΅Ρ ΠΈ ΠΊΠ»ΡΡ. ΠΡΠ»ΠΈ ΠΎΠ±Π° ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ, ΡΠΎ, Π·Π½Π°ΡΠΈΡ, Π·Π°ΠΏΠΈΡΡ ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ. Π’ΠΎΠ³Π΄Π° Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Π·ΠΎΠ½Π΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΡ ΡΠ»ΠΎΡΠΎΠ², ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΈΠ΄Π΅Ρ Π² ΠΏΡΠ΅Π²Π΄ΠΎΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ (ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠ»ΡΡΠ°). ΠΠΎΠ²Π°Ρ Π·Π°ΠΏΠΈΡΡ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎ ΠΏΠ΅ΡΠ²ΠΎΠΌΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠΌΡ Π°Π΄ΡΠ΅ΡΡ.
Π§ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΡΠ»ΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ, ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΠΏΠΎΠΈΡΠΊ Ρ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ addr ΠΈ ΠΈΠ΄Π΅Ρ ΠΏΠΎ ΡΠΎΠΌΡ ΠΆΠ΅ ΠΏΡΠ΅Π²Π΄ΠΎΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΌΡ ΠΏΡΡΠΈ, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡΠΎΡΠΈΡΠ°Π΅Ρ Π½ΡΠΆΠ½ΡΡ Π·Π°ΠΏΠΈΡΡ.
Defaultdict
ΠΡΠ»ΠΈ ΠΏΠΎΠΏΡΡΠ°ΡΡΡΡ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ ΠΈΠ· ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ°, ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ°ΠΌ Π½Π΅Ρ, ΡΠΎ Π±ΡΠ΄Π΅Ρ Π²ΡΠ±ΡΠΎΡΠ΅Π½ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ KeyError (ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π±ΡΠ΄ΡΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Ρ Π½ΠΈΠΆΠ΅). Defaultdict ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π΅ ΠΏΠΈΡΠ°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ, Π° ΠΏΡΠΎΡΡΠΎ Π²ΠΎΡΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΠ΅Π½ΠΈΠ΅ Π½Π΅ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΠΊΠ»ΡΡΠ° ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π² ΡΡΠΎΡ ΠΊΠ»ΡΡ ΠΈ Π²Π΅ΡΠ½ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ; Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, defaultdict(int) Π²Π΅ΡΠ½Π΅Ρ 0.
from collections import defaultdict
dd = defaultdict(int)
print(dd[10]) # ΠΠ΅ΡΠ°ΡΡ int, Π±ΡΠ΄Π΅Ρ Π²ΡΠ²Π΅Π΄Π΅Π½ Π½ΠΎΠ»Ρ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ
dd = {} # "ΠΠ±ΡΡΠ½ΡΠΉ" ΠΏΡΡΡΠΎΠΉ ΡΠ»ΠΎΠ²Π°ΡΡ
# print(dd[10]) # Π²ΡΠ·ΠΎΠ²Π΅Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ KeyError
0
Π‘ΡΠ΅ΡΡΠΈΠΊ (counter)
Π‘ΡΠ΅ΡΡΠΈΠΊ ΠΏΠΎΠ΄ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ Π΅ΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ. ΠΠ½ΠΎΠ³Π΄Π° ΠΎΡΠ΅Π½Ρ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡΠΎΡΡΠΎ Π±ΡΡ Π½ΡΡΡ Π² ΡΡΠ΅ΡΡΠΈΠΊ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠΏΠΈΡΠΎΠΊ ΠΈ ΡΡΠ°Π·Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ Ρ ΠΏΠΎΠ΄ΡΡΠΈΡΠ°Π½Π½ΡΠΌΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ.
from collections import Counter
shirts_colors = ["red", "white", "blue", "white", "white", "black", "black"]
c = Counter(shirts_colors)
print(c)
c["blue"] += 1
print(f"After shopping: {c}")
Counter({'white': 3, 'black': 2, 'red': 1, 'blue': 1})
After shopping: Counter({'white': 3, 'blue': 2, 'black': 2, 'red': 1})
ΠΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ Counter() ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ defaultdict():
from collections import defaultdict
shirts_colors = ["red", "white", "blue", "white", "white", "black", "black"]
d = defaultdict(int)
for shirt in shirts_colors:
d[shirt] += 1
print(d)
defaultdict(<class 'int'>, {'red': 1, 'white': 3, 'blue': 1, 'black': 2})
ΠΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ (set)
Π’ΡΠ΅ΡΡΡ ΠΏΠΎ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΠΎΡΡΠΈ ΠΏΠΈΡΠΎΠ½ΠΎΠ²ΡΠΊΠ°Ρ ΡΡΡΡΠΊΡΡΡΠ° Π΄Π°Π½Π½ΡΡ . ΠΠΎΠ³Π΄Π°-ΡΠΎ, ΠΊΠΎΠ³Π΄Π° Python Π±ΡΠ» ΠΌΠΎΠ»ΠΎΠ΄, ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ»ΠΈ ΡΠΎΠ±ΠΎΠΉ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅Π΄ΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠ»ΠΎΠ²Π°ΡΠΈ, Π½ΠΎ ΡΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΠΈΡ ΡΡΠ΄ΡΠ±Ρ (ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ) ΡΡΠ°Π»ΠΈ ΡΠ°ΡΡ ΠΎΠ΄ΠΈΡΡΡΡ. ΠΠ΄Π½Π°ΠΊΠΎ, ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²ΡΡ-ΡΠ°ΠΊΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ΅ΠΉ Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ Π±ΡΡΡΡΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΠΌ Π½Π° ΡΠ°Π·Π½ΡΡ ΡΠΈΠΏΠ°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ.
big_cities: set["str"] = {"New-York", "Los Angeles", "Ottawa"}
american_cities: set["str"] = {"Chicago", "New-York", "Los Angeles"}
big_cities |= {"Sydney"} # ΠΠΎΠ±Π°Π²ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ (ΠΈΠ»ΠΈ add())
american_cities |= {"Salt Lake City", "Seattle"} # Π‘Π»ΠΎΠΆΠΈΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° (ΠΈΠ»ΠΈ update())
print(big_cities, american_cities)
union_cities: set["str"] = big_cities | american_cities # ΠΠ»ΠΈ union()
intersected_cities: set["str"] = big_cities & american_cities # ΠΠ»ΠΈ intersection()
dif_cities: set["str"] = big_cities - american_cities # ΠΠ»ΠΈ difference()
symdif_cities: set["str"] = big_cities ^ american_cities # ΠΠ»ΠΈ symmetric_difference()
issub: bool = big_cities <= union_cities # ΠΠ»ΠΈ issubset()
issuper: bool = american_cities >= dif_cities # ΠΠ»ΠΈ issuperset()
print(union_cities)
print(intersected_cities)
print(dif_cities)
print(symdif_cities)
print(issub, issuper)
big_cities.add("London")
big_cities.remove("Ottawa") # Π£Π΄Π°Π»ΡΠ΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΎ ΠΈΠΌΠ΅Π΅ΡΡΡ ΠΈΠ»ΠΈ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ KeyError
big_cities.discard("Los Angeles") # Π£Π΄Π°Π»ΡΠ΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π±Π΅Π· Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π½ΠΈΡ KeyError
big_cities.pop() # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈ ΡΠ΄Π°Π»ΡΠ΅Ρ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ (ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π² set Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½) ΠΈΠ»ΠΈ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ KeyError
big_cities.clear() # ΠΡΠΈΡΠ°Π΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ
{'New-York', 'Los Angeles', 'Sydney', 'Ottawa'} {'New-York', 'Seattle', 'Chicago', 'Los Angeles', 'Salt Lake City'}
{'Ottawa', 'Salt Lake City', 'Chicago', 'New-York', 'Seattle', 'Sydney', 'Los Angeles'}
{'New-York', 'Los Angeles'}
{'Ottawa', 'Sydney'}
{'Seattle', 'Ottawa', 'Chicago', 'Salt Lake City', 'Sydney'}
True False
ΠΠΌΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΠΎΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ (frozen set)
Frozen set β ΡΠΎ ΠΆΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ, ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠΌΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΠΎΠ΅ ΠΈ Ρ Π΅ΡΠΈΡΡΠ΅ΠΌΠΎΠ΅. ΠΠ°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ ΡΠ°Π·Π½ΠΈΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΏΠΈΡΠΊΠΎΠΌ ΠΈ ΠΊΠΎΡΡΠ΅ΠΆΠ΅ΠΌ, Π½Π΅ ΠΏΡΠ°Π²Π΄Π° Π»ΠΈ?
a = frozenset({"New-York", "Los Angeles", "Ottawa"})
ΠΠ°ΡΡΠΈΠ² (array, bytes, bytearray)
Π― ΠΏΠ΅ΡΠ΅ΡΠ΅Π» Π½Π° Python Ρ ΡΠ·ΡΠΊΠΎΠ², Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ΅Π½Π½ΡΡ ΠΊ Β«ΠΆΠ΅Π»Π΅Π·ΡΒ» (C, C#, Π΄Π°ΠΆΠ΅ Π½Π° Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ΅ ΠΊΠΎΠ³Π΄Π°-ΡΠΎ ΠΏΠΈΡΠ°Π» Π·Π° Π΄Π΅Π½ΡΠ³ΠΈ :) ΠΈ ΡΠ½Π°ΡΠ°Π»Π° Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΄ΠΈΠ²Π»ΡΠ»ΡΡ, ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ², Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π²ΡΡ ΡΠ°ΠΊ ΡΠ΄ΠΎΠ±Π½ΠΎ Π»Π΅ΠΆΠΈΡ Π½Π° ΡΠ²ΠΎΠΈΡ ΠΌΠ΅ΡΡΠ°Ρ , ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΅Π΄ΠΊΠΎ. ΠΠ°ΡΡΠΈΠ² Π² Python Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΡΡΠΊΡΡΡΠΎΠΉ Π΄Π°Π½Π½ΡΡ , Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌΠΎΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ»ΡΡΠ°ΡΡ , ΠΊΠΎΠ³Π΄Π° ΡΠ΅ΡΠ°ΡΡΡΡ ΡΠΎΠ»Ρ Π½Π°ΡΠΈΠ½Π°ΡΡ ΠΈΠ³ΡΠ°ΡΡ ΡΠ°Π·ΠΌΠ΅Ρ ΡΡΡΡΠΊΡΡΡΡ ΠΈ ΡΠΊΠΎΡΠΎΡΡΡ Π΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ. ΠΠΎ, Ρ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, Π΅ΡΠ»ΠΈ Π²Ρ ΡΠΌΠΎΡΡΠΈΡΠ΅ Π² ΡΡΠΎΡΠΎΠ½Ρ NumPy ΠΈ Pandas (Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°ΡΡΠΎΠ½ΡΡΡ Π½ΠΈΠΆΠ΅), ΡΠΎ ΠΌΠ°ΡΡΠΈΠ²Ρ β Π²Π°ΡΠ΅ Π²ΡΡ.
ΠΠ°ΡΡΠΈΠ² Ρ ΡΠ°Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, ΠΏΠΎΡΡΠΎΠΌΡ, Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΡΠΏΠΈΡΠΊΠ°, Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΎΠ²ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ Π²ΡΠΈΠ³ΡΡΠ²Π°Π΅Ρ Ρ ΡΠΏΠΈΡΠΊΠ° Π² ΡΠ°Π·ΠΌΠ΅ΡΠ°Ρ ΠΈ ΡΠΊΠΎΡΠΎΡΡΠΈ Π΄ΠΎΡΡΡΠΏΠ°. ΠΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΡΡΠΎ ΡΠΎΠ½ΠΊΠ°Ρ ΠΎΠ±ΡΡΡΠΊΠ° Π½Π°Π΄ Π‘ΠΈ-ΠΌΠ°ΡΡΠΈΠ²Π°ΠΌΠΈ.
Π‘Π»Π΅Π΄ΡΠ΅Ρ ΡΠ°Π·Π»ΠΈΡΠ°ΡΡ array (Β«ΠΏΡΠΎΡΡΠΎΒ» ΠΌΠ°ΡΡΠΈΠ²), bytes (ΠΈΠΌΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ², ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΡΠΎΠ»ΡΠΊΠΎ Π±Π°ΠΉΡΡ, Π½Π°ΡΠ»Π΅Π΄ΠΈΠ΅ str ΠΈΠ· Python 2) ΠΈ bytearray (ΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΡΠΉ Π±Π°ΠΉΡΠΎΠ²ΡΠΉ ΠΌΠ°ΡΡΠΈΠ²).
from array import array
a1 = array("l", [1, 2, 3, -4])
a2 = array("b", b"1234567890")
b = bytes(a2)
print(a1)
print(a2[0])
print(b)
print(a1.index(-4)) # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΠ½Π΄Π΅ΠΊΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΈΠ»ΠΈ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ ValueError
array('l', [1, 2, 3, -4])
49
b'1234567890'
3
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅
b1 = bytes([1, 2, 3, 4]) # Π¦Π΅Π»ΡΠ΅ ΡΠΈΡΠ»Π° Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ 0 to 255
b2 = "The String".encode('utf-8')
b3 = (-1024).to_bytes(4, byteorder='big', signed=True) # byteorder = "big"/"little"/"sys.byteorder", signed = False/True
b4 = bytes.fromhex('FEADCA') # ΠΠ»Ρ Π±ΠΎΠ»ΡΡΠ΅ΠΉ ΡΠΈΡΠ°Π΅ΠΌΠΎΡΡΠΈ hex-Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ°Π·Π΄Π΅Π»Π΅Π½Ρ ΠΏΡΠΎΠ±Π΅Π»Π°ΠΌΠΈ
b5 = bytes(range(10,30,2))
print(b1, b2, b3, b4, b5)
# ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅
c: list = list(b"\xfc\x00\x00\x00\x00\x01")
s: str = b'The String'.decode("utf-8")
b: int = int.from_bytes(b"\xfc\x00", byteorder='big', signed=False) # byteorder = "big"/"little"/"sys.byteorder", signed = False/True
s2: str = b"\xfc\x00\x00\x00\x00\x01".hex(" ")
print(c, s, b, s2)
with open("1.bin", "wb") as file: # ΠΠ°ΠΉΡΠΎΠ²Π°Ρ Π·Π°ΠΏΠΈΡΡ Π² ΡΠ°ΠΉΠ»
file.write(b1)
with open("1.bin", "rb") as file: # Π§ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΡΠ°ΠΉΠ»Π°
b6 = file.read()
print(b6)
b'\x01\x02\x03\x04' b'The String' b'\xff\xff\xfc\x00' b'\xfe\xad\xca' b'\n\x0c\x0e\x10\x12\x14\x16\x18\x1a\x1c'
[252, 0, 0, 0, 0, 1] The String 64512 fc 00 00 00 00 01
b'\x01\x02\x03\x04'
ΠΠ΄Π½ΠΎΡΠ²ΡΠ·Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ
ΠΠ΄Π½ΠΎΡΠ²ΡΠ·Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ Π½Π°Π±ΠΎΡ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΡΠ·Π»ΠΎΠ², ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ Ρ ΡΠ°Π½ΠΈΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΈ ΡΡΡΠ»ΠΊΡ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ·Π΅Π». Π ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌ ΡΠ΅Π΄ΠΊΠΎ, Π½ΠΎ Π΅Π³ΠΎ Π»ΡΠ±ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΠ²ΡΡΠ΅ΡΡ Π½Π° ΡΠΎΠ±Π΅ΡΠ΅Π΄ΠΎΠ²Π°Π½ΠΈΡΡ , ΡΡΠΎΠ±Ρ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ ΠΌΠΎΠ³ Π±Π»Π΅ΡΠ½ΡΡΡ ΡΠ²ΠΎΠΈΠΌΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ Π·Π½Π°Π½ΠΈΡΠΌΠΈ. Π Python Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ deque (Π² ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π»Π΅ΠΆΠΈΡ Π΄Π²ΡΡΠ²ΡΠ·Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ), ΠΈΠ»ΠΈ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ.
ΠΠ²ΡΡΠ²ΡΠ·Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ (Deque)
Π‘ΡΡΠ»ΠΊΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ·Π»Π΅ Π΄Π²ΡΡΠ²ΡΠ·Π½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½Π° ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΠΈ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ·Π΅Π» Π² ΡΠΏΠΈΡΠΊΠ΅. ΠΠΎΠΆΠ½ΠΎ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ deque, ΠΈΠ»ΠΈ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ.
from collections import deque
d = deque([1, 2, 3, 4], maxlen=1000)
d.append(5) # Add element to the right side of the deque
d.appendleft(0) # Add element to the left side of the deque by appending elements from iterable
d.extend([6, 7]) # Extend the right side of the deque
d.extendleft([-1, -2]) # Extend the left side of the deque
print(d)
a = d.pop() # Remove and return an element from the right side of the deque. Can raise an IndexError
b = d.popleft() # Remove and return an element from the left side of the deque. Can raise an IndexError
print(a, b)
print(d)
deque([-2, -1, 0, 1, 2, 3, 4, 5, 6, 7], maxlen=1000)
7 -2
deque([-1, 0, 1, 2, 3, 4, 5, 6], maxlen=1000)
Queue
Queue ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ FIFO ΡΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌΠΈ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΌΠΈ. ΠΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΠΏΡΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ. Π’Π°ΠΊΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ LifoQueue Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ LIFO ΠΈ PriorityQueue Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Ρ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠΌ.
from queue import Queue
q = Queue(maxsize=1000)
q.put("eat", block=True, timeout=10)
q.put("sleep") # ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ block=True, timeout=None
q.put("code")
q.put_nowait("repeat") # ΠΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ put("repeat", block=False). ΠΡΠ»ΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠΉ ΡΠ»ΠΎΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ queue.Full
print(q.queue)
a = q.get(block=True, timeout=10) # Π£Π΄Π°Π»ΠΈΡΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠΈΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈΠ· FIFO
b = q.get() # ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ block=True, timeout=None
c = q.get_nowait() # ΠΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ get(False)
print(a, b, c, q.queue)
deque(['eat', 'sleep', 'code', 'repeat'])
eat sleep code deque(['repeat'])
ΠΠΈΠ½Π°ΡΠ½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ (binary tree)
ΠΠ΅ΡΠ°ΡΡ ΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΡΡΡΠΊΡΡΡΠ° Π΄Π°Π½Π½ΡΡ , Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ·Π΅Π» ΠΈΠΌΠ΅Π΅Ρ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡΡ ΠΏΠΎΡΠΎΠΌΠΊΠΎΠ². ΠΡΡΡΠΎΠ΅Π½Π½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ, Π½ΡΠΆΠ½ΠΎ ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΡ. ΠΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π΅ΡΠ΅Π²ΡΡ Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌΠΈ, ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΠ΅ Π½ΠΈΠΆΠ΅.
ΠΡΡΠ° (heap)
ΠΠΈΠ½Π°ΡΠ½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ, ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡΠ΅Π΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΊΡΡΠΈ: Π΅ΡΠ»ΠΈ B ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ·Π»ΠΎΠΌ-ΠΏΠΎΡΠΎΠΌΠΊΠΎΠΌ ΡΠ·Π»Π° A, ΡΠΎ ΠΊΠ»ΡΡ(A) β₯ ΠΊΠ»ΡΡ(B). ΠΡΡΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΎΡΠ΅ΡΠ΅Π΄ΡΡ Ρ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠΌ ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠ΅Π³ΠΎ Π΄Π²Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ β Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈ ΠΈΠ·Π²Π»Π΅ΡΡ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ (ΠΈΠ»ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ).
Π Python min-ΠΊΡΡΠ° (Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅Π³Π΄Π° Π»Π΅ΠΆΠΈΡ Π² ΠΊΠΎΡΠ½Π΅) ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π½Π° Π±Π°Π·Π΅ ΡΠΏΠΈΡΠΊΠ° ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ heapq. ΠΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½Π° max-ΠΊΡΡΠ°, Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Π² ΠΊΠΎΡΠ½Π΅, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠΎΠ²Π΅ΡΠ°ΠΌΠΈ ΡΠΎ Stackoverflow.
import heapq
h = [211, 1, 43, 79, 12, 5, -10, 0]
heapq.heapify(h) # ΠΡΠ΅Π²ΡΠ°ΡΠ°Π΅ΠΌ ΡΠΏΠΈΡΠΎΠΊ Π² ΠΊΡΡΡ
print(h)
heapq.heappush(h, 2) # ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΠ»Π΅ΠΌΠ΅Π½Ρ
print(h)
m = heapq.heappop(h) # ΠΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ
print(h, m)
[-10, 0, 5, 1, 12, 211, 43, 79]
[-10, 0, 5, 1, 12, 211, 43, 79, 2]
[0, 1, 5, 2, 12, 211, 43, 79] -10
ΠΡΠΎΠ±Π΅ΠΆΠΈΠΌΡΡ ΠΊΠΎΡΠΎΡΠ΅Π½ΡΠΊΠΎ ΠΏΠΎ ΠΎΡΡΠ°Π»ΡΠ½ΡΠΌ ΡΡΡΡΠΊΡΡΡΠ°ΠΌ Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ Π² Python Π½Π΅ ΠΈΠΌΠ΅ΡΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ, Π½ΠΎ, ΡΠ΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΌΠΎΠ³ΡΡ Π²Π΅ΡΡΠΌΠ° ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡΡ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅.
ΠΠΈ-Π΄Π΅ΡΠ΅Π²ΠΎ (B-tree)
Π‘Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ, ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ ΠΏΠ°ΠΌΡΡΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄ΠΈΡΠΊΠΎΠ²ΡΠΌ ΡΡΡΡΠΊΡΡΡΠ°ΠΌ ΠΈΠ»ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΠΌ Π±Π°Π· Π΄Π°Π½Π½ΡΡ ); ΠΊΠ°ΠΊ Π²Π΅ΡΠ²ΠΈ, ΡΠ°ΠΊ ΠΈ Π»ΠΈΡΡΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠ±ΠΎΠΉ ΡΠΏΠΈΡΠΊΠΈ (Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΡΡΠΈΡΠ°ΡΡ ΡΠ°ΠΊΠΎΠΉ ΡΠΏΠΈΡΠΎΠΊ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡ ΠΎΠ΄ Π΄Π»Ρ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅Π³ΠΎ Π±ΡΡΡΡΠΎΠ³ΠΎ ΡΠ°Π·Π±ΠΎΡΠ° Π² ΠΠΠ£). ΠΡΠΆΠ½ΠΎ ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ. ΠΠΈΠ±ΠΎ β Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠΉ Π² Python ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ sqlite3, ΡΡΠ° ΠΠ ΠΊΠ°ΠΊ ΡΠ°Π· ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π½Π° Π±ΠΈ-Π΄Π΅ΡΠ΅Π²Π΅.
ΠΡΠ°ΡΠ½ΠΎ-ΡΠ΅ΡΠ½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ
Π‘Π°ΠΌΠΎΠ±Π°Π»Π°Π½ΡΠΈΡΡΡΡΠ΅Π΅ΡΡ Π΄Π²ΠΎΠΈΡΠ½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ ΠΏΠΎΠΈΡΠΊΠ°, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ΅Π΅ Π±ΡΡΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ: Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅, ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠΈΡΠΊ ΡΠ·Π»Π°. Π‘Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡ Π΄ΠΎΡΡΠΈΠ³Π°Π΅ΡΡΡ Π·Π° ΡΡΡΡ Π²Π²Π΅Π΄Π΅Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ·Π½Π°ΠΊΠ° ΡΠ·Π»Π° Π΄Π΅ΡΠ΅Π²Π° β Β«ΡΠ²Π΅ΡΠ°Β». ΠΡΠΎΡ Π°ΡΡΠΈΠ±ΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π΄Π²ΡΡ
Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ β Β«ΡΡΡΠ½ΡΠΉΒ» ΠΈΠ»ΠΈ Β«ΠΊΡΠ°ΡΠ½ΡΠΉΒ». ΠΠΈΡΡΠΎΠ²ΡΠ΅ ΡΠ·Π»Ρ ΠΠ§ Π΄Π΅ΡΠ΅Π²ΡΠ΅Π² Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ Π΄Π°Π½Π½ΡΡ
, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅ ΡΡΠ΅Π±ΡΡΡ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ β Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π² ΡΠ·Π»Π΅-ΠΏΡΠ΅Π΄ΠΊΠ΅ Π½ΡΠ»Π΅Π²ΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΏΠΎΡΠΎΠΌΠΊΠ°. ΠΡΠΆΠ½ΠΎ ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ ΡΠΈΡΠ°Π»ΠΈ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠΈ ΡΠΎΠ±Π΅ΡΠ΅Π΄ΠΎΠ²Π°Π½ΠΈΠΈ Π² FAANG ΠΏΡΠ΅ΡΠ΅Π½Π΄Π΅Π½ΡΠΎΠ² Β«Π·Π°ΡΡΠ°Π²Π»ΡΡΡ ΠΊΡΡΡΠΈΡΡ ΠΊΡΠ°ΡΠ½ΠΎ-ΡΠ΅ΡΠ½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ Π½Π° Π΄ΠΎΡΠΊΠ΅Β». ΠΡΠΎ Β«ΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅Β» ΠΈ Π΅ΡΡΡ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΠΊΠ°, ΠΏΠΎΡΠ»Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π²ΡΡΠ°Π²ΠΊΠΈ ΠΈΠ»ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π΄Π΅ΡΠ΅Π²ΠΎ Π½ΡΠΆΠ½ΠΎ ΠΎΡΠ±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ, Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΡΠΌ ΠΎΠ±ΡΠ΅ΠΌΠΎΠΌ ΠΊΠΎΠ΄Π° Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΡΡΡ Π·Π΄Π΅ΡΡ ΠΈΠ»ΠΈ Π·Π΄Π΅ΡΡ.
ΠΠΠ-Π΄Π΅ΡΠ΅Π²ΠΎ
Π ΠΠΠ-Π΄Π΅ΡΠ΅Π²ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π²ΡΡΠ°Π²ΠΊΠΈ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, ΡΠ΅ΠΌ Π² ΠΊΡΠ°ΡΠ½ΠΎ-ΡΠ΅ΡΠ½ΡΡ Π΄Π΅ΡΠ΅Π²ΡΡΡ (ΠΏΡΠΈ ΡΠΎΠΌ ΠΆΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ Π»ΠΈΡΡΡΠ΅Π² ΠΊΡΠ°ΡΠ½ΠΎ-ΡΡΡΠ½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²ΡΡΠ΅ ΠΠΠ-Π΄Π΅ΡΠ΅Π²Π°, Π½ΠΎ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ Π² 1,388 ΡΠ°Π·Π°). ΠΠΎΠΈΡΠΊ ΠΆΠ΅ Π² ΠΠΠ-Π΄Π΅ΡΠ΅Π²Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π±ΡΡΡΡΠ΅Π΅ (ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΡΠ°Π·Π½ΠΈΡΠ° Π² ΡΠΊΠΎΡΠΎΡΡΠΈ ΠΏΠΎΠΈΡΠΊΠ° ΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ 39 %). ΠΡΠΆΠ½ΠΎ ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ.
ΠΡΠ΅ΡΠΈΠΊΡΠ½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ
ΠΡΠ΅ΡΠΈΠΊΡΠ½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ (ΠΈΠ»ΠΈ trie) β ΡΡΡΡΠΊΡΡΡΠ° Π΄Π°Π½Π½ΡΡ , ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ°Ρ Ρ ΡΠ°Π½ΠΈΡΡ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ², ΠΊΠ»ΡΡΠ°ΠΌΠΈ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ²Π»ΡΡΡΡΡ ΡΡΡΠΎΠΊΠΈ. ΠΡΠΆΠ½ΠΎ ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ.
Π’Π°Π±Π»ΠΈΡΠ° Π²ΡΠ±ΠΎΡΠ° ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ
Π ΠΊΠ²Π°Π΄ΡΠ°ΡΠ½ΡΡ ΡΠΊΠΎΠ±ΠΊΠ°Ρ ΠΏΠΎΠΊΠ°Π·Π°Π½ Ρ ΡΠ΄ΡΠΈΠΉ ΡΠ»ΡΡΠ°ΠΉ.
Π‘ΡΡΡΠΊΡΡΡΠ° | Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ | ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ | ΠΠ½Π΄Π΅ΠΊΡΠ°ΡΠΈΡ | ΠΠΎΠΈΡΠΊ | ΠΡΡΠ°Π²ΠΊΠ° | Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ | ΠΠ°ΠΌΡΡΡ |
---|---|---|---|---|---|---|---|
ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ°ΡΡΠΈΠ² | list | 1 | n | n | n | n | |
Π₯ΡΡ ΡΠ°Π±Π»ΠΈΡΠ° | dict, set | 1 [n] |
1 [n] |
1 [n] |
n | ||
ΠΠ°ΡΡΠΈΠ² | array, bytes, bytearray | ΠΠ»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΡΠΈΠΏΠ½ΡΡ Π΄Π°Π½Π½ΡΡ | 1 | n | n | n | n |
ΠΠ΄Π½ΠΎΡΠ²ΡΠ·Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ | - (~deque) | n | n | 1 | 1 | n | |
ΠΠ²ΡΡΠ²ΡΠ·Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ | deque | FIFO, LIFO | n | n | 1 | 1 | n |
ΠΠΈΠ½Π°ΡΠ½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ | - | logn [n] |
logn [n] |
logn [n] |
logn [n] |
n | |
ΠΡΡΠ° | heapq | ΠΡΠ΅ΡΠ΅Π΄Ρ Ρ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠΌ | 1 (find min) |
logn | logn (del min) |
n | |
B-tree (ΠΠΈ-Π΄Π΅ΡΠ΅Π²ΠΎ) | ~sqlite | ΠΠ»Ρ ΠΏΠ°ΠΌΡΡΠΈ Ρ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠΌ Π΄ΠΎΡΡΡΠΏΠΎΠΌ | logn | logn | logn | logn | n |
ΠΠ§ Π΄Π΅ΡΠ΅Π²ΠΎ | - | logn | logn | logn | logn | n | |
ΠΠΠ Π΄Π΅ΡΠ΅Π²ΠΎ | - | logn | logn | logn | logn | n | |
ΠΡΠ΅ΡΠΈΠΊΡΠ½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ | - | T9, Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΡ ΠΎβΠΠΎΡΠ°ΡΠΈΠΊ, Π°Π»Π³ΠΎΡΠΈΡΠΌ LZW |
key | key | key |
ΠΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ (Enum, IntEnum)
Π£Π΄ΠΎΠ±Π½ΡΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π·Π°ΡΠ°Π½Π΅Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΠΉ.
from enum import Enum, auto
import random
class Currency(Enum):
euro = 1
us_dollar = 2
yuan = auto()
local_currency = Currency.us_dollar
print(local_currency)
local_currency = Currency["us_dollar"] # ΠΠΎΠΆΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ KeyError
print(local_currency)
local_currency = Currency(2) # ΠΠΎΠΆΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ValueError
print(local_currency)
print(local_currency.name)
print(local_currency.value)
list_of_members = list(Currency)
member_names = [e.name for e in Currency]
member_values = [e.value for e in Currency]
random_member = random.choice(list(Currency))
print(list_of_members, "\n",
member_names, "\n",
member_values, "\n",
random_member)
Currency.us_dollar
Currency.us_dollar
Currency.us_dollar
us_dollar
2
[<Currency.euro: 1>, <Currency.us_dollar: 2>, <Currency.yuan: 3>]
['euro', 'us_dollar', 'yuan']
[1, 2, 3]
Currency.euro
Π¦Π΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ (range)
range() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΠΌΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠΈΡΠ΅Π», ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ Π·Π°Π΄Π°ΡΡΠΈΠΊ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π΄Π»Ρ ΡΠΈΠΊΠ»Π° for.
r1: range = range(11) # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠΈΡΠ΅Π» ΠΎΡ 0 Π΄ΠΎ 10
r2: range = range(5, 21) # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠΈΡΠ΅Π» ΠΎΡ 5 Π΄ΠΎ 20
r3: range = range(20, 9, -2) # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠΈΡΠ΅Π» ΠΎΡ 20 Π΄ΠΎ 10 Ρ ΡΠ°Π³ΠΎΠΌ 2
print("To exclusive: ", end="")
for i in r1:
print(f"{i} ", end="")
print("\nFrom inclusive to exclusive: ", end="")
for i in r2:
print(f"{i} ", end="")
print("\nFrom inclusive to exclusive with step: ", end="")
for i in r3:
print(f"{i} ", end="")
print(f"\nFrom = {r3.start}")
print(f"To = {r3.stop}")
To exclusive: 0 1 2 3 4 5 6 7 8 9 10
From inclusive to exclusive: 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
From inclusive to exclusive with step: 20 18 16 14 12 10
From = 20
To = 9
ΠΠ»Π°ΡΡΡ Π΄Π°Π½Π½ΡΡ (dataclass)
ΠΠ΅ΠΊΠΎΡΠ°ΡΠΎΡ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠ·Π΄Π°ΡΡΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄Ρ init(), repr() ΠΈ eq(). ΠΡΠΆΠ΅Π½ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ², Π³Π»Π°Π²Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ ΠΊΠΎΡΠΎΡΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ . ΠΠ½Π½ΠΎΡΠ°ΡΠΈΠΈ ΡΠΈΠΏΠΎΠ² ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Ρ. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΠ°Ρ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ attrs.
from dataclasses import dataclass
from decimal import *
from datetime import datetime
@dataclass
class Transaction:
value: Decimal
issuer: str = "Default Bank"
dt: datetime = datetime.now()
t1 = Transaction(value=1000_000, issuer="Deutsche Bank", dt = datetime(2022, 1, 1, 12))
t2 = Transaction(1000)
print(t1)
print(t2)
Transaction(value=1000000, issuer='Deutsche Bank', dt=datetime.datetime(2022, 1, 1, 12, 0))
Transaction(value=1000, issuer='Default Bank', dt=datetime.datetime(2022, 9, 6, 17, 50, 36, 162897))
Dataclass ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΄Π΅Π»Π°Π½ ΠΈΠΌΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΡΠΌ Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²ΠΎΠΉ frozen=True.
from dataclasses import dataclass
@dataclass(frozen=True)
class User:
name: str
account: int
ΠΠΈΠ½Π°ΡΠ½Π°Ρ Π·Π°ΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° (struct)
ΠΠ°ΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° (ΠΈ ΡΠ°ΡΠΏΠ°ΠΊΠΎΠ²ΠΊΠ°, ΡΠ°Π·ΡΠΌΠ΅Π΅ΡΡΡ) Π΄Π°Π½Π½ΡΡ
Π² Π±Π°ΠΉΡΠΎΠ²ΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Ρ ΠΏΡΠ΅Π΄ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΠΌΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π΄Π°Π½Π½ΡΡ
, ΠΈΡ
ΠΏΠΎΡΡΠ΄ΠΊΠ° Π² ΡΡΡΡΠΊΡΡΡΠ΅, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΡΡΠ΄ΠΊΠ° Π±Π°ΠΉΡ Π΄Π»Ρ ΠΌΠ½ΠΎΠ³ΠΎΠ±Π°ΠΉΡΠΎΠ²ΡΡ
ΡΠΈΠΏΠΎΠ² Π΄Π°Π½Π½ΡΡ
. ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠ΅Π²ΡΠ°ΡΠ°ΡΡ Python-ΠΎΠ²ΡΠΊΠΈΠΉ int Π², Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, short int ΠΈΠ»ΠΈ long int (ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΏΡΠΎ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠΈΠΏΠΎΠ² ΡΠ·ΡΠΊΠ° Π‘ΠΈ).
ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ ΡΠΎ ΡΡΡΡΠΊΡΡΡΠ°ΠΌΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π·Π½Π°ΡΡ, ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ little-endian ΠΈ big-endian, Π° ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ Π·Π°Π±ΡΠ²Π°ΡΡ, ΡΡΠΎ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠΈΠΏΠ° Π΄Π°Π½Π½ΡΡ
Π² Π‘ΠΈ Π±ΡΠ²Π°Π΅Ρ ΡΠ°Π·Π½ΡΠΌ.
from struct import pack, unpack, iter_unpack
b = pack(">hhll", 1, 2, 3, 4)
print(b)
t = unpack(">hhll", b)
print(t)
i = pack("ii", 1, 2) * 5
print(i)
print(list(iter_unpack('ii', i)))
b'\x00\x01\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04'
(1, 2, 3, 4)
b'\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00'
[(1, 2), (1, 2), (1, 2), (1, 2), (1, 2)]
Π‘ΡΡΠΎΠΊΠ° (string)
Π‘ΡΡΠΎΠΊΠΈ Π² Python 3 β ΠΈΠΌΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΡ Unicode.
se: str = "" # ΠΡΡΡΠ°Ρ ΡΡΡΠΎΠΊΠ°
si: str = str(12345) # Π‘ΠΎΠ·Π΄Π°Π΅Ρ ΡΡΡΠΎΠΊΡ ΠΈΠ· ΡΠΈΡΠ»Π°
sj: str = " ".join(["Follow", "the", "white", "rabbit"]) # Π‘ΠΎΠ±ΠΈΡΠ°Π΅Ρ ΡΡΡΠΎΠΊΡ ΠΈΠ· ΠΊΡΡΠΎΡΠΊΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ ΡΠ΅ΠΏΠ°ΡΠ°ΡΠΎΡ
print(f"Joined string: {sj}")
is_contains: bool = "rabbit" in sj # ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π°Π»ΠΈΡΠΈΡ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠΈ
is_startswith = sj.startswith("Foll")
is_endswith = sj.endswith("bbit")
print(f"is_contains = {is_contains}, is_startswith = {is_startswith}, is_endswith = {is_endswith}")
sr: str = sj.replace("rabbit", "sheep") # ΠΠ°ΠΌΠ΅Π½Π° ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠΈ. ΠΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΌΠ΅Π½: sr: str = sj.replace("rabbit", "sheep", times)
print(f"After replace: {sr}")
i1 = sr.find("rabbit") # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠ°ΡΡΠΎΠ²ΡΠΉ ΠΈΠ½Π΄Π΅ΠΊΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π²Ρ
ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ -1. ΠΡΡΡ Π΅ΡΠ΅ rfind(), Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΠΉ ΠΈΡΠΊΠ°ΡΡ Ρ ΠΊΠΎΠ½ΡΠ° ΡΡΡΠΎΠΊΠΈ
i2 = sr.index("sheep") # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠ°ΡΡΠΎΠ²ΡΠΉ ΠΈΠ½Π΄Π΅ΠΊΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π²Ρ
ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π²ΡΠΊΠΈΠ΄ΡΠ²Π°Π΅Ρ ValueError. ΠΡΡΡ Π΅ΡΠ΅ rindex(), Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΠΉ ΠΈΡΠΊΠ°ΡΡ Ρ ΠΊΠΎΠ½ΡΠ° ΡΡΡΠΎΠΊΠΈ
print(f"Start index of 'rabbit' is {i1}, start index of 'sheep' is {i2}")
d = str.maketrans({"a" : "x", "b" : "y", "c" : "z"})
st = "abc".translate(d)
print(f"Translate string: {st}")
sr = sj[::-1] # Π Π΅Π²Π΅ΡΡ ΡΠ΅ΡΠ΅Π· slice Ρ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΌ ΡΠ°Π³ΠΎΠΌ
print(f"Reverse string: {sr}")
Joined string: Follow the white rabbit
is_contains = True, is_startswith = True, is_endswith = True
After replace: Follow the white sheep
Start index of 'rabbit' is -1, start index of 'sheep' is 17
Translate string: xyz
Reverse string: tibbar etihw eht wolloF
Datetime
ΠΠ»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π΄Π°ΡΠ°ΠΌΠΈ ΠΈ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ Π² datetime Π΅ΡΡΡ ΡΠΈΠΏΡ date, time, datetime ΠΈ timedelta. ΠΡΠ΅ ΠΎΠ½ΠΈ Ρ Π΅ΡΠΈΡΡΠ΅ΠΌΡ ΠΈ ΠΈΠΌΠΌΡΡΠ°Π±Π΅Π»ΡΠ½Ρ.
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ
from datetime import date, time, datetime, timedelta
d: date = date(year=1964, month=9, day=2)
t: time = time(hour=12, minute=30, second=0, microsecond=0, tzinfo=None, fold=0)
dt: datetime = datetime(year=1964, month=9, day=2, hour=10, minute=30, second=0)
td: timedelta = timedelta(weeks=1, days=1, hours=12, minutes=13, seconds=14)
print (f"{d}\n {t}\n {dt}\n {td}")
1964-09-02
12:30:00
1964-09-02 10:30:00
8 days, 12:13:14
Now
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π΄Π°ΡΡ ΠΈΠ»ΠΈ Π΄Π°ΡΡ/Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
from datetime import date, datetime
import pytz
import time
d: date = date.today()
dt1: datetime = datetime.today()
dt2: datetime = datetime.utcnow()
dt3: datetime = datetime.now(pytz.timezone('US/Pacific'))
t1 = time.time() # ΠΠΏΠΎΡ
Π° Unix
t2 = time.ctime()
print (f"{d}\n {dt1}\n {dt2}\n {dt3}\n {t1}\n {t2}")
2022-09-27
2022-09-27 09:47:02.430474
2022-09-27 04:47:02.430474
2022-09-26 21:47:02.430474-07:00
1664254022.4304743
Tue Sep 27 09:47:02 2022
Timezone
Π§Π°ΡΠΎΠ²ΡΠ΅ ΠΏΠΎΡΡΠ°.
from datetime import date, time, datetime, timedelta, tzinfo
from dateutil.tz import UTC, tzlocal, gettz, datetime_exists, resolve_imaginary
tz1: tzinfo = UTC # Π§Π°ΡΠΎΠ²ΠΎΠΉ ΠΏΠΎΡΡ UTC
tz2: tzinfo = tzlocal() # ΠΠ΅ΡΡΠ½ΡΠΉ ΡΠ°ΡΠΎΠ²ΠΎΠΉ ΠΏΠΎΡΡ
tz3: tzinfo = gettz() # ΠΠ΅ΡΡΠ½ΡΠΉ ΡΠ°ΡΠΎΠ²ΠΎΠΉ ΠΏΠΎΡΡ
tz4: tzinfo = gettz("America/Chicago") # ΠΠ»ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, "Asia/Kolkata". ΠΠΎΠ»Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ: en.wikipedia.org/wiki/List_of_tz_database_time_zones
local_dt = datetime.today()
utc_dt = local_dt.astimezone(UTC) # ΠΠΎΠ½Π²Π΅ΡΡΠ°ΡΠΈΡ ΠΌΠ΅ΡΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ° Π² ΡΠ°ΡΠΎΠ²ΠΎΠΉ ΠΏΠΎΡΡ UTC
print (f"{tz1}\n {tz2}\n {tz3}\n {tz4}\n {local_dt}\n {utc_dt}")
tzutc()
tzlocal()
tzlocal()
tzfile('US/Central')
2022-09-27 09:19:35.399362
2022-09-27 04:19:35.399362+00:00
ΠΠ΅Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΎΡΡΡΡΠΏΠ»Π΅Π½ΠΈΠ΅
ΠΠΎΠ·Π²ΠΎΠ»Ρ ΡΠ΅Π±Π΅ ΠΊΡΠΎΡΠ΅ΡΠ½ΡΡ ΡΠ΅ΠΌΠ°ΡΠΊΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ»Π° Π±Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π΅ΡΠΌΠ΅ΡΡΠ½Π° Π½ΠΈ Π² Π½Π°ΡΠ°Π»Π΅ ΡΡΠ°ΡΡΠΈ (ΠΊΠΎΠ³Π΄Π° Π²Ρ ΡΠΎΠ»ΡΠΊΠΎ Π²Π·Π²Π΅ΡΠΈΠ²Π°Π»ΠΈ Π΅Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΡΡΡ) Π½ΠΈ, ΡΠ΅ΠΌ Π±ΠΎΠ»Π΅Π΅, Π² ΠΊΠΎΠ½ΡΠ΅ (ΡΡΠΎΠ±Ρ Π½Π΅ ΠΏΠΎΡΡΠΈΡΡ ΠΏΠΎΡΠ»Π΅Π²ΠΊΡΡΠΈΡ). Π Π°Π· ΡΠΆ Π²Ρ, ΠΏΡΠΎΡΠΈΡΠ°Π² Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΊΡΡΠΎΠΊ ΡΡΠΎΠ³ΠΎ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π°, Π½Π΅Π²ΠΎΠ»ΡΠ½ΠΎ Π²Π΅ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π»ΠΈ ΡΠ΅Π±Ρ ΠΊΠ°ΠΊ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΠ΅Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΉ ΠΈΠ½Π΄ΡΡΡΡΠΈΠΈ, ΠΏΡΠΈΡΡΠΌ, ΠΊΠ°ΠΊ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠ°, Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅Π³ΠΎ Ρ ΠΊΠΎΠ΄ΠΎΠΌ, ΡΠΎ, ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π΅ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅Π½ΡΠ»Π΅Π²Π°Ρ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π²Ρ ΠΈΡΠ΅ΡΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊΠ°. ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ Ρ, Π°Π²ΡΠΎΡ ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠΈ, ΠΈΡΡ Π½ΠΎΠ²ΡΡ ΡΠ°Π±ΠΎΡΡ, ΠΈ Π΅ΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ΅Π½ middle backend Python-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡ, ΡΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°Ρ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅Ρ ΠΌΠΎΡ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΡΡΠ°.
ΠΠΎΠ»ΡΡΡΡ ΡΠ°ΡΡΡ ΡΠ²ΠΎΠ΅ΠΉ ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ Ρ ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Π» Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π½Π° Π±Π°Π·Π΅ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ², 50/50 Π·Π°Π½ΠΈΠΌΠ°ΡΡΡ ΡΡ Π΅ΠΌΠΎΡΠ΅Ρ Π½ΠΈΠΊΠΎΠΉ ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. ΠΠΎΠ΅ΠΉ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ Β«ΠΆΠ΅Π»Π΅Π·ΡΡΠ½ΠΎΠΉΒ» ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ ΡΡΠ°Π» Π΄Π²Π°Π΄ΡΠ°ΡΠΈΠΏΡΡΠΈΠ³ΠΈΠ³Π°Π±ΠΈΡΠ½ΡΠΉ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡ Π½Π° Π±Π°Π·Π΅ ΡΠ΅ΡΡΠ½Π°Π΄ΡΠ°ΡΠΈΡΠ΄Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° (Π·Π²ΡΡΠΈΡ ΠΊΠ°ΠΊ Π·Π°ΠΊΠ»ΠΈΠ½Π°Π½ΠΈΠ΅ ΠΈΠ· Β«ΠΠ°ΡΡΠΈ ΠΠΎΡΡΠ΅ΡΠ°Β» :), ΡΡΠΎ ΠΏΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΠΌΠ°ΡΠ΅ΡΠΈΠ½ΡΠΊΠΎΠΉ ΠΏΠ»Π°ΡΠ΅ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ°, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Ρ ΠΏΠ΅ΡΠ΅ΡΠ΅Π» Π² ΡΠΈΡΡΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ. ΠΠΎ ΡΡΠΎΠ³ΠΎ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΡΠ°Π±ΠΎΡΠ°Π» Ρ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠΎΠΌ, C ΠΈ C#, Π° Π½Π° Π±Π°Π·Π΅ ΡΠ²ΠΎΠΈΡ Π·Π°ΠΌΠ΅ΡΠΎΠΊ ΠΏΠΎ Π²Π½ΠΎΠ²Ρ ΠΈΠ·ΡΡΠ°Π΅ΠΌΠΎΠΌΡ Python Ρ ΠΈ Π½Π°ΠΏΠΈΡΠ°Π» ΡΡΡ ΡΡΠ°ΡΡΡ. ΠΠ° ΠΌΠΎΠΉ Π²Π·Π³Π»ΡΠ΄, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΡΠ°Π·Ρ ΠΎΠ·Π²ΡΡΠΈΡΡ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΠΌΡ ΡΠ°Π±ΠΎΡΠΎΠ΄Π°ΡΠ΅Π»Ρ ΡΠ²ΠΎΠΉ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΡΡΠΎΠ²Π΅Π½Ρ; Π·Π°Π²Π°Π»ΠΈΡΡ ΡΠΎΠ±Π΅ΡΠ΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ Π½Π΅ Π±ΠΎΡΡΡ (Π²ΡΡ ΡΠ°Π²Π½ΠΎ ΠΏΡΠΎΡΠΈΡ, ΠΏΠΎΠΎΠ±ΡΠ°ΡΡΡ Ρ ΡΠΌΠ½ΡΠΌΠΈ Π»ΡΠ΄ΡΠΌΠΈ), Π° Π²ΠΎΡ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΡΠ²ΠΎΠ΅Π³ΠΎ Π½Π΅ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΡ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎΡΡΠΈ, Π²ΡΡΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΈΡΠΏΡΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡΠΎΠΊΠ°, Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ.
Π‘ΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, Π²ΠΎΡ Π²ΡΡ, ΡΡΠΎ Ρ Ρ ΠΎΡΠ΅Π» Π±Ρ Π²Π°ΠΌ ΡΠΎΠΎΠ±ΡΠΈΡΡ: ΠΌΠΎΡ ΡΠ΅Π·ΡΠΌΠ΅, Github, Π΅ΠΌΠ΅ΠΉΠ» [email protected] ΠΈ ΡΠ΅Π»Π΅ΡΠΎΠ½ 8 917 809-89-81 (Π»ΡΡΡΠ΅ ΠΏΠΈΡΠΈΡΠ΅ Π² Telegram ΠΈΠ»ΠΈ WhatsApp).
Π ΡΠ΅ΠΏΠ΅ΡΡ Π΄Π°Π²Π°ΠΉΡΠ΅ Π²Π΅ΡΠ½ΡΠΌΡΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΡΡΡΠ»ΠΎ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΠΎΠ²Π΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ.
2. ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π΄Π°Π½Π½ΡΡ
Β«ΠΠ³Π½Π΅Π½Π½ΡΠΉ ΠΏΠΎΡΠΎΠΊ, ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°ΡΡΠΈΠΉΡΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠ»Π°ΠΌΠ΅Π½ΠΈ ΠΎΡ Π·Π΅ΠΌΠ»ΠΈ Π΄ΠΎ Π½Π΅Π±Π°, ΠΎΠΏΠΎΡΡΡΠ²Π°Π» ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Π²Π΅Π»ΠΈΡΠΈΠ½ΠΎΡ Ρ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΠΉ ΠΎΡΡΡΠΎΠ²Β».
Β«ΠΡΡΠΎΡΠΈΡ ΠΎ Π΄ΠΎΠΊΡΠΎΡΠ΅ ΠΠΎΠ³Π°Π½Π½Π΅ Π€Π°ΡΡΡΠ΅, Π·Π½Π°ΠΌΠ΅Π½ΠΈΡΠΎΠΌ ΡΠ°ΡΠΎΠ΄Π΅Π΅ ΠΈ ΡΠ΅ΡΠ½ΠΎΠΊΠ½ΠΈΠΆΠ½ΠΈΠΊΠ΅Β».
Π‘ΡΠ΅Π· (slice)
Π‘Π°ΠΌΡΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π°Π½Π½ΡΡ , ΠΏΡΠΎΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡ ΡΠ°ΡΡΡ Π΄Π°Π½Π½ΡΡ , ΠΌΠ΅ΡΡΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΎΠΉ (ΠΈΠ½Π΄Π΅ΠΊΡΡ) ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌ.
a:str = "Pack my box with five dozen liquor jugs"
start, stop = 8, 21
b:str = a[start:stop] # ΠΠ½Π°ΡΠ΅Π½ΠΈΡ ΠΎΡ start Π΄ΠΎ stop-1
c:str = a[start:] # ΠΠ½Π°ΡΠ΅Π½ΠΈΡ ΠΎΡ start Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° ΡΡΡΡΠΊΡΡΡΡ
d:str = a[:stop] # ΠΠ½Π°ΡΠ΅Π½ΠΈΡ ΠΎΡ Π½Π°ΡΠ°Π»Π° Π΄ΠΎ stop-1
e:str = a[:] # ΠΠΎΠ»Π½Π°Ρ ΠΊΠΎΠΏΠΈΡ ΡΡΡΡΠΊΡΡΡΡ
print(b, "\n",
c, "\n",
d, "\n",
e, "\n")
box with five
box with five dozen liquor jugs
Pack my box with five
Pack my box with five dozen liquor jugs
ΠΠ½Π°ΡΠ΅Π½ΠΈΡ start ΠΈ stop ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΌΠΈ, ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΎΠ·Π½Π°ΡΠ°ΡΡ, ΡΡΠΎ ΠΎΡΡΡΠ΅Ρ Π²Π΅Π΄Π΅ΡΡΡ ΠΎΡ ΠΊΠΎΠ½ΡΠ° ΡΡΡΡΠΊΡΡΡΡ. ΠΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ step, ΡΡΠΎΠ±Ρ Π½Π° Π²ΡΡ ΠΎΠ΄ ΡΡΠ΅Π·Π° ΠΏΠΎΠΏΠ°Π»ΠΈ Π½Π΅ Π²ΡΠ΅ ΠΏΠΎΠ΄ΡΡΠ΄ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· Π²Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ.
a:str = "Step on no pets"
b:str = a[-4:] # Β«Π₯Π²ΠΎΡΡΠΈΠΊΒ»
c:str = a[::-1] # Π Π΅Π²Π΅ΡΡ Π²Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ
d:str = a[4::-1] # ΠΠ΅ΡΠ²ΡΠ΅ ΡΠ΅ΡΡΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΡΠ΅Π²Π΅ΡΡΠΈΡΠΎΠ²Π°Π½Ρ
e:str = a[::2] # ΠΠ°ΠΆΠ΄ΡΠΉ Π²ΡΠΎΡΠΎΠΉ ΡΠΈΠΌΠ²ΠΎΠ»
print(b, "\n",
c, "\n",
d, "\n",
e, "\n")
pets
step on no petS
petS
Se nn es
Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° (sort, sorted)
Π ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ΅ Π²ΡΡ ΡΠ°ΠΌΠΎΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠ΅ ΡΠΏΡΡΡΠ°Π½ΠΎ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌ (ΠΌΡ Π½Π΅Π½Π°Π΄ΠΎΠ»Π³ΠΎ Π²Π΅ΡΠ½Π΅ΠΌΡΡ ΠΊ ΡΡΠΎΠΉ ΡΠ΅ΠΌΠ΅ ΡΡΡΡ Π½ΠΈΠΆΠ΅, Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Β«ΠΠ»Π³ΠΎΡΠΈΡΠΌΡΒ»), ΠΏΠΎΠΊΠ° ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠΎΠ»ΡΠΊΠΎ Python-ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ.
ΠΠ°Π΄ΠΎ ΡΠ°Π·Π»ΠΈΡΠ°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ sort() ΠΈ sorted(), ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΎΡΡΠΈΡΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅ in-place, Π²ΡΠΎΡΠΎΠΉ ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅Ρ Π½ΠΎΠ²ΡΡ ΡΡΡΡΠΊΡΡΡΡ.
a: list = [5, 2, 3, 1, 4]
b: list = sorted(a)
print(a, b)
a.sort()
print(a)
[5, 2, 3, 1, 4] [1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
Π sort(), ΠΈ sorted() ΠΈΠΌΠ΅ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ key Π΄Π»Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ΅. ΠΡΠ»ΠΈ Π²Π°ΠΌ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΠΎ Π½ΡΠ°Π²Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠ΅ΠΉ Π΄Π²Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° (ΠΈΠ»ΠΈ Π²Ρ ΠΏΡΠΈΠ²ΡΠΊΠ»ΠΈ ΠΊ cmp Π² Python 2), ΠΏΡΠΈΡΠΌΠΎΡΡΠΈΡΠ΅ΡΡ ΠΊ functools.cmp_to_key().
# Π Π΅Π³ΠΈΡΡΡΠΎΠ·Π°Π²ΠΈΡΠΈΠΌΠΎΠ΅ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΡΡΡΠΎΠΊ
dinos: str = "Dinosaurs were Big and small"
a = sorted(dinos.split())
print(a)
# Π Π΅Π³ΠΈΡΡΡΠΎΠ½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΠ΅ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΡΡΡΠΎΠΊ
dinos: str = "Dinosaurs were Big and small"
b = sorted(dinos.split(), key=str.lower)
print(b)
['Big', 'Dinosaurs', 'and', 'small', 'were']
['and', 'Big', 'Dinosaurs', 'small', 'were']
Π‘Π»ΠΎΠΆΠ½ΠΎΡΠΎΡΠΈΠ½Π΅Π½Π½ΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎ key=lambda el: el[1] ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎ key=lambda el: (el[1], el[0]).
Comprehension
Comprehension, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡΡ ΡΠΎ ΠΊΠ°ΠΊ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π² ΡΠΏΠΈΡΠΎΠΊ, ΡΠΎ ΠΊΠ°ΠΊ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡ ΡΠΏΠΈΡΠΊΠΎΠ² (ΠΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΡ), ΡΠΎ Π²ΠΎΠΎΠ±ΡΠ΅ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡΡ β ΡΠΏΠΎΡΠΎΠ± ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΏΠΈΡΠΊΠΎΠ² (Π° ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΊ Python β Π΅ΡΠ΅ ΠΈ ΡΠ»ΠΎΠ²Π°ΡΠ΅ΠΉ, ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²).
ΠΡΠΎΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, Π΅ΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° Π΄ΡΡΠ³ΠΎΠΉ ΡΠΏΠΈΡΠΎΠΊ, Π²ΠΊΠ»ΡΡΠ°ΡΡΠΈΠΉ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡ ΠΊΠ°ΠΊΠΎΠΌΡ-ΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡ ΡΡΠ»ΠΎΠ²ΠΈΡ, ΠΈΠ»ΠΈ Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌΡΠ΅ ΠΈΠ· ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-ΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌ, ΡΠΎ comprehension β ΠΏΡΠ΅ΡΠ΅Π½Π΄Π΅Π½Ρ Π½Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ β 1.
# ΠΡΠΈΠΌΠ΅ΡΡ Comprehension
a = [i+1 for i in range(10)] # list
b = {i for i in range(10) if i > 5} # set
c = (2*i+5 for i in range(10)) # iter
d = {i: i**2 for i in range(10)} # dict
print(a,"\n", b, "\n", list(c), "\n", d)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
{8, 9, 6, 7}
[5, 7, 9, 11, 13, 15, 17, 19, 21, 23]
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
Π’ΡΡ Π³Π»Π°Π²Π½ΠΎΠ΅ Π½Π΅ ΠΏΠ΅ΡΠ΅Π³Π½ΡΡΡ ΠΏΠ°Π»ΠΊΡ. ΠΡΠ»ΠΈ Π·Π°ΠΏΠΈΡΡ comprehension ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ ΠΈ Π½Π΅ΡΠΈΡΠ°Π΅ΠΌΠΎΠΉ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΠΎΠΈΡ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ Π»ΠΎΠ³ΠΈΠΊΡ Π² Β«Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΠΉΒ» ΡΠΈΠΊΠ» ΠΈΠ»ΠΈ Π² Π΄ΡΡΠ³ΠΎΠΉ Π±ΠΎΠ»Π΅Π΅ ΡΠ΄ΠΎΠ±ΠΎΡΠΈΡΠ°Π΅ΠΌΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ. Comprehension ΡΠΎΠ±Π»Π°Π·Π½ΡΠ΅Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Β«ΠΎΠ΄Π½ΠΎΡΡΡΠΎΡΠ½ΠΈΠΊΠ°ΠΌΠΈΒ» Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ, Π½ΠΎ Π½Π΅ Π·Π°Π±ΡΠ²Π°ΠΉΡΠ΅, ΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ 90 % Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠΈΡΠ°Π΅Ρ ΠΊΠΎΠ΄, ΠΈ ΡΠΎΠ»ΡΠΊΠΎ 10 % ΠΏΠΈΡΠ΅Ρ, ΡΠ°ΠΊ ΡΡΠΎ Π΅ΡΠ»ΠΈ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΠ»ΠΎΡ ΠΎΡΠΈΡΠ°Π΅ΠΌΡΠΌ, Π²Ρ ΡΡΠ»ΠΎΠΆΠ½ΠΈΡΠ΅ ΠΆΠΈΠ·Π½Ρ ΠΈ ΡΠ΅Π±Π΅, ΠΈ ΡΠ²ΠΎΠΈ ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌ.
ΠΡΡΡ Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ ΡΠ΄Π°ΡΠ½ΡΠ΅ Β«ΠΎΠ΄Π½ΠΎΡΡΡΠΎΡΠ½ΠΈΠΊΠΈΒ», Π΅ΡΡΡ Π±ΡΡΡΡΡΠ΅, Π½ΠΎ ΠΏΠ»ΠΎΡ ΠΎΡΠΈΡΠ°Π΅ΠΌΡΠ΅, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠ΅ ΠΈΠ· ΡΠΏΠΎΡΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ° (ΡΡΠΎ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΡΠ΅ΡΠ΅Π½Π½ΡΠ΅ ΠΌΠ½ΠΎΠΉ Π·Π°Π΄Π°ΡΠΊΠΈ Π½Π° leetcode), ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ comprehension Π² ΠΌΠ΅ΡΡ; Π»ΡΡΡΠ΅ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΏΠΎΠ½ΡΡΠ½ΡΠΉ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ, ΡΠ΅ΠΌ Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΡΠΉ, Π½ΠΎ ΠΎΠ±Π»ΠΎΠΆΠ΅Π½Π½ΡΠΉ ΠΏΠΎΡΡΠ½Π΅Π½ΠΈΡΠΌΠΈ (Π΅ΡΠ»ΠΈ Π½Π΅Ρ ΠΎΡΠΎΠ±ΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΡΠ°ΠΌΠΎ ΡΠΎΠ±ΠΎΠΉ).
ΠΡΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎ list comprehension:
# new_list = [expression for member in iterable (if conditional)]
fruits: list = ["Lemon", "Apple", "Banana", "Kiwi", "Watermelon", "Pear"]
e_fruits = [fruit for fruit in fruits if "e" in fruit]
# β ΡΡΠ»ΠΎΠ²ΠΈΠ΅
print(e_fruits)
upper_fruits = [fruit.upper() for fruit in fruits]
# β Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
print(upper_fruits)
# ΠΡΠΈΠΌΠ΅Ρ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° Π½Π° ΡΡΠ°Π³ΠΌΠ΅Π½ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ
chunk_len = 2
chunk_fruits = [fruits[i:i + chunk_len] for i in range(0, len(fruits), chunk_len)]
print(chunk_fruits)
['Lemon', 'Apple', 'Watermelon', 'Pear']
['LEMON', 'APPLE', 'BANANA', 'KIWI', 'WATERMELON', 'PEAR']
[['Lemon', 'Apple'], ['Banana', 'Kiwi'], ['Watermelon', 'Pear']]
Dict comprehension, Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π² ΡΠ»ΠΎΠ²Π°ΡΡ:
# new_dict = {expression for member in iterable (if conditional)}
d: dict = {"Italy": "Pizza", "US": "Hot-Dog", "China": "Dim Sum", "South Korea": "Kimchi"}
print(d)
a: dict = {k: v for k, v in d.items() if "i" in v} # ΠΠ΅ΡΠ½Π΅Ρ Π½ΠΎΠ²ΡΠΉ ΡΠ»ΠΎΠ²Π°ΡΡ, ΠΎΡΡΠΈΠ»ΡΡΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
print(a)
b: dict = {k: v for k, v in d.items() if "i" in k} # ΠΠ΅ΡΠ½Π΅Ρ Π½ΠΎΠ²ΡΠΉ ΡΠ»ΠΎΠ²Π°ΡΡ, ΠΎΡΡΠΈΠ»ΡΡΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΠΎ ΠΊΠ»ΡΡΡ
print(b)
c: dict = {k: v for k, v in d.items() if len(v) >= 7} # ΠΠ΅ΡΠ½Π΅Ρ Π½ΠΎΠ²ΡΠΉ ΡΠ»ΠΎΠ²Π°ΡΡ, ΠΎΡΡΠΈΠ»ΡΡΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΠΎ Π΄Π»ΠΈΠ½Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ
print(c)
{'Italy': 'Pizza', 'US': 'Hot-Dog', 'China': 'Dim Sum', 'South Korea': 'Kimchi'}
{'Italy': 'Pizza', 'China': 'Dim Sum', 'South Korea': 'Kimchi'}
{'China': 'Dim Sum'}
{'US': 'Hot-Dog', 'China': 'Dim Sum'}
ΠΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠΈΠ³ΡΠ°ΡΡΡΡ Ρ set comprehension. ΠΠ΅ Π·Π°Π±ΡΠ²Π°ΠΉΡΠ΅, ΡΡΠΎ set Β«ΠΏΠ΅ΡΠ΅Π²Π°ΡΠΈΠ²Π°Π΅ΡΒ» ΡΠΎΠ»ΡΠΊΠΎ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ ΡΠΎ, Π½Π° ΡΡΠΎ ΡΠ°ΡΡΡΠΈΡΡΠ²Π°Π»ΠΈ.
ΠΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΠ²ΠΎΠΈΡΡ nested (Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΉ) comprehension, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π²ΠΈΠ΄Π° [[func(y) for y in x] for x in n]. ΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π΄Π²ΡΠΌΠ΅ΡΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ², ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΡΡΠ΅Π΄Π½Π΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΡΡ ΠΏΠ»Π°Π²Π½ΠΎ Π½Π°ΡΠ°ΡΡΠ°Π΅Ρ Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΏΡΠ°Π²ΠΎΠΌΡ Π½ΠΈΠΆΠ½Π΅ΠΌΡ ΡΠ³Π»Ρ (Π΅ΡΠ»ΠΈ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ, Π³ΠΎΡΠΎΠ²ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π΅ΡΡΡ ΡΡΡΡ Π½ΠΈΠΆΠ΅, Π² ΠΊΠΎΠ΄Π΅, ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ matplotlib).
ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π°Π΄ ΡΡΡΠΎΠΊΠ°ΠΌΠΈ. lower(), upper(), capitalize() ΠΈ title()
s: str = "camelCase string"
print(s.lower())
print(s.upper())
print(s.capitalize())
print(s.title())
camelcase string
CAMELCASE STRING
Camelcase string
Camelcase String
strip()
s: str = " ~~##A big blahblahblah##~~ "
s = s.strip() # Strips all whitespace characters from both ends
print(s)
s = s.strip("~#") # Strips all passed characters from both ends
print(s)
s = s.lstrip(" A") # Strips all passed characters from left end
print(s)
s = s.rstrip("habl") # Strips all passed characters from right end
print(s)
~~##A big blahblahblah##~~
A big blahblahblah
big blahblahblah
big
split()
s1: str = "Follow the white rabbit, Neo"
c1 = s1.split() # Splits on one or more whitespace characters
print(c1)
c2 = s1.split(sep=", ", maxsplit=1) # Splits on "sep" str at most "maxsplit" times
print(c2)
s2: str = "Beware the Jabberwock, my son!\n The jaws that bite, the claws that catch!"
c3 = s2.splitlines(keepends=False) # On [\n\r\f\v\x1c-\x1e\x85\u2028\u2029] and \r\n.
print(c3)
# split() vs rsplit()
c4 = s2.split(maxsplit=2)
c5 = s2.rsplit(maxsplit=2)
print(c4, c5)
['Follow', 'the', 'white', 'rabbit,', 'Neo']
['Follow the white rabbit', 'Neo']
['Beware the Jabberwock, my son!', ' The jaws that bite, the claws that catch!']
['Beware', 'the', 'Jabberwock, my son!\n The jaws that bite, the claws that catch!'] ['Beware the Jabberwock, my son!\n The jaws that bite, the claws', 'that', 'catch!']
ord(), chr()
s1: str = "abcABC!"
for ch in s1:
print(f"{ch} -> {ord(ch)}") # Returns an integer representing the Unicode character
nums = [72, 101, 108, 108, 111, 33]
for num in nums:
print(f"{num} -> {chr(num)}")
a -> 97
b -> 98
c -> 99
A -> 65
B -> 66
C -> 67
! -> 33
72 -> H
101 -> e
108 -> l
108 -> l
111 -> o
33 -> !
Regex
Π Π΅Π³ΡΠ»ΡΡΠ½ΡΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ β ΠΎΡΠ΄Π΅Π»ΡΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡΡ Π·Π½Π°Π½ΠΈΠΉ, ΠΈ Π²Π΅ΡΡΠΌΠ°-Π²Π΅ΡΡΠΌΠ° Π½Π΅ΠΏΡΠΎΡΡΠ°Ρ ΠΎΠ±Π»Π°ΡΡΡ. Π’ΡΡ, ΠΏΠΎΠΆΠ°Π»ΡΠΉ, ΡΠ°ΠΌΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π΄Π»Ρ Π±ΠΎΡΠΎΠ΄Π°ΡΠΎΠΉ ΡΡΡΠΊΠΈ ΠΏΡΠΎ ΡΠΎ, ΡΡΠΎ Π΅ΡΠ»ΠΈ Π²Ρ ΡΠ΅ΡΠΈΠ»ΠΈ ΡΠ²ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ β ΡΠ΅ΠΏΠ΅ΡΡ Ρ Π²Π°Ρ Π΄Π²Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
Π Π΅Π³ΡΠ»ΡΡΠΊΠΈ ΠΏΠΎΡ ΠΎΠΆΠΈ Π½Π° Π²Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² Π²ΠΎΠ΄Ρ Π½Π° ΠΏΠ»ΡΠΆΠ΅ ΠΎΡΡΡΠΎΠ²Π° ΠΡΠ°ΠΌ Π² ΡΡΠΎΡΠΎΠ½Ρ ΠΠ°ΡΠΈΠ°Π½ΡΠΊΠΎΠΉ Π²ΠΏΠ°Π΄ΠΈΠ½Ρ β Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° Π²Ρ Π΄ΡΠΌΠ°Π΅ΡΠ΅, ΡΡΠΎ ΠΏΠΎΠ³ΡΡΠ·ΠΈΠ»ΠΈΡΡ ΡΠ΅Π°Π»ΡΠ½ΠΎ Π³Π»ΡΠ±ΠΎΠΊΠΎ, ΡΠΎ, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, Π²Ρ ΠΏΡΠΎΡΡΠΎ Π½Π΅ Π²ΠΈΠ΄ΠΈΡΠ΅ Π²ΠΏΠ΅ΡΠ΅Π΄ΠΈΠ»Π΅ΠΆΠ°ΡΠ΅ΠΉ Π±Π΅Π·Π΄Π½Ρ. ΠΠΎ β Π·Π½Π°ΡΡ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ, Ρ ΠΎΡΡ Π±Ρ Π½Π° Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ΅Π»ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° Π·Π°Π΄Π°Ρ, Π° ΡΠΎ, ΡΡΠΎ Π²ΡΡΡΠΊΠΈΠ΅ ΡΠ΅Π³ΡΠ»ΡΡΠΊΠΈ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ²ΠΎΡΠ°ΡΠΈΠ²Π°ΡΡΡΡ ΠΊ Π²Π°ΠΌ ΡΠ²ΠΎΠΈΠΌΠΈ, ΠΊΡ ΠΌ... Π½ΠΎΠ²ΡΠΌΠΈ Π³ΡΠ°Π½ΡΠΌΠΈ, ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΏΡΠΎΡΡΠΈΡΡ, ΠΏΠ΅ΡΠ΅Π²Π°ΡΠΈΡΡ ΠΈ ΠΏΡΠΈΠ½ΡΡΡ.
ΠΠΎΡ Π·Π΄Π΅ΡΡ Π΅ΡΡΡ Π³ΡΠ°ΠΌΠΎΡΠ½ΠΎΠ΅ ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ΄Π΅ΡΠΆΠ°Π½Π½ΠΎΠ΅ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΠ΅ΠΌΡ, ΠΏΠΎΠΊΠ° ΠΆΠ΅ ΠΎΠΊΠΈΠ½Π΅ΠΌ Π²Π·Π³Π»ΡΠ΄ΠΎΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ:
import re
s1: str = "123 abc ABC 456"
m1 = re.search("[aA]", s1) # ΠΡΠ΅Ρ ΠΏΠ΅ΡΠ²ΠΎΠ΅ Π²Ρ
ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠ°ΡΡΠ΅ΡΠ½Π°, ΠΏΡΠΈ Π½Π΅ΡΠ΄Π°ΡΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ None
print(m1, m1.group(0))
m2 = re.fullmatch("[aA]", s1) # ΠΡΠΎΠ²Π΅ΡΠΊΠ°, ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ Π»ΠΈ ΡΡΡΠΎΠΊΠ° ΠΏΠΎΠ΄ ΡΠ°Π±Π»ΠΎΠ½
print(m2)
c1: list = re.findall("[aA]", s1) # ΠΠ°ΠΉΡΠΈ Π² ΡΡΡΠΎΠΊΠ΅ Π²ΡΠ΅ Π½Π΅ΠΏΠ΅ΡΠ΅ΡΠ΅ΠΊΠ°ΡΡΠΈΠ΅ΡΡ ΡΠ°Π±Π»ΠΎΠ½Ρ
print(c1)
def replacer(s):
return chr(ord(s[0]) + 1) # Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ» ΠΈΠ· Π°Π»ΡΠ°Π²ΠΈΡΠ°
s2 = re.sub("\w", replacer, s1) # ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π²ΠΌΠ΅ΡΡΠΎ ΡΠ°Π±Π»ΠΎΠ½Π°
print(s2)
c2 = re.split("\d", s1)
print(c2)
iter = re.finditer("\D", s1) # ΠΡΠ΅ΡΠ°ΡΠΎΡ ΠΏΠΎ Π½Π΅ΠΏΠ΅ΡΠ΅ΡΠ΅ΠΊΠ°ΡΡΠΈΠΌΡΡ ΡΠ°Π±Π»ΠΎΠ½Π°ΠΌ
for ch in iter:
print(ch.group(0), end= "")
<re.Match object; span=(4, 5), match='a'> a
None
['a', 'A']
234 bcd BCD 567
['', '', '', ' abc ABC ', '', '', '']
abc ABC
Match Object
import re
m3 = re.match(r"(\w+) (\w+)", "John Connor, leader of the Resistance")
s3: str = m3.group(0) # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅
s4: str = m3.group(1) # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ°ΡΡΡ Π² ΠΏΠ΅ΡΠ²ΡΡ
ΡΠΊΠΎΠ±ΠΊΠ°Ρ
t1: tuple = m3.groups()
start: int = m3.start() # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ½Π΄Π΅ΠΊΡ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΡ
end: int = m3.end() # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΠΈΠ½Π΄Π΅ΠΊΡ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΡ
t2: tuple[int, int] = m3.span() # ΠΠΎΡΡΠ΅ΠΆ (start, end)
print (f"{s3}\n {s4}\n {t1}\n {start}\n {end}\n {t2}\n")
John Connor
John
('John', 'Connor')
0
11
(0, 11)
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ datetime
Python ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Unix Epoch: "1970-01-01 00:00 UTC"
from datetime import datetime
from dateutil.tz import tzlocal
dt1: datetime = datetime.fromisoformat("2021-10-04 00:05:23.555+00:00") # ΠΠΎΠΆΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ ValueError
dt2: datetime = datetime.strptime("21/10/04 17:30", "%d/%m/%y %H:%M") # ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΏΡΠΎ ΡΠΎΡΠΌΠ°ΡΡ - https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes
dt3: datetime = datetime.fromordinal(100_000) # 100000-ΠΉ Π΄Π΅Π½Ρ ΠΎΡ 1.1.0001
dt4: datetime = datetime.fromtimestamp(20_000_000.01) # ΠΡΠ΅ΠΌΡ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
Ρ Π½Π°ΡΠ°Π»Π° Unix Epoch
tz = tzlocal()
dt5: datetime = datetime.fromtimestamp(20_000_000.01, tz) # Π‘ ΡΡΠ΅ΡΠΎΠΌ ΡΠ°ΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ°
print (f"{dt1}\n {dt2}\n {dt3}\n {dt4}\n {dt5}")
2021-10-04 00:05:23.555000+00:00
2004-10-21 17:30:00
0274-10-16 00:00:00
1970-08-20 16:33:20.010000
1970-08-20 16:33:20.010000+05:00
ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ datetime
from datetime import datetime
dt1: datetime = datetime.today()
s1: str = dt1.isoformat()
s2: str = dt1.strftime("%d/%m/%y %H:%M") # https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes
i: int = dt1.toordinal()
a: float = dt1.timestamp() # Π‘Π΅ΠΊΡΠ½Π΄Ρ Ρ Π½Π°ΡΠ°Π»Π° Unix Epoch
print (f"{dt1}\n {s1}\n {s2}\n {i}\n {a}")
2022-09-06 17:50:38.041159
2022-09-06T17:50:38.041159
06/09/22 17:50
738404
1662468638.041159
ΠΡΠΈΡΠΌΠ΅ΡΠΈΠΊΠ° datetime
from datetime import date, time, datetime, timedelta
from dateutil.tz import UTC, tzlocal, gettz, datetime_exists, resolve_imaginary
d: date = date.today()
dt1: datetime = datetime.today()
dt2: datetime = datetime(year=1981, month=12, day=2)
td1: timedelta = timedelta(days=5)
td2: timedelta = timedelta(days=1)
d = d + td1 # date = date Β± timedelta
dt3 = dt1 - td1 # datetime = datetime Β± timedelta
td3 = dt1 - dt2 # timedelta = datetime - datetime
td4 = 10 * td1 # timedelta = const * timedelta
c: float = td1/td2 # timedelta/timedelta
print (f"{d}\n {dt3}\n {td3}\n {td4}\n {c}")
2022-09-11
2022-09-01 17:50:38.132916
14888 days, 17:50:38.132916
50 days, 0:00:00
5.0
bisect ΠΈ Π±ΠΈΠ½Π°ΡΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ
ΠΠΈΠ½Π°ΡΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ Π±ΡΡΡΡΠ΅Π΅, ΡΠ΅ΠΌ ΠΎΠ±ΡΡΠ½ΡΠΉ (ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» Β«ΠΠ»Π³ΠΎΡΠΈΡΠΌΡΒ»), Π½ΠΎ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠΈΡΠΊ.
import bisect
a: list[int] = [12, 6, 8, 19, 1, 33]
a.sort()
print(f"Sorted: {a}")
print(bisect.bisect(a, 20)) # ΠΠ°ΠΉΡΠΈ ΠΈΠ½Π΄Π΅ΠΊΡ Π΄Π»Ρ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π²ΡΡΠ°Π²ΠΊΠΈ
bisect.insort(a, 15) # ΠΡΡΠ°Π²ΠΊΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ
print(a)
# ΠΠΈΠ½Π°ΡΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ
def binary_search(a, x, lo=0, hi=None):
if hi is None:
hi = len(a)
pos = bisect.bisect_left(a, x, lo, hi)
return pos if pos != hi and a[pos] == x else -1
print(binary_search(a, 15))
Sorted: [1, 6, 8, 12, 19, 33]
5
[1, 6, 8, 12, 15, 19, 33]
4
Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (Map, Filter, Reduce, Partial)
ΠΠ° ΡΠ»ΡΡΠ°ΠΉ, Π΅ΡΠ»ΠΈ Π½Π°ΡΠΈΠ½Π°Ρ Ρ ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΈ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π° Π²Ρ ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΠ΅ΡΡ ΠΊ ΠΌΠ΅ΡΡΡ ΠΈ Π½Π΅ ΠΌΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΈΡΠΌΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΡΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ²ΠΎΠΉ ΠΊΠΎΠ΄ Β«Π²ΠΎΠΈΡΡΠΈΠ½Ρ ΠΊΡΡΡΡΠΌΒ», ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΎΡΠΈΡΠΈΡΡΡ Π²Π°ΠΌ ΠΠΆΠΎΡΠ»Ρ ΠΡΠ°ΡΠ°, Π°Π²ΡΠΎΡΠ° ΠΊΠ½ΠΈΠ³ΠΈ Β«Data Science: ΠΠ°ΡΠΊΠ° ΠΎ Π΄Π°Π½Π½ΡΡ Ρ Π½ΡΠ»ΡΒ»: Β«Π ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΈΠ·Π΄Π°Π½ΠΈΠΈ ΡΡΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ Π±ΡΠ»ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ partial, map, reduce ΠΈ filter ΡΠ·ΡΠΊΠ° Python. ΠΠ° ΡΠ²ΠΎΠ΅ΠΌ ΠΏΡΡΠΈ ΠΊ ΠΏΡΠΎΡΠ²Π΅ΡΠ»Π΅Π½ΠΈΡ Ρ ΠΏΠΎΠ½ΡΠ», ΡΡΠΎ ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π»ΡΡΡΠ΅ ΠΈΠ·Π±Π΅Π³Π°ΡΡ, ΠΈ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΊΠ½ΠΈΠ³Π΅ Π±ΡΠ»ΠΎ Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΎ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡΠΌΠΈ Π² ΡΠΏΠΈΡΠΎΠΊ, ΡΠΈΠΊΠ»Π°ΠΌΠΈ ΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ, Π±ΠΎΠ»Π΅Π΅ Python'ΠΎΠ²ΡΠΊΠΈΠΌΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡΠΌΠΈΒ». Π’Π°ΠΊΠΈΠ΅ Π΄Π΅Π»Π°...
import functools
# ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ Π²ΡΠ΅ Π²Ρ
ΠΎΠ΄ΡΡΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ
iter1 = map(lambda x: x + 1, range(10))
print(list(iter1))
# ΠΠ΅ΡΠ΅Π΄Π°Π΅Ρ Π² Π²ΡΡ
ΠΎΠ΄Π½ΠΎΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΎΡ ΡΠΎΠ»ΡΠΊΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡΠΈΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡ
iter2 = filter(lambda x: x > 5, range(10))
print(list(iter2))
# ΠΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΊΠΎ Π²ΡΠ΅ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π²Ρ
ΠΎΠ΄Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
, ΡΠ²ΠΎΠ΄Ρ ΠΈΡ
ΠΊ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
a = functools.reduce(lambda out, x: out + x, range(10))
print(a)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[6, 7, 8, 9]
45
import functools
def sum(a,b):
return a + b
add_const = functools.partial(sum, 10)
print(add_const(5))
15
ΠΡΠ»ΠΈ Π²Π°ΠΌ Π½Π΅ ΡΡΠ°Π·Ρ ΡΡΠ°Π½Π΅Ρ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ partial (ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΎΠ½Π° Π½ΡΠΆΠ½Π°), Π½Π΅ ΡΠ°ΡΡΡΡΠ°ΠΈΠ²Π°ΠΉΡΠ΅ΡΡ, Π²Ρ Π½Π΅ ΠΎΠ΄ΠΈΠ½ΠΎΠΊΠΈ :). ΠΠΎΡ, ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΡΠ΅ΠΌΠ° Π½Π° Stackoverflow: Β«I am not able to get my head on how the partial worksΒ». Π’Π°ΠΌ, ΠΊΡΡΠ°ΡΠΈ, Π΅ΡΡΡ ΡΠΎΠ²Π΅Ρ, ΠΊΠ°ΠΊ partial ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ ΠΏΡΠΈ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ pipe Ρ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΈΠΌΠ΅ΡΡΠΈΡ ΡΠ°Π·Π½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ².
Any, All
any() Π²Π΅ΡΠ½Π΅Ρ True, Π΅ΡΠ»ΠΈ Ρ ΠΎΡΡ Π±Ρ ΠΎΠ΄ΠΈΠ½ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈΡΠ΅ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ ΠΈΡΡΠΈΠ½Π΅Π½, all() Π²Π΅ΡΠ½Π΅Ρ True ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ»ΡΡΠ°Π΅ ΠΈΡΡΠΈΠ½Π½ΠΎΡΡΠΈ Π²ΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ.
animals = ["Squirrel", "Beaver", "Fox"]
sentence = "Bison likes squirrels and beavers"
any_animal: bool = any(animal.lower() in sentence.lower() for animal in animals)
print(any_animal)
all_animal: bool = all(animal.lower() in sentence.lower() for animal in animals)
print(all_animal)
True
False
Π€Π°ΠΉΠ»Ρ
Π€Π°ΠΉΠ»ΠΎΠ²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΡΠΎΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡΠΎΠ±Π½ΡΠΊΠΎΠΌ ΠΎΡ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π°Π½Π½ΡΡ , ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°ΡΡΠΈΠ΅ Π½Π΅ ΡΠΈΡΠΌΠΈΠ½ΡΡΠ½ΡΡ ΡΠΎΡΠΎΠΏΠ»ΠΈΠ²ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ, Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π½Π΅ΠΊΠΈΠΌ ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΠΌ ΡΠ½Π΅ΡΠ³ΠΎΠ½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΠΌ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΠΌ Π΄Π°Π½Π½ΡΡ . Π’Π°ΠΊ ΡΡΠΎ Π΅ΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ Π½Π° Π·Π°Π²ΡΡΠ°, ΠΈΠ»ΠΈ, Π½Π°ΠΎΠ±ΠΎΡΠΎΡ, Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Π°ΠΌ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠ»ΠΈ Π½Π΅Π΄Π΅Π»Ρ Π½Π°Π·Π°Π΄, ΡΠΎ Π²Π°ΠΌ, ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ. Π ΡΠ°ΠΉΠ»Π°Ρ ΠΆΠ΅ ΠΎΡΡΠ΄Π΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½ΡΡ , Π½ΠΎ ΡΡΡ ΡΠ΅ΠΌΡ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈ Π½ΠΈΠΆΠ΅.
f = open("f.txt", mode='r', encoding="utf-8", newline=None)
print(f.read())
Hello from file!
ΠΠ° Π²ΡΡΠΊΠΈΠΉ ΡΠ»ΡΡΠ°ΠΉ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΡΡΡΠ²Π°Π΅ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡΠΊΠΈΠΉ Π·ΡΠ΄ Π΄Π°ΠΆΠ΅ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ Π²ΡΡΠ°ΠΆΠ΅Π½Π½ΠΎΡΡΠΈ, Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ β ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΠ³ΠΎΠ½ΡΠΉΡΠ΅ Π² IDE Π²ΡΠ΅ Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΡΠ΅ ΠΊΡΡΠΊΠΈ ΠΊΠΎΠ΄Π°, Π½Π΅ Π½Π°Π΄ΠΎ Π½Π° Π½ΠΈΡ ΡΠΌΠΎΡΡΠ΅ΡΡ, ΠΈΡ Π½Π°Π΄ΠΎ Π²ΠΈΠ΄ΠΎΠΈΠ·ΠΌΠ΅Π½ΡΡΡ, ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ, Π΄ΠΎΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ; ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ½ΡΡ ΡΠ²ΡΠΆΡΡΡΡ, ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ³Π΄Π° Π²Ρ ΠΏΠΎΠΉΠΌΠ΅ΡΠ΅, ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΡΠ΅Ρ ΡΡΠΎΡ ΠΊΡΡΠΎΡΠ΅ΠΊ ΠΊΠΎΠ΄Π°, ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π΄Π° ΠΏΡΠΎΠΌΠ΅Π»ΡΠΊΠ½ΡΡ ΠΌΠ°Π»Π΅Π½ΡΠΊΠ°Ρ ΠΈΡΠΊΠΎΡΠΊΠ° ΠΈ Π²Π°ΡΠ° ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΊΠ°ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ° Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΡΠ°ΡΡΡΡ.
Π Π΅ΠΆΠΈΠΌΡ (mode):
"r" β ΡΡΠ΅Π½ΠΈΠ΅ (ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ)
"w" β Π·Π°ΠΏΠΈΡΡ (ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΡΠ°Π½Π΅Π΅ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΡΡΠ°Ρ Π² ΡΠ°ΠΉΠ»Π΅, Π±ΡΠ΄Π΅Ρ ΡΡΡΡΡΠ°)
"x" β ΡΠΊΡΠΊΠ»ΡΠ·ΠΈΠ²Π½ΠΎΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΡ; Π΅ΡΠ»ΠΈ ΡΠ°ΠΉΠ» ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, Π±ΡΠ΄Π΅Ρ Π²ΡΠ±ΡΠΎΡΠ΅Π½ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ FileExistsError
"a" β ΠΎΡΠΊΡΡΡΠΈΠ΅ Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π² ΠΊΠΎΠ½Π΅Ρ ΡΠ°ΠΉΠ»Π°
"w+" β ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΡ
"r+" β ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΡ Ρ Π½Π°ΡΠ°Π»Π° ΡΠ°ΠΉΠ»Π°
"a+" β ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΡ Ρ ΠΊΠΎΠ½ΡΠ° ΡΠ°ΠΉΠ»Π°
"t" β ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ ("rt", "wt" ΠΈ Ρ. Π΄.; ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ)
"b" β Π΄Π²ΠΎΠΈΡΠ½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ ("rb", "wb", "xb" ΠΈ Ρ. Π΄.)
encoding=None β Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π° ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠ° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ (Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠΈΡΡΠ΅ΠΌΡ, ΡΠΌ. getpreferredencoding()). ΠΡΠ»ΠΈ Π½Π΅Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ, ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π²Π΅Π·Π΄Π΅ encoding="utf-8"; Π±Π΅Π· ΡΡΠΎΠ³ΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΡΡΠΊΠΈΠΉ ΡΠ΅ΠΊΡΡ Π·Π°ΠΏΠΈΡΠ΅ΡΡΡ Π² ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΉ ΡΠ°ΠΉΠ» Π² Π²ΠΈΠ΄Π΅ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠΎΠ½Π΅ΡΠΈΡΠ°Π΅ΠΌΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ.
newline=None β ΠΏΡΠΈ ΡΡΠ΅Π½ΠΈΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ ΠΊΠΎΠ½ΡΠ° ΡΡΡΠΎΠΊΠΈ Π±ΡΠ΄ΡΡ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠΎΠ²Π°Π½Ρ Π² "\n"; ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠΈ, Π½Π°ΠΎΠ±ΠΎΡΠΎΡ, "\n" Π±ΡΠ΄ΡΡ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠΎΠ²Π°Π½Ρ Π² ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ ΠΊΠΎΠ½ΡΠ° ΡΡΡΠΎΠΊΠΈ.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ:
FileNotFoundError ΠΏΡΠΈ ΡΡΠ΅Π½ΠΈΠΈ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ "r" ΠΈΠ»ΠΈ "r+".
FileExistsError ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ "x".
IsADirectoryError, PermissionError β Π² Π»ΡΠ±ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅.
Π§ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΡΠ°ΠΉΠ»Π°
ΠΡΠΊΡΡΠ²Π°Π΅Ρ ΡΠ°ΠΉΠ» ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ.
ΠΠ»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ Π»ΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° (ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Ρ Π½ΠΈΠΆΠ΅), Ρ. Π΅. ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π²ΠΈΠ΄Π° "with open...". ΠΠ°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΠΉΠ΄Π΅Ρ Π½Π΅ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ Π·Π°Π΄ΡΠΌΠ°Π½ΠΎ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π²Ρ Π½Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π΅ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ°ΠΉΠ»ΠΎΠΌ), ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Β«Π·Π°ΡΠΈΡΡΠΈΡ Ρ
Π²ΠΎΡΡΡΒ», ΠΈ Π²Π°ΡΠ° ΠΎΠΏΠ»ΠΎΡΠ½ΠΎΡΡΡ Π½Π΅ ΠΎΡΡΠ°Π·ΠΈΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅.
with open("f.txt", encoding="utf-8") as f:
chars = f.read(5) # Reads chars/bytes or until EOF
print(chars)
f.seek(0) # Moves to the start of the file. Also seek(offset) and seek(Β±offset, anchor), where anchor is 0 for start, 1 for current position and 2 for end
lines: list[str] = f.readlines() # Also readline()
print(lines)
Hello
['Hello from file!']
ΠΠ°ΠΏΠΈΡΡ Π² ΡΠ°ΠΉΠ»
with open("f.txt", "w", encoding="utf-8") as f:
f.write("Hello from file!") # ΠΠ»ΠΈ f.writelines(<collection>)
JSON
Π§Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΡΠΈΡΠ°Π΅ΠΌΡΠΉ ΡΠΎΡΠΌΠ°Ρ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄Π°Π½Π½ΡΡ .
import json
d: dict = {1: "Lemon", 2: "Apple", 3: "Banana!"}
object_as_string: str = json.dumps(d, indent=2)
print(object_as_string)
restored_object = json.loads(object_as_string)
# Write object to JSON file
with open("1.json", 'w', encoding='utf-8') as file:
json.dump(d, file, indent=2)
# Read object from JSON file
with open("1.json", encoding='utf-8') as file:
restored_from_file = json.load(file)
print(restored_from_file)
{
"1": "Lemon",
"2": "Apple",
"3": "Banana!"
}
{'1': 'Lemon', '2': 'Apple', '3': 'Banana!'}
Pickle
ΠΠΈΠ½Π°ΡΠ½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄Π°Π½Π½ΡΡ .
import pickle
d: dict = {1: "Lemon", 2: "Apple", 3: "Banana!"}
# ΠΠ°ΠΏΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² Π±ΠΈΠ½Π°ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ»
with open("1.bin", "wb") as file:
pickle.dump(d, file)
# Π§ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈΠ· ΡΠ°ΠΉΠ»Π°
with open("1.bin", "rb") as file:
restored_from_file = pickle.load(file)
print(restored_from_file)
{1: 'Lemon', 2: 'Apple', 3: 'Banana!'}
Protocol Buffers
ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΈ Ρ ΡΠ°Π½ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΡ ΡΡΡΡΠΊΡΡΡΡ, ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Ρ ΠΎΡΠΎΡΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌΡΡ Π²ΡΠ΅ΠΌΠΈ ΡΠ·ΡΠΊΠ°ΠΌΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ (ΠΊΠ°ΠΊ JSON) ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡΡΡΡ ΠΌΠ°Π»ΠΎ ΠΌΠ΅ΡΡΠ° (ΠΊΠ°ΠΊ Pickle), ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π² ΡΡΠΎΡΠΎΠ½Ρ Protocol Buffers (Wikipedia, ΠΏΡΠΈΠΌΠ΅ΡΡ Π΄Π»Ρ Python). ΠΡΡΡ Π΅ΡΠ΅ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, FlatBuffers, Apache Avro ΠΈΠ»ΠΈ Thrift.
ΠΡΡΠΈ (Paths)
ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ Π½Π΅ ΠΎΠ±ΠΎΠΉΡΠΈΡΡ Π±Π΅Π· ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΌΠΈ ΠΏΡΡΡΠΌΠΈ.
from os import getcwd, path, listdir
from pathlib import Path
s1: str = getcwd() # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ΅ΠΊΡΡΡΡ ΡΠ°Π±ΠΎΡΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ
print(s1)
s2: str = path.abspath("f.txt") # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠΎΠ»Π½ΡΠΉ ΠΏΡΡΡ
print(s2)
s3: str = path.basename(s2) # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π°
s4: str = path.dirname(s2) # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΡΡΡ Π±Π΅Π· ΡΠ°ΠΉΠ»Π°
t1: tuple = path.splitext(s2) # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠΎΡΡΠ΅ΠΆ ΠΈΠ· ΠΏΡΡΠΈ ΠΈ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π°
print(s3, s4, t1)
p = Path(s2)
st = p.stat()
print(st)
b1: bool = p.exists()
b2: bool = p.is_file()
b3: bool = p.is_dir()
print(b1, b2, b3)
c: list = listdir(path=s1) # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠΌΠ΅Π½ ΡΠ°ΠΉΠ»ΠΎΠ², Π½Π°Ρ
ΠΎΠ΄ΡΡΠΈΡ
ΡΡ ΠΏΠΎ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ ΠΏΡΡΠΈ
print(c)
s5: str = p.stem # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° Π±Π΅Π· ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ
s6: str = p.suffix # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π°
t2: tuple = p.parts # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΏΡΡΠΈ ΠΊΠ°ΠΊ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ
print(s5, s6, t2)
c:\Works\amaargiru\pycore
c:\Works\amaargiru\pycore\f.txt
f.txt c:\Works\amaargiru\pycore ('c:\\Works\\amaargiru\\pycore\\f', '.txt')
os.stat_result(st_mode=33206, st_ino=2251799814917120, st_dev=3628794147, st_nlink=1, st_uid=0, st_gid=0, st_size=16, st_atime=1662468638, st_mtime=1662468638, st_ctime=1661089564)
True True False
['.git', '.gitignore', '.pytest_cache', '01_python.ipynb', '01_python.md', '02_postgre.md', '03_architecture.md', '04_algorithms.ipynb', '04_algorithms.md', '05_admin_devops.md', '06_pytest_mock.ipynb', '06_pytest_mock.md', '07_fastapi.md', '08_flask.md', '1.bin', '1.json', 'compose_readme.bat', 'coupling_vs_cohesion.svg', 'f.txt', 'gitflow.svg', 'graph_for_dfs.jpg', 'pycallgraph3.png', 'readme.md']
f .txt ('c:\\', 'Works', 'amaargiru', 'pycore', 'f.txt')
ΠΡΠΎΡΡΠ΅ΠΉΡΠΈΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ β Sum, Count, Min, Max
a: list[int] = [1, 2, 3, 4, 5, 2, 2]
s = sum(a)
print(s)
c = a.count(2) # ΠΠ΅ΡΠ½Π΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²Ρ
ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ
print(c)
mn = min(a)
print(mn)
mx = max(a)
print(mx)
19
3
1
5
ΠΡΠΈΡΠΌΠΎΡΡΠΈΡΠ΅ΡΡ ΠΊ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΌ ΡΡΠ½ΠΊΡΠΈΡΠΌ, ΡΠ°ΠΌ Π΅ΡΡΡ Π΅ΡΠ΅ ΠΊΠΎΠ΅-ΡΡΠΎ, ΠΊΠ°ΡΠ°ΡΡΠ΅Π΅ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΠΊΠΈ.
ΠΠ°Π·ΠΎΠ²Π°Ρ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΠΊΠ°
from math import pi
a: float = pi ** 2 # Or pow(pi, 2)
print(f"Power: {a}")
b: float = round(pi, 2)
print(f"Round: {b}")
c: int = round(256, -2)
print(f"Int round: {c}")
d: float = abs(-pi)
print(f"Abs: {d}")
e: float = abs(10+10j) # Or e: float = abs(complex(real=10, imag=10))
print(f"Complex abs: {e}")
Power: 9.869604401089358
Round: 3.14
Int round: 300
Abs: 3.141592653589793
Complex abs: 14.142135623730951
ΠΠΎΠ±ΠΈΡΠΎΠ²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
a: int = 0b01010101
b: int = 0b10101010
print(f"And: 0b{a&b:08b}")
print(f"Or: 0b{a|b:08b}")
print(f"Xor: 0b{a^b:08b}")
print(f"Left shift: 0b{a << 4:08b}")
print(f"Right shift: 0b{b >> 4:08b}")
print(f"Not: 0b{~a:08b}")
And: 0b00000000
Or: 0b11111111
Xor: 0b11111111
Left shift: 0b10101010000
Right shift: 0b00001010
Not: 0b-1010110
ΠΠΎΠ΄ΡΡΠ΅Ρ Π±ΠΈΡΠΎΠ²
a: int = 4242
print(f"{a} in binary format: 0b{a:b}")
c = a.bit_count() # Returns the number of ones in the binary representation of the absolute value of the integer
print(f"Bit count: {c}")
4242 in binary format: 0b1000010010010
Bit count: 4
Fractions
from fractions import Fraction
f = Fraction("0.2").as_integer_ratio()
print(f)
(1, 5)
ΠΠ²ΠΊΠ»ΠΈΠ΄ΠΎΠ²ΠΎ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ ΡΠΎΡΠΊΠ°ΠΌΠΈ
import math
p1 = (0.22, 1, 12)
p2 = (-0.12, 3, 7)
print(math.dist(p1, p2))
5.39588732276722
NumPy
ΠΠΈΠ½ΠΈ-ΡΠ·ΡΠΊ Π΄Π»Ρ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΠ²Π°ΠΌΠΈ. ΠΠ° ΡΠ΄Π°ΡΠ½ΡΡ ΡΡΠ΅Π½Π°ΡΠΈΡΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² ΡΠΎΡΠ½ΠΈ ΡΠ°Π· Π±ΡΡΡΡΠ΅Π΅ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΡΠ΅ Π±ΠΎΠ»Π΅Π΅ Π±ΡΡΡΡΠ°Ρ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π° GPU, Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ CuPy ΠΈ ΠΎΠΏΡΡΡ-ΡΠ°ΠΊΠΈ ΠΎΠ±Π΅ΡΠ°Π΅Ρ ΡΡΠΎΠΊΡΠ°ΡΠ½ΡΠΉ ΠΏΡΠΈΡΠΎΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΡΠΎΠ»ΡΠΊΠΎ ΡΠΆΠ΅ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ NumPy. Π’Π°ΠΊ ΡΡΠΎ Π΅ΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ΅Π½ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ Π±ΡΡΡΡΡΠΉ FFT ΠΈΠ»ΠΈ Π΅ΡΠ΅ ΠΊΠ°ΠΊΠΎΠΉ ΡΠΈΡΠ»ΠΎΠ³ΡΡΠ·, ΡΠΎ Π²Ρ Π·Π½Π°Π΅ΡΠ΅, ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ. ΠΡΠ»ΠΈ Π²Ρ Π΄ΡΡΠΆΠΈΡΠ΅ Ρ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈΠΌ, ΡΠΎ ΠΈΠ·ΡΡΠ°ΠΉΡΠ΅ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΌΠ°Π½ΡΠ°Π», Π΅ΡΠ»ΠΈ Π½Π΅Ρ β Π½Π° Β«Π₯Π°Π±ΡΠ΅Β» Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ (ΠΊΠ°ΠΊ Π²ΡΠ΅Π³Π΄Π°, ΡΠΈΡΠ°ΠΉΡΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, ΡΠ°ΠΌ Π½Π΅ΠΌΠ°Π»ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ).
ΠΠ΅Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΎΡΡΡΡΠΏΠ»Π΅Π½ΠΈΠ΅.
ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , ΡΡΡ ΠΌΡ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ Π³ΡΠ°Π½ΠΈΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ ΡΠ·ΡΠΊΠ° ΠΈ Π²Π½Π΅ΡΠ½ΠΈΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌΠΈ. ΠΠ°Π΄ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, ΡΡΠΎ ΡΡΠΏΠ΅Ρ Python Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ ΠΎΡΠ½ΠΎΠ²Π°Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° Π±ΠΎΠ³Π°ΡΡΡΠ²Π΅ Π΅Π³ΠΎ ΡΠΊΠΎΡΠΈΡΡΠ΅ΠΌΡ (Ρ ΠΎΡΡ, Π²ΠΏΡΠΎΡΠ΅ΠΌ, ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΈ ΠΏΡΠΎ JavaScript, ΠΈ ΠΏΡΠΎ C#); ΡΠ°ΠΌ ΡΠ·ΡΠΊ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π±ΠΎΠ³Π°ΡΡΡ, Π½ΠΎ Π²ΡΡ ΠΆΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» Π²Π½Π΅ΡΠ½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π±Π΅Π·Π³ΡΠ°Π½ΠΈΡΠ΅Π½; ΡΡΠΎ ΠΊΠ°ΠΊ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·Π½ΡΠ΅ ΠΊΡΠ±ΠΈΠΊΠΈ ΠΠ΅Π³ΠΎ. Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΠΎΡΠ΅Π½Ρ ΡΠ°ΡΡΠΎ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠΈ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ Ρ Π½ΡΠ»Ρ Π½Π° ΡΠΈΡΡΠΎΠΌ Python'Π΅, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ°ΡΡ Π½ΡΠΆΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ.
ΠΠΎ-Π²ΡΠΎΡΡΡ , ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΡΡΡ ΡΠ°Π·Π½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ Python (Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ ΠΊΠΎΠ½ΠΊΡΡΠΈΡΡΡΡΠΈΡ ) ΡΠΈΠ»ΡΠ½ΠΎ ΡΠ°Π·Π½ΠΈΡΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, NumPy β ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠΏΡΠ»ΡΡΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, Π½ΠΎ Π² ΠΌΠΈΡΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ Π±ΡΠΊΠ²Π°Π»ΡΠ½ΠΎ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Ρ Python-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ Ρ NumPy, ΠΏΡΠΎΡΡΠΎ Π² ΡΠΈΠ»Ρ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΊΡΡΠ³Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΡ ΠΎΠ±ΡΠ·Π°Π½Π½ΠΎΡΡΠ΅ΠΉ.
ΠΠ»Ρ Π½Π°ΡΠΈΠ½Π°ΡΡΠ΅Π³ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π½Π΅ΡΡΡΠΎΡΠ½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ β ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ Π΄Π²ΠΈΠ³Π°ΡΡΡΡ Π²ΠΏΠ΅ΡΠ΅Π΄, ΠΊΠ°ΠΊΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈΠ·ΡΡΠ°ΡΡ, Π²Π΅Π΄Ρ Π·Π½Π°Π½ΠΈΡ ΡΠΈΡΡΠΎΠ³ΠΎ Python, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π°ΠΊΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅Π·ΡΠΌΠ΅.
ΠΠ°ΠΌ Π²Π°ΠΌ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠΎΠ²Π΅Ρ. ΠΠΆΠ΅Π³ΠΎΠ΄Π½ΠΎ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ JetBrains (Π΄Π΅Π»Π°ΡΡΠ°Ρ ΡΡΠ΅Π΄ΠΈ ΠΏΡΠΎΡΠ΅Π³ΠΎ ΠΎΡΠ΅Π½Ρ ΠΊΠ»Π°ΡΡΠ½ΡΡ IDE PyCharm) ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡ Π²ΡΠ΅ΠΌΠΈΡΠ½ΡΠΉ ΠΎΠΏΡΠΎΡ Python-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², Π° ΠΏΠΎΡΠΎΠΌ Π²ΡΠΊΠ»Π°Π΄ΡΠ²Π°Π΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π² Π²ΠΈΠ΄Π΅ ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ Python Developers Survey Results. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΠΎΡΠΈΡΠ°Π΅ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ, ΡΠΎ Π½Π°ΠΉΠ΄Π΅ΡΠ΅ ΡΠ°ΠΌ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΡΡΠΊΠΈΠ΅ ΠΎΡΠΈΠ΅Π½ΡΠΈΡΡ: ΡΠΊΠ°ΠΆΠ΅ΠΌ, Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Β«Data science frameworks and librariesΒ» Π² ΡΠΎΠΏΠ΅ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ NumPy, Pandas (ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ Π½ΠΈΠΆΠ΅) ΠΈ Matplotlib; Π² ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ ΠΎΡΡΡΠ²ΠΎΠΌ Π»ΠΈΠ΄ΠΈΡΡΠ΅Ρ pytest (ΡΠΌΠΎΡΡΠΈ Π½ΠΈΠΆΠ΅), Π² Π΄ΡΡΠ³ΠΈΡ ΠΎΠ±Π»Π°ΡΡΡΡ Π²ΠΏΠ΅ΡΠ΅Π΄ Π²ΡΡΡΠ²Π°ΡΡΡΡ Flask (Django Π½Π° Π²ΡΠΎΡΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ Ρ ΠΊΡΠΎΡΠ΅ΡΠ½ΡΠΌ ΠΎΡΡΡΠ²ΠΎΠΌ), SQLAlchemy (vs Django ORM) ΠΈ PostgreSQL (vs SQLite), ΠΏΡΠΎ Π½ΠΈΡ ΠΌΡ ΡΠΎΠΆΠ΅ Π΅ΡΠ΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ. Π’Π°ΠΊ ΡΡΠΎ Π² ΡΠ΅Π»ΠΎΠΌ, ΠΎΠ±ΡΠ΅Π΅ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ°Π·Π²ΠΈΡΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΌΠΎΠΆΠ½ΠΎ.
ΠΠ΄Π½Π°ΠΊΠΎ, Π²Π΅ΡΠ½Π΅ΠΌΡΡ ΠΊ NumPy. ΠΠ΅ Π·Π°Π±ΡΠ²Π°ΠΉΡΠ΅, ΡΡΠΎ Π² ΠΎΡΠ½ΠΎΠ²Π΅ NumPy Π»Π΅ΠΆΠ°Ρ ΠΌΠ°ΡΡΠΈΠ²Ρ, Π° Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° (ΠΏΡΠΎΡΡΠΎ Π½Π° ΡΠ»ΡΡΠ°ΠΉ, Π΅ΡΠ»ΠΈ Π²Ρ ΡΠΆΠ΅ ΠΏΠΎΠ·Π½Π°Π»ΠΈ ΠΏΡ-Ρ-ΡΠ΅Π»-Π»-Π»Π΅ΡΡΡ ΡΠΏΠΈΡΠΊΠΎΠ² Python). Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ²:
import numpy as np
a1 = np.array([1, 2, 3, 4, 5], float) # ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠ°ΡΡΠΈΠ²Π° ΠΈΠ· ΡΠΏΠΈΡΠΊΠ°
print(a1[0:2])
a2 = np.zeros(5) # ΠΠ°ΡΡΠΈΠ², Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΡΠΉ Π½ΡΠ»ΡΠΌΠΈ
print(a2)
a3 = np.arange(0, 6, 1) # ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°, np.arange(from_inclusive, to_exclusive, step_size)
print(a3)
a4 = np.random.randint(6, size=10) # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΠ°ΡΡΠΈΠ²Π°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π³ΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, np.random.randint(low_inclusive, high_exclusive=None, size=None, dtype=int)
print(a4)
a5 = np.random.randint(6, size=(2, 5)) # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π³ΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
print(a5)
print(a5.shape) # Π§ΠΈΡΠ»ΠΎ ΡΡΡΠΎΠΊ ΠΈ ΡΡΠΎΠ»Π±ΡΠΎΠ² Π² ΠΌΠ°ΡΡΠΈΠ²Π΅
print(a5.dtype) # Π’ΠΈΠΏ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
print(1 in a5) # ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π°Π»ΠΈΡΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°
[1. 2.]
[0. 0. 0. 0. 0.]
[0 1 2 3 4 5]
[2 2 4 0 0 0 0 4 0 5]
[[1 0 3 5 0]
[3 1 4 2 2]]
(2, 5)
int32
True
ΠΠ°Π·ΠΎΠ²ΡΠ΅ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ (ΠΏΠΎΠ»Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ):
import numpy as np
a1 = np.array([1, 2, 3, 4, 5])
a2 = np.array([6, 7, 8, 9, 10])
a3 = a1 + 1
print(a3)
a4 = a1 + a2
print(a4)
a5 = a1 ** 3
print(a5)
a6 = a1 ** a2
print(a6)
[2 3 4 5 6]
[ 7 9 11 13 15]
[ 1 8 27 64 125]
[ 1 128 6561 262144 9765625]
ΠΠΎΠΎΠ±ΡΠ΅, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ Π±ΡΡΡΡΡΠ΅ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π°Π΄ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅ΡΠ½ΡΠΌΠΈ ΠΌΠ°ΡΡΠΈΠ²Π°ΠΌΠΈ β ΡΡΠΎ Π³Π»Π°Π²Π½Π°Ρ Β«ΡΠΈΡΠΊΠ°Β» NumPy. ΠΡ ΠΏΡΠΎΡΡΠΎ Π³ΠΎΠ²ΠΎΡΠΈΡΠ΅: Π²ΠΎΠ·ΡΠΌΠΈ ΡΠ°ΠΊΠΈΠ΅-ΡΠΎ ΠΌΠ°ΡΡΠΈΠ²Ρ ΠΈ ΠΏΡΠΎΠ΄Π΅Π»Π°ΠΉ Π½Π°Π΄ Π½ΠΈΠΌΠΈ ΡΠ°ΠΊΡΡ-ΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ. ΠΠ°Π»Π΅Π΅ Π²ΡΠ΅ ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅ Β«ΠΏΡΠΎΠ²Π°Π»ΠΈΠ²Π°ΡΡΡΡΒ» Π² Π²ΡΡΠΎΠΊΠΎΡΠΊΠΎΡΠΎΡΡΠ½ΠΎΠ΅ ΡΠ΄ΡΠΎ NumPy, Π³Π΄Π΅ ΠΊ Π½ΠΈΠΌ ΡΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ Π²ΡΡ ΠΌΠΎΡΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ°Π½ΡΡΠ΅ Π±ΡΠ»Π° Π²Π°ΠΌ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½Π° (Π½Ρ, ΠΈΠ»ΠΈ Π΄ΠΎΡΡΡΠΏΠ½Π° Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ) ΠΈΠ·-Π·Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ Python-ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ°. Π’Π°ΠΊ ΡΡΠΎ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΡΡΠ°Π΅ΡΠ΅ΡΡ Π² ΡΠΈΠΊΠ»Π΅ ΠΈΡΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠ°ΡΡΠΈΠ² NumPy, ΠΏΠΎ ΡΠ°ΠΊΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ Π΄Π°Π½Π½ΡΠ΅ Π½Π° Π½ΠΈΠΆΠ½ΠΈΠΉ ΡΡΠΎΠ²Π΅Π½Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΠΏΠΎΡΡΠΈΡΠΌΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ row), ΡΠΎ ΠΈΠΌΠ΅ΠΉΡΠ΅ Π² Π²ΠΈΠ΄Ρ, ΡΡΠΎ ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ NumPy Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ; ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΡΠ΅ΡΠΈΡΡ Π·Π°Π΄Π°ΡΡ Π±Π΅Π· ΠΈΡΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
Sum, Min, Max
import numpy as np
a1 = np.random.randint(6, size=(2, 10)) # NumPy ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄Π΅ΡΡΡΠΊΠΎΠ² Π²ΠΈΠ΄ΠΎΠ² ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΡΠ°ΡΡΠΎΠ½Π° ΠΈ Π‘ΡΡΡΠ΄Π΅Π½ΡΠ°
print(a1)
s = np.sum(a1) # Π‘ΡΠΌΠΌΠ° Π²ΡΠ΅Ρ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²
print(s)
mn = a1.min(axis=0) # ΠΠ°ΠΈΠΌΠ΅Π½ΡΡΠΈΠ΅ ΡΠΈΡΠ»Π° Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΡΠΎΠ»Π±ΡΠ΅
print(mn)
mx = a1.max(axis=1) # ΠΠ°ΠΈΠ±ΠΎΠ»ΡΡΠΈΠ΅ ΡΠΈΡΠ»Π° Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅
print(mx)
amin = a1.argmin(axis=0) # ΠΠ½Π΄Π΅ΠΊΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΡ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΡΠΎΠ»Π±ΡΠ΅
print(amin)
amax = a1.argmax(axis=1) # ΠΠ½Π΄Π΅ΠΊΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΡ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅
print(amax)
uniq = np.unique(a1) # ΠΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΡ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²
print(uniq)
[[3 0 4 1 0 5 4 0 1 3]
[0 3 4 0 0 1 4 0 5 4]]
42
[0 0 4 0 0 1 4 0 1 3]
[5 5]
[1 0 0 1 0 1 0 0 0 0]
[5 8]
[0 1 3 4 5]
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π΄ΠΎΠΌΠ°ΡΠ½Π΅Π³ΠΎ Π·Π°Π΄Π°Π½ΠΈΡ ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ prod(), mean(), var(), std(), median(), cov() ΠΈ corrcoef().
Π€ΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ²:
import numpy as np
a = np.random.randint(6, size=(3, 5))
print(a)
a1 = a.reshape((5, 3)) # Π€ΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅. ΠΡΠ»ΠΈ Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ, ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π½ΠΎΠ²ΡΠΉ view Π½Π° ΡΠ΅ ΠΆΠ΅ ΡΠ°ΠΌΡΠ΅ Π΄Π°Π½Π½ΡΠ΅
print(a1)
a.shape = (5, 3) # Π€ΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ in-place
print(a)
print(a.shape)
a = a[:, :, np.newaxis] # Π£Π²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ½ΠΎΡΡΠΈ ΠΌΠ°ΡΡΠΈΠ²Π° Ρ 2 Π΄ΠΎ 3
print(a)
print(a.shape)
a = a.flatten() # ΠΠΎΠ½Π²Π΅ΡΡΠ°ΡΠΈΡ Π² ΠΎΠ΄Π½ΠΎΠΌΠ΅ΡΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ²
print(a)
print(a.shape)
[[5 5 5 1 1]
[0 2 0 5 5]
[0 2 5 4 5]]
[[5 5 5]
[1 1 0]
[2 0 5]
[5 0 2]
[5 4 5]]
[[5 5 5]
[1 1 0]
[2 0 5]
[5 0 2]
[5 4 5]]
(5, 3)
[[[5]
[5]
[5]]
[[1]
[1]
[0]]
[[2]
[0]
[5]]
[[5]
[0]
[2]]
[[5]
[4]
[5]]]
(5, 3, 1)
[5 5 5 1 1 0 2 0 5 5 0 2 5 4 5]
(15,)
ΠΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ²:
import numpy as np
import copy
a = np.random.randint(10, size=(4, 4))
print(a)
# ΠΠ΅Π³Π»ΡΠ±ΠΎΠΊΠ°Ρ (shallow) ΠΊΠΎΠΏΠΈΡ
a1 = np.copy(a)
# ΠΠ»ΡΠ±ΠΎΠΊΠ°Ρ (deep) ΠΊΠΎΠΏΠΈΡ
a2 = copy.deepcopy(a)
# ΠΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΡΠ»ΠΊΠΈ
a3 = a
a[0, 0] = 10
print(a[0, 0] == a1[0, 0])
print(a[0, 0] == a2[0, 0])
print(a[0, 0] == a3[0, 0])
[[5 3 1 4]
[0 8 7 0]
[1 7 4 7]
[5 3 5 2]]
False
False
True
NumPy ΠΎΡΠ΅Π½Ρ ΠΌΠΎΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, Π½Π΅ Π·ΡΡ ΠΆΠ΅ ΠΎΠ½ ΡΡΠΎΠΈΡ Π½Π° ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ Π² ΡΠΏΠΈΡΠΊΠ΅ Β«Data science frameworks and librariesΒ» ΠΎΠ±Π·ΠΎΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ ΡΡΡΡ Π²ΡΡΠ΅. ΠΠΎ ΡΠ³Π»ΡΠ±Π»ΡΡΡΡΡ Π² ΡΡΡ ΡΠ΅ΠΌΡ ΠΎΡΠ΅Π½Ρ ΡΠΆ Π³Π»ΡΠ±ΠΎΠΊΠΎ Π² ΡΠ°ΠΌΠΊΠ°Ρ
Π½Π°ΡΠ΅Π³ΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΠ½ΠΎΠ³ΠΎ ΠΎΡΠ΅ΡΠΊΠ°, ΠΏΠΎΠΆΠ°Π»ΡΠΉ, Π½Π΅ ΡΡΠΎΠΈΡ; Π²ΡΡΠ΄ Π»ΠΈ ΠΏΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ Π²Π°ΠΌ ΠΊΡΠΎΠ²Ρ ΠΈΠ· Π½ΠΎΡΡ Π½ΡΠΆΠ½ΠΎ ΠΎΡΠ²ΠΎΠΈΡΡ ΡΠΊΠ°Π»ΡΡΠ½ΠΎΠ΅, ΡΠ΅Π½Π·ΠΎΡΠ½ΠΎΠ΅ ΠΈ Π²Π½Π΅ΡΠ½Π΅Π΅ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠ°ΡΡΠΈΡ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π½Π°ΡΡ (Π²ΡΠΏΠΎΠΌΠ½ΠΈΡΡ?) ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΡ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π°Π»Π³Π΅Π±ΡΡ. ΠΡΠΌΠ°Ρ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΌΡ ΡΠ΅ΠΉΡΠ°Ρ Π½Π°ΡΠ½Π΅ΠΌ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ ΡΡΠ°Π½ΡΠΏΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π²ΡΠ±ΠΎΡ ΠΎΡΠΈ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π° ΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½Π°ΡΠΈΡ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ², ΡΠΎ ΡΡΠΎ ΡΠΆΠ΅ Π±ΡΠ΄Π΅Ρ, ΡΡΠΎ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ, Β«Π½Π΅ Π² ΠΊΠΎΠ½Ρ ΠΊΠΎΡΠΌΒ».
Π ΡΠΎΠΌΡ ΠΆΠ΅, ΠΈΠ·ΡΡΠ°Ρ ΡΠΎΠ½ΠΊΠΎΡΡΠΈ ΡΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΡ NumPy, Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ ΡΠΎΠ±Π»Π°Π·Π½ ΡΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΡ SciPy, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΠ΅Π³ΠΎ Π΅ΡΠ΅ Π±ΠΎΠ»Π΅Π΅ ΡΠΈΡΠΎΠΊΠΈΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π», Π° ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ "import scipy" Ρ Π½Π°Ρ Π½Π°ΡΠ½ΡΡΡΡ ΡΠΆΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ΅ Π½Π΅ΠΏΠΎΡΡΠ΅Π±ΡΡΠ²ΠΎ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠΊΠ° ΠΏΡΠΎΠΉΠ΄Π΅ΠΌ ΠΌΠΈΠΌΠΎ ΡΡΠΎΠΉ ΠΊΡΠΎΠ»ΠΈΡΡΠ΅ΠΉ Π½ΠΎΡΡ, Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π·Π½Π°ΠΊΠΎΠΌΡΡΠ²Π° ΠΎΠ½Π° ΡΠ»ΠΈΡΠΊΠΎΠΌ Π³Π»ΡΠ±ΠΎΠΊΠ°.
ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅, ΡΡΠΎ Π΅ΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ²ΠΎΠΈΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΡΡΡΠ° NumPy β Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π²Π½Π΅ΡΠ½ΠΈΠΌ ΠΌΠΈΡΠΎΠΌ. ΠΠ·ΡΡΠΈΡΠ΅ Π΄Π»Ρ Π½Π°ΡΠ°Π»Π° load/save/savez (Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊΠΈ) ΠΈ loadtxt/savetxt (ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠΎΡΠΈΡΠ°Π΅ΠΌΡΠΉ ΡΠΎΡΠΌΠ°Ρ).
Pandas
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½ΡΡ
. Π Π°Π±ΠΎΡΠ° Ρ Π΄Π°Π½Π½ΡΠΌΠΈ ΡΡΡΠΎΠΈΡΡΡ ΠΏΠΎΠ²Π΅ΡΡ
Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ NumPy.
Π ΠΏΠ΅ΡΠ²ΠΎΠΌ, Π³ΡΡΠ±ΠΎΠΌ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠΈ pandas ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΊΠ°ΠΊ ΡΠ²ΡΠ·ΠΊΡ Β«Excel + VisualBasic-ΡΠΊΡΠΈΠΏΡΡΒ», ΡΠΎΠ»ΡΠΊΠΎ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΡΡ ΠΈ ΡΠ΄ΠΎΠ±Π½ΡΡ. ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ²ΠΎΠ΅ΠΎΠ±ΡΠ°Π·Π½ΡΠΉ ΠΌΠΎΡΡΠΈΠΊ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΌΠΈ Python-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ°, Π΄Π°ΡΠ°-ΡΠ°ΠΉΠ΅Π½ΡΠΈΡΡΠ° ΠΈ Π°Π½Π°Π»ΠΈΡΠΈΠΊΠ°, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΡΠΎΡΡΠ΅Π΄ΠΎΡΠΎΡΠΈΡΡΡΡ Π² Π±ΠΎΠ»ΡΡΠ΅ΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° ΠΎΡΠΈΡΡΠΊΠ΅ ΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅ Π΄Π°Π½Π½ΡΡ
, Π½Π° ΡΠΈΡΠ°Π±Π΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΎΡΡΠ΅ΡΠΎΠ², Π° Π½Π΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ. Pandas ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠΈΡΠΎΠΊΠΈΠΉ ΡΠΏΠ΅ΠΊΡΡ Β«ΠΊΡΠ°ΡΠΈΠ²ΠΎΡΡΠ΅ΠΉΒ» ΠΏΡΠΈ Π²ΡΠ²ΠΎΠ΄Π΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π² Π²ΡΠ²ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠ½ΡΡ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΊΡ (heatmap) ΠΈΠ»ΠΈ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ ΠΎΡ ΡΡΠ΅Π΄Π½Π΅Π³ΠΎ (bar chart).
ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΊΠ°ΠΊ ΡΠ»Π΅Π΄ΡΠ΅Ρ Β«ΡΠ°ΡΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡΒ» pandas, ΠΏΠΎ-Ρ ΠΎΡΠΎΡΠ΅ΠΌΡ Π½Π°Π΄ΠΎ Π·Π°Π³ΡΡΠ·ΠΈΡΡ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠ°Π·Π²Π΅ΡΠΈΡΡΡΠΉ Π½Π°Π±ΠΎΡ Π΄Π°Π½Π½ΡΡ , Π½ΠΎ ΠΌΡ, ΠΏΠΎΠΆΠ°Π»ΡΠΉ, Π½Π΅ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΠ³ΡΡΠΆΠ°ΡΡΡΡ Π² Π³Π»ΡΠ±ΠΈΠ½Ρ Π³Π»ΡΠ±ΠΈΠ½, ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠΈΠ³ΡΠ°Π΅ΠΌ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠΌ ΡΠ°ΠΌΠΎΠ΄Π΅Π»ΡΠ½ΡΠΌ Π΄Π°ΡΠ°ΡΠ΅ΡΠΎΠΌ.
import pandas as pd
s = pd.Series([0, 1, 4, 7, 8, 10, 12])
print(s)
print(s[2])
0 0
1 1
2 4
3 7
4 8
5 10
6 12
dtype: int64
4
Series β Π±Π°Π·ΠΎΠ²Π°Ρ ΡΡΡΡΠΊΡΡΡΠ° Π΄Π°Π½Π½ΡΡ pandas. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΎΡΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π΅Ρ ΠΊΠ°ΠΊ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Π½ΡΠΉ ΡΠ»ΠΎΠ²Π°ΡΡ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΡΡΡΠΎΠΊΡ Excel, ΡΠΌΠΎΡΡΡ ΠΏΠΎ ΡΠΎΠΌΡ, ΠΊΠ°ΠΊΠ°Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ Π²Π°ΠΌ Π±Π»ΠΈΠΆΠ΅.
import pandas as pd
s = pd.Series([0, 1, 4, 7, 8, 10, 12], index=["a", "b", "c", "d", "x", "y", "z"]) # ΠΠ½Π΄Π΅ΠΊΡΡ Series ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°ΡΡ Π²ΡΡΡΠ½ΡΡ
print(s)
print(s["x"])
print(s[["x", "y", "z"]]) # ΠΡΠ±ΠΎΡΠΊΠ°
print(s[s > 5]) # Π€ΠΈΠ»ΡΡΡΠ°ΡΠΈΡ
print(s.max()) # ΠΠ°ΡΠ΅ΠΌΠ°ΡΠΈΠΊΠ°, ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΠΊΠ°ΠΊ Π² NumPy
print(s.sum())
a 0
b 1
c 4
d 7
x 8
y 10
z 12
dtype: int64
8
x 8
y 10
z 12
dtype: int64
d 7
x 8
y 10
z 12
dtype: int64
12
42
ΠΡΠΈ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Series ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ DataFrame, Π²ΡΠΎΡΠ°Ρ Π±Π°Π·ΠΎΠ²Π°Ρ ΡΡΡΡΠΊΡΡΡΠ° Π΄Π°Π½Π½ΡΡ pandas, ΠΊΠΎΡΠΎΡΡΡ Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΊΠ°ΠΊ Π»ΠΈΡΡ Excel.
import pandas as pd
from pandas import DataFrame
s1 = pd.Series([0, 1, 4, 7, 8, 10, 12])
s2 = pd.Series([0, 100, 200, 300, 600, 900, 1200])
df = pd.DataFrame([s1, s2])
print(df)
print(df[1])
print(df[2][0])
print(df.iloc[0][2:4])
0 1 2 3 4 5 6
0 0 1 4 7 8 10 12
1 0 100 200 300 600 900 1200
0 1
1 100
Name: 1, dtype: int64
4
2 4
3 7
Name: 0, dtype: int64
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΡΡΠΎ-ΡΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΡ ΠΎΠΆΠ΅Π΅ Π½Π° ΡΠ΅Π°Π»ΡΠ½ΡΠΉ Π°Π½Π°Π»ΠΈΠ· Π΄Π°Π½Π½ΡΡ . ΠΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠΎΡΠΌΡΠ»Ρ ΠΠΠ’ Π²ΡΡΡΠ½ΠΈΠΌ, ΠΊΡΠΎ ΠΈΠ· Π·Π½Π°ΠΌΠ΅Π½ΠΈΡΠΎΡΡΠ΅ΠΉ Π½Π΅ ΡΠ»Π΅Π΄ΠΈΡ Π·Π° ΡΠΎΠ±ΠΎΠΉ ΠΈ ΠΎΠ±Π·Π°Π²Π΅Π»ΡΡ Π»ΠΈΡΠ½ΠΈΠΌ Π²Π΅ΡΠΎΠΌ:
from pandas import DataFrame
import matplotlib.pyplot as plt
def bmi(row):
return row["weight"] / row["height"] ** 2
if __name__ == '__main__':
celebs: dict = {"Britney Spears": {"height": 1.63, "weight": 57},
"Melanie Griffith": {"height": 1.73, "weight": 63},
"Kylie Minogue": {"height": 1.52, "weight": 46},
"Hulk Hogan": {"height": 1.98, "weight": 137}}
df = DataFrame(celebs) # Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ DataFrame
df.loc["bmi"] = df.apply(lambda row: bmi(row), axis=0) # ΠΠΎΠ±Π°Π²Π»Π΅ΠΌ Π½ΠΎΠ²ΡΡ ΡΡΡΠΎΠΊΡ Ρ ΠΠΠ’
df = df.sort_values(by="bmi", ascending=True, axis=1) # Π‘ΠΎΡΡΠΈΡΡΠ΅ΠΌ
print(df)
df.loc["bmi"].plot.bar() # ΠΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ
plt.show()
Kylie Minogue Melanie Griffith Britney Spears Hulk Hogan
height 1.520000 1.730000 1.630000 1.980000
weight 46.000000 63.000000 57.000000 137.000000
bmi 19.909972 21.049818 21.453574 34.945414
ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π₯Π°Π»ΠΊ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π½Π΅ ΡΠΎΠ»ΡΡΡΠΊ, Π° ΠΏΡΠΎΡΠ΅ΡΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΡΠΏΠΎΡΡΡΠΌΠ΅Π½, ΠΊ ΠΊΠΎΡΠΎΡΡΠΌ ΡΠΎΡΠΌΡΠ»Π° ΠΠΠ’ ΠΌΠ°Π»ΠΎΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠ°, Π½ΠΎ ΠΊΡΠΎΡΠΊΠ° ΠΠ°ΠΉΠ»ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π²ΡΡΡΠ²Π°Π΅ΡΡΡ Π²ΠΏΠ΅ΡΠ΅Π΄, Π΄Π°ΠΆΠ΅ Ρ ΡΡΠ΅ΡΠΎΠΌ ΡΠ²ΠΎΠ΅Π³ΠΎ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΡΠΎΡΡΠ°.
Matplotlib/Seaborn
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ matplotlib ΠΌΡ ΡΠΆΠ΅ ΡΠ»Π΅Π³ΠΊΠ° Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°Π»ΠΈ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π²ΡΡΠ΅. ΠΡΡΠΌΠΎ Π·Π΄Π΅ΡΡ ΠΈ ΠΏΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ Π³Π»ΡΠ±ΠΎΠΊΠΎ ΠΏΠΎΠ³ΡΡΠΆΠ°ΡΡΡΡ Π² ΡΠ°Π·Π±ΠΎΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ matplotlib/seaborn, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, ΠΎΡΠΎΠ±ΠΎΠ³ΠΎ ΡΠΌΡΡΠ»Π° Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ; Π²ΡΠ΅ Π²Ρ Π²ΠΈΠ΄Π΅Π»ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΠΉ Π² Π½Π°ΡΡΠ½ΠΎΠΉ ΠΈ Π±ΠΈΠ·Π½Π΅Ρ-Π»ΠΈΡΠ΅ΡΠ°ΡΡΡΠ΅ ΠΈ, ΡΠ°Π·ΡΠΌΠ΅Π΅ΡΡΡ, Π²ΡΠ΅ ΡΡΠΈ Π³ΡΠ°ΡΠΈΠΊΠΈ ΠΈ ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²ΡΠΎΡΠΈΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΡΠΎΡΡΠΎ Π΄Π»Ρ Π·Π°ΡΡΠ°Π²ΠΊΠΈ Π½Π°ΡΠΈΡΡΠ΅ΠΌ ΠΏΠ°ΡΡ ΡΠΈΠΌΠΏΠ°ΡΠΈΡΠ½ΡΡ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΉ, ΡΡΠΎΠ±Ρ Π½Π°Π³Π»ΡΠ΄Π½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΡΡΡ ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΡΠΎΡΠΌΠ»Π΅Π½ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² ΠΏΡΠΎΠ΄Π΅Π»Π°Π½Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ.
Π’Π΅ΠΏΠ»ΠΎΠ²Π°Ρ ΠΊΠ°ΡΡΠ° (heatmap), Π½Π°Π³Π»ΡΠ΄Π½ΠΎ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΠ°Ρ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΠ»Π΅Π½ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
from random import randrange
import numpy as np
import matplotlib.pyplot as plt
import uuid
targets = ["authorities", "humans", "parrots", "cars", "motorcycles", "buildings", "warehouses"]
robots = ["Terminator #" + str(uuid.uuid4())[:5] for _ in range(7)]
harvest = np.array([[randrange(i * j) for i in range(10, 80, 10)] for j in range(1, 8)])
fig, ax = plt.subplots()
im = ax.imshow(harvest)
ax.set_xticks(np.arange(len(robots)), labels=robots)
ax.set_yticks(np.arange(len(targets)), labels=targets)
plt.setp(ax.get_xticklabels(), rotation=60, ha="right", rotation_mode="anchor")
for i in range(len(targets)):
for j in range(len(robots)):
text = ax.text(j, i, harvest[i, j], ha="center", va="center", color="w")
ax.set_title("Targets destroyed")
fig.tight_layout()
plt.rcParams['figure.figsize'] = [4, 4]
plt.rcParams['figure.dpi'] = 200
plt.show()
ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½Π°Ρ ΡΠ΅ΠΏΠ»ΠΎΠ²Π°Ρ ΠΊΠ°ΡΡΠ°, Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ seaborn:
from random import randrange
import numpy as np
import matplotlib.pyplot as plt
import uuid
import seaborn as sns
sns.set_theme()
targets = ["authorities", "humans", "parrots", "cars", "motorcycles", "buildings", "warehouses"]
robots = ["Terminator #" + str(uuid.uuid4())[:5] for _ in range(7)]
harvest = np.array([[randrange(i * j) for i in range(10, 80, 10)] for j in range(1, 8)])
fig, ax = plt.subplots()
im = ax.imshow(harvest)
ax.set_title("Targets destroyed")
plt.rcParams['figure.figsize'] = [4, 4]
sns.heatmap(harvest, annot=True, fmt="d", linewidths=.5, ax=ax, xticklabels=robots, yticklabels=targets)
plt.setp(ax.get_xticklabels(), rotation=60, ha="right", rotation_mode="anchor")
plt.xticks(rotation=60)
plt.show()
Π Π²ΠΎΡ ΡΠ°ΠΊ Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ Β«ΠΠΎΡΠΊΠ° ΠΏΠΎΡΡΡΠ°Β» ΠΏΡΠΈ ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ΅ Π² 3D:
import uuid
from random import randrange
import matplotlib.cm as cm
import matplotlib.colors as colors
import matplotlib.pyplot as plt
import numpy as np
targets = ["authorities", "humans", "parrots", "cars", "motorcycles", "buildings", "warehouses"]
robots = ["Terminator #" + str(uuid.uuid4())[:5] for _ in range(7)]
harvest = np.array([[randrange(i * j) for i in range(10, 80, 10)] for j in range(1, 8)])
fig = plt.figure(figsize=(5, 5))
ax = fig.add_subplot(projection='3d')
ax.set_xticks(np.arange(len(robots)), labels=robots)
ax.set_yticks(np.arange(len(targets)), labels=targets)
plt.setp(ax.get_xticklabels(), rotation=45, ha="right", rotation_mode="anchor")
plt.setp(ax.get_yticklabels(), ha="left", rotation_mode="anchor")
ax.set_title("Our team")
xx, yy = np.meshgrid(range(len(targets)), range(len(robots)))
x1d, y1d = xx.ravel(), yy.ravel()
harvest1d = harvest.ravel()
# Setup color scheme
offset = harvest1d + np.abs(harvest1d.min())
fracs = offset.astype(float) / offset.max()
norm = colors.Normalize(fracs.min(), fracs.max())
colors = cm.jet(norm(fracs))
ax.bar3d(x1d, y1d, np.zeros_like(x1d + y1d), 0.7, 0.7, harvest1d, color=colors)
plt.show()
ΠΠ΅ΠΉΡΠΎΠ½Π½ΡΠ΅ ΡΠ΅ΡΠΈ
Π£Π³Π»ΡΠ±ΠΈΡΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π³Π»ΡΠ±ΠΎΠΊΠΎ Π² ΡΠ΅ΠΌΠ°ΡΠΈΠΊΡ Π³Π»ΡΠ±ΠΎΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ Π² ΡΠ°ΠΌΠΊΠ°Ρ Π½Π°ΡΠ΅Π³ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π΅Π³Π»ΡΠ±ΠΎΠΊΠΎΠ³ΠΎ ΡΠΎΡΠΌΠ°ΡΠ°, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ (ΠΊΠ°ΠΊΠΈΠΌ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠΎΠΌΠΎΠΌ Β«ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Deep LearningΒ» Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π½Π΅ΡΡΠΈ ΡΠ΅Π±Π΅ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΡΠ°Π²ΠΌΡ, Π΅ΡΠ»ΠΈ Π½Π΅ΡΠ΄Π°ΡΠ½ΠΎ ΡΡΠΎΠ½ΠΈΡΡ ΡΠΎ ΡΡΠΎΠ»Π°), ΡΠ°ΠΊ ΡΡΠΎ ΡΠΊΠΎΠ»ΡΠ·Π½ΡΠΌ Π±ΡΠΊΠ²Π°Π»ΡΠ½ΠΎ ΠΏΠΎ Π²Π΅ΡΡ ΡΡΠΊΠ°ΠΌ, ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π² ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΠΎΠ½ΡΡΠΈΡ.
ΠΠ»ΡΠ±ΠΈΠ½Π½Π°Ρ Π½Π΅ΠΉΡΠΎΠ½Π½Π°Ρ ΡΠ΅ΡΡ (deep neural network) β ΡΡΠΎ, ΡΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ Π²ΡΡΠ°ΠΆΠ°ΡΡΡ, ΠΌΠ½ΠΎΠ³ΠΎΡΠ»ΠΎΠΉΠ½Π°Ρ ΠΈΡΠΊΡΡΡΡΠ²Π΅Π½Π½Π°Ρ Π½Π΅ΠΉΡΠΎΠ½Π½Π°Ρ ΡΠ΅ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ°Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²ΡΡΠΎΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΡ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΉ Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΡΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠΉ. Π Ρ ΠΎΠ΄Ρ Π΅ΡΡΡ Π΅ΡΠ΅ ΡΠ°ΠΊΠΈΠ΅ ΡΠ΅ΡΠΌΠΈΠ½Ρ, ΠΊΠ°ΠΊ Β«ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠ½ΠΎΠ΅ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅Β», Β«ΡΠ»Π°Π±ΡΠΉ ΠΠΒ», Β«ΡΠΈΠ»ΡΠ½ΡΠΉ ΠΠΒ»; ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΊΠ»Π°ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΏΠΎΠ½ΡΡΠΈΠΉ Β«Π³Π»ΡΠ±ΠΎΠΊΠΎΠ΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅Β», Β«ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅Β» ΠΈ Β«ΠΈΡΠΊΡΡΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΒ» (Π²ΠΎΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π²Π°ΡΠΈΠ°Π½Ρ ΠΎΡ Microsoft, ΡΠ°ΠΊΡΡ ΠΆΠ΅ ΡΡΡΡΠΊΡΡΡΡ-ΠΌΠ°ΡΡΡΡΠΊΡ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ Π€ΡΠ°Π½ΡΡΠ° Π¨ΠΎΠ»Π»Π΅ Π² ΡΠ²ΠΎΠ΅ΠΉ ΠΊΠ½ΠΈΠ³Π΅ Β«ΠΠ»ΡΠ±ΠΎΠΊΠΎΠ΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° PythonΒ»), Π½ΠΎ ΡΠ΅ΠΉΡΠ°Ρ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅ ΠΏΡΠΈ Π½Π΅ΡΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠΌ ΠΎΠ±ΡΠ΅Π½ΠΈΠΈ, Π²ΡΡ ΡΠ°ΡΠ΅ ΡΡΠ°Π²ΠΈΡΡΡ Π·Π½Π°ΠΊ ΡΠ°Π²Π΅Π½ΡΡΠ²Π° ΠΌΠ΅ΠΆΠ΄Ρ Β«ΠΌΠ°ΡΠΈΠ½Π½ΡΠΌ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ΠΌΒ» ΠΈ Β«ΠΈΡΠΊΡΡΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΠΎΠΌΒ»; ΠΏΡΠΈΡΡΠΌ Π² ΡΠ°Π±ΠΎΡΠ΅, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Β«ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅Β», Π° ΠΏΡΠΈ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ΅ ΠΏΡΠ΅Π·Π΅Π½ΡΠ°ΡΠΈΠΉ β Β«ΠΈΡΠΊΡΡΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΒ» :) ΠΠ΅Π»ΠΎ, ΠΏΠΎ Π²ΡΠ΅ΠΉ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ, Π² ΡΠΎΠΌ, ΡΡΠΎ Π³Π»ΡΠ±ΠΎΠΊΠΎΠ΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΠ°Π»ΠΎ ΡΠ°ΠΌΠΎΠΉ ΠΌΠ½ΠΎΠ³ΠΎΠΎΠ±Π΅ΡΠ°ΡΡΠ΅ΠΉ ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ ΡΠ°Π·Π²ΠΈΠ²Π°ΡΡΠ΅ΠΉΡΡ ΠΎΠ±Π»Π°ΡΡΡΡ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ, Π° ΠΈΡΠΊΡΡΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΠΎΠΌ ΡΠΆΠ΅ Π΄Π°Π²Π½ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π»ΠΈ Π²ΡΡ ΡΡΡ ΠΎΠ±Π»Π°ΡΡΡ Π·Π½Π°Π½ΠΈΠΉ ΠΊΠ°ΠΊ ΠΏΠΎΠΏΡΠ»ΡΡΠΈΠ·Π°ΡΠΎΡΡ Π½Π°ΡΠΊΠΈ, ΡΠ°ΠΊ ΠΈ ΠΆΡΡΠ½Π°Π»ΠΈΡΡΡ.
Π ΠΎΠ±ΡΠ΅ΠΌ, ΠΏΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎΠΌ Π·Π½Π°ΠΊΠΎΠΌΡΡΠ²Π΅ Ρ TensorFlow ΠΈΠ»ΠΈ PyTorch ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΌΠ΅Π»ΠΎ Π²ΡΠ΅ΠΌ Π³ΠΎΠ²ΠΎΡΠΈΡΡ, ΡΡΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΠ΅ΡΡ AI, Π° Π΅ΡΠ»ΠΈ Π·Π°Ρ
ΠΎΡΠΈΡΠ΅ ΡΠ³Π»ΡΠ±ΠΈΡΡΡΡ β ΡΠΆ ΡΠ΅ΡΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ-ΡΠΎ ΠΎΠ²Π»Π°Π΄Π΅Π΅ΡΠ΅.
Π§ΡΠΎ ΠΊΠ°ΡΠ°Π΅ΡΡΡ ΡΡΡΠΈ ΡΠ°Π±ΠΎΡΡ Π½Π΅ΠΉΡΠΎΠ½Π½ΡΡ
ΡΠ΅ΡΠ΅ΠΉ, ΡΠΎ Π·Π΄Π΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ΄Π΅Π»ΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΠΎΠ½ΡΡΠΈΡ:
ΠΠ°ΡΠ°ΡΠ΅Ρ β ΠΌΠ°ΡΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π΄Π»Ρ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ ΡΠ΅ΡΠΈ ΠΈ Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ. ΠΠ°ΡΠΈΠ°Π½Ρ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ Π΄Π°ΡΠ°ΡΠ΅ΡΠ° β ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° Ρ ΡΡΠΊΠΎΠΏΠΈΡΠ½ΡΠΌΠΈ ΡΠΈΡΡΠ°ΠΌΠΈ ΠΈ Π±ΡΠΊΠ²Π°ΠΌΠΈ, Π³Π΄Π΅ ΠΏΡΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠΎΡΠ½ΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΠΊΠ°ΠΊΠ°ΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠΈΠΌΠ²ΠΎΠ» Π² Π½ΡΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ; ΡΠ°ΠΊΠΎΠΉ Π΄Π°ΡΠ°ΡΠ΅Ρ Π½ΡΠΆΠ΅Π½ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΈΡΡΠ΅ΠΌ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡ ΡΡΠΊΠΎΠΏΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠ° (handwritten text recognition, HTR). Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ Π΄Π°ΡΠ°ΡΠ΅ΡΠΎΠ² β Π±ΠΎΠ»ΡΡΠ°Ρ, ΡΡΠΆΠ΅Π»Π°Ρ ΡΠ°Π±ΠΎΡΠ°, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΅ΠΉΡΠ°Ρ ΠΈΠ΄Π΅Ρ Π°ΠΊΡΠΈΠ²Π½Π°Ρ ΡΠ°Π±ΠΎΡΠ° ΠΏΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, ΡΠΏΠΎΡΠΎΠ±Π½ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΠΎΠ±ΡΡΠΌΠ°ΠΌΠΈ Π½Π΅ΠΌΠ°ΡΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ . ΠΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π΄Π°ΡΠ°ΡΠ΅Ρ ΡΠ°Π·Π±ΠΈΠ²Π°Π΅ΡΡΡ Π½Π° Π΄Π²Π΅ ΡΠ°ΡΡΠΈ β Π΄Π»Ρ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ ΡΠ΅ΡΠΈ ΠΈ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ.
ΠΡΠΊΡΡΡΡΠ²Π΅Π½Π½Π°Ρ Π½Π΅ΠΉΡΠΎΠ½Π½Π°Ρ ΡΠ΅ΡΡ β ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΈΠ»ΠΈ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΠΉ Π°Π½Π°Π»ΠΎΠ³ Π±ΠΈΠΎΠ»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠΉ Π½Π΅ΠΉΡΠΎΠ½Π½ΠΎΠΉ ΡΠ΅ΡΠΈ; Π² ΡΠ°ΠΌΠΎΠΌ ΠΏΡΠΎΡΡΠΎΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅, Π² ΡΠ΅ΡΠΈ ΠΏΡΡΠΌΠΎΠ³ΠΎ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΡ, ΡΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠ΅ ΡΠ»ΠΎΠΈ Π½Π΅ΠΉΡΠΎΠ½ΠΎΠ². ΠΠ΅ΡΠ²ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π΅ΠΉΡΠΎΠ½Π½ΡΡ ΡΠ΅ΡΠ΅ΠΉ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΠΎΠΏΠ»ΠΎΡΠ΅Π½ΠΈΠ΅ Π΅ΡΠ΅ Π² 60-Ρ Π³ΠΎΠ΄Π°Ρ XX Π²Π΅ΠΊΠ°, Ρ ΠΎΡΡ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΏΡΠΎΠ³ΡΠ΅ΡΡ ΠΈ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈΡ ΠΎΠ΄ΡΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π»Π΅Ρ ΠΏΡΡΠ½Π°Π΄ΡΠ°ΡΡ.
ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° ΠΈΡΠΊΡΡΡΡΠ²Π΅Π½Π½ΠΎΠΉ Π½Π΅ΠΉΡΠΎΠ½Π½ΠΎΠΉ ΡΠ΅ΡΠΈ β ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΎΠ±ΡΠΈΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ Π΅Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ, Π²ΠΎΡ Π·Π΄Π΅ΡΡ Π΅ΡΡΡ Ρ ΠΎΡΠΎΡΠ΅Π΅ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΠ΅ΠΌΡ, Π½Π°Π³Π»ΡΠ΄Π½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΡΠ΅ΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, GAN ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ LSTM.
ΠΠ±ΡΡΠ΅Π½ΠΈΠ΅ Π½Π΅ΠΉΡΠΎΠ½Π½ΠΎΠΉ ΡΠ΅ΡΠΈ β Π΅ΡΠ»ΠΈ Π² Π΄Π²ΡΡ ΡΠ»ΠΎΠ²Π°Ρ , ΡΠΎ ΡΡΠΎ Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠΎΠ² ΡΠ²ΡΠ·ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π½Π΅ΠΉΡΠΎΠ½Π°ΠΌΠΈ. ΠΡΠΈΠΌΠ΅Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΊ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠΌΡ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ Π·Π°ΠΌΠ΅Π½ΡΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠΎΠ³Π΄Π° ΠΌΡ Π³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎ DALL-E 2, ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΠΌ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡΠΌ ΠΈΠ»ΠΈ ΠΎΠ± AlphaGo, ΠΎΠ±ΡΠ³ΡΡΠ²Π°ΡΡΠ΅ΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΡ ΠΈΠ³ΡΠΎΠΊΠΎΠ² Π² Π³ΠΎ β ΠΌΡ Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΎΠ± ΠΎΠ±ΡΡΠ΅Π½Π½ΡΡ Π½Π΅ΠΉΡΠΎΠ½Π½ΡΡ ΡΠ΅ΡΡΡ , ΡΠΎΠ·Π΄Π°ΡΠ΅Π»ΠΈ ΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠΎΡΠ²ΠΈΠ»ΠΈ Π±Π΅Π·Π΄Π½Ρ ΠΈΠ·ΠΎΠ±ΡΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΡΡΠΎΠ±Ρ Π²ΡΠ΅ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΡ ΡΠ²ΡΠ·ΠΈ Π±ΡΠ»ΠΈ Π½Π° ΡΠ²ΠΎΡΠΌ ΠΌΠ΅ΡΡΠ΅. ΠΠΎΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ β ΡΠ°ΡΡΠΈΡΠ½Π°Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΠΎΠ²ΠΊΠ° ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠΎΠ² ΡΠ²ΡΠ·ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π½Π΅ΠΉΡΠΎΠ½Π°ΠΌΠΈ ΠΏΡΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΡΠ°ΡΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π°.
ΠΠ°ΡΠ΅ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅? Π‘ΠΈΠ»ΡΠ½ΡΠΉ ΠΠ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ (ΡΠΊΡΠ΅ΡΡΠΈΠΌ ΠΏΠ°Π»ΡΡΡ) ΡΠ΅ΡΠ°ΡΡ Π²ΡΠ΅ Π½Π°ΡΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π΅ΡΠ΅ Π·Π° Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠΎΠΌ; Π½ΠΎ ΡΠΆΠ΅ ΠΏΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ Π½Π΅ΠΉΡΠΎΠ½Π½ΡΠ΅ ΡΠ΅ΡΠΈ ΡΠ΅ΡΠ°ΡΡ Π·Π°Π΄Π°ΡΠΈ, Π½Π΅ΠΏΠΎΠ΄ΡΠ΅ΠΌΠ½ΡΠ΅ Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ². ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Β«ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎΒ» ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅ΡΠΈΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π°Π΄Π°ΡΡ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡ ΠΎΡΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠ° ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ° Π½Π° Π΄ΡΡΠ³ΠΎΠΉ? ΠΠ°, ΠΌΠΎΠΆΠ½ΠΎ, ΠΈ ΡΠ°ΠΊΠΈΠ΅ Π½Π΅Π±Π΅Π·ΡΡΠΏΠ΅ΡΠ½ΡΠ΅ ΠΏΠΎΠΏΡΡΠΊΠΈ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡΠ°ΡΠ½ΠΎ ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡ. ΠΠΎ, ΡΡΠΈΡΡΠ²Π°Ρ ΠΏΡΠΎΡΡΠ² Π² ΡΠ°Π·Π²ΠΈΡΠΈΠΈ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ Π±Π°Π·Ρ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ, Π½Π°ΠΌΠ΅ΡΠΈΠ²ΡΠΈΠΉΡΡ Π² ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ 10-15 Π»Π΅Ρ, ΠΏΠΎΠΌΠ½ΠΎΠΆΠ΅Π½Π½ΡΠΉ Π½Π° Π³ΠΈΠ³Π°Π½ΡΡΠΊΠΈΠΉ ΠΏΡΠΈΡΠΎΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π΄Π°ΠΆΠ΅ ΠΎΠ±ΡΡΠ½ΡΡ ΠΏΠΎΠ²ΡΠ΅Π΄Π½Π΅Π²Π½ΡΡ Π²ΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ², Π²ΡΠΎΠ΄Π΅ ΡΠΌΠ°ΡΡΡΠΎΠ½ΠΎΠ², ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΠ΅, ΠΈ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ ΡΠ΅ΠΉΡΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ. ΠΠ»Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΆΠ΅ ΠΊΠ»Π°ΡΡΠΎΠ² Π·Π°Π΄Π°Ρ, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΊΠ»Π°ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΈΠ»ΠΈ Π±Π΅ΡΠΏΠΈΠ»ΠΎΡΠ½Π°Ρ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ°, ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π° Π±Π°Π·Π΅ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π·Π°Ρ ΠΎΠ΄ΠΈΠ»ΠΈ Π΄Π°Π»ΡΡΠ΅ Π²ΡΠ»ΠΎΡΠ΅ΠΊΡΡΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΎΠ².
ΠΠ°Π»ΠΎ-ΠΏΠΎΠΌΠ°Π»Ρ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π΅Π»Π°Π΅Ρ Π½Π°ΡΡ ΠΆΠΈΠ·Π½Ρ Π»ΡΡΡΠ΅. Π‘ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ, Π½Π°Π΄Π΅ΡΡΡ, ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· Π½Π°Ρ ΡΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΏΠ»ΠΎΠ΄Π°ΠΌΠΈ ΡΠ°Π±ΠΎΡΡ ΠΈΡΠΊΡΡΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΠ°, Ρ ΠΎΡΡ ΠΌΡ ΠΈ Π²Π΅Π»ΠΈΡΠ°Π΅ΠΌ Π΅Π³ΠΎ Β«ΡΠ»Π°Π±ΡΠΌΒ». Π ΡΠ΅ΡΡ ΠΈΠ΄Π΅Ρ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΎ Π³ΡΠΎΠΌΠΊΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ , Π²ΡΠΎΠ΄Π΅ Π°Π²ΡΠΎΠΏΠΈΠ»ΠΎΡΠ° Β«Π’Π΅ΡΠ»ΡΒ» (Ρ ΠΎΡΡ ΠΈ ΡΡΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ Π½Π΅ΠΌΠ°Π»ΠΎΠ²Π°ΠΆΠ½ΠΎ), Π½ΠΎ Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΎ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠΌ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΠΊΡΠ°Π±Π°ΠΉΡΠ½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ, ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅ΠΌΡΡ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠΈΡΡΠΎΠ²ΠΎΠΉ ΡΠΈΠ²ΠΈΠ»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ β Π²ΠΈΠ΄Π΅ΠΎ Ρ ΡΠ»ΠΈΡΠ½ΡΡ ΠΊΠ°ΠΌΠ΅Ρ, ΡΠΊΠ°Π½ΠΎΠ² ΠΠ Π’ ΠΈ ΠΠ’, ΡΠ΅Π»Π΅ΠΌΠ΅ΡΡΠΈΠΈ Ρ ΡΠΈΡΠ½Π΅Ρ-Π±ΡΠ°ΡΠ»Π΅ΡΠΎΠ², ΠΎΡΡΠ΅ΡΠΎΠ² ΠΎΠ± ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠΈ Π»Π΅ΠΊΠ°ΡΡΡΠ²Π΅Π½Π½ΡΡ ΡΡΠ΅Π΄ΡΡΠ² ΠΈ ΠΏΠΈΡΠ΅Π²ΡΡ Π΄ΠΎΠ±Π°Π²ΠΎΠΊ. Π Π΅ΡΠ»ΠΈ Π²ΡΡ ΡΡΠΎ ΠΏΡΠΎΠΉΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΎΡΠ΅Π½Ρ ΡΠΌΠ½ΡΠΌΠΈ, Π½ΠΎ Π·Π°ΡΠΎ Π½Π΅ΡΡΡΠ°Π½Π½ΡΠΌΠΈ Π³Π»Π°Π·Π°ΠΌΠΈ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΎΠ±ΡΡΠ΅Π½Π½ΠΎΠΉ Π½Π΅ΠΉΡΠΎΠ½Π½ΠΎΠΉ ΡΠ΅ΡΠΈ, ΡΠΎ ΠΊΡΠ°ΡΠ½ΠΎ ΡΠΌΠ΅Π½ΡΡΠΈΡΡΡ Π½Π΅Π²Π΅ΡΠ½ΡΡ Π΄ΠΈΠ°Π³Π½ΠΎΠ·ΠΎΠ², Π»ΡΠ΄Π΅ΠΉ, ΡΠΌΠ΅ΡΡΠΈΡ ΠΎΡ ΠΈΠ½ΡΡΠ»ΡΡΠΎΠ² ΠΈΠ»ΠΈ Π·Π°ΠΌΠ΅ΡΠ·ΡΠΈΡ Π½Π° ΡΠ»ΠΈΡΠ°Ρ , Π° ΡΠ°ΠΊΠΆΠ΅ Π»Π΅ΠΊΠ°ΡΡΡΠ² Ρ ΡΡΠΆΠ΅Π»ΡΠΌΠΈ ΠΏΠΎΠ±ΠΎΡΠ½ΡΠΌΠΈ ΡΡΡΠ΅ΠΊΡΠ°ΠΌΠΈ.
ΠΠΎ ΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΠΎΠ΄Π½Π°ΠΊΠΎ β Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΠΎΠ»Π½Ρ ΡΠ½ΡΡΠ·ΠΈΠ°Π·ΠΌΠ° ΠΈ Π³ΠΎΡΠΎΠ²Ρ Ρ ΠΎΡΡ ΠΏΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ Π½ΡΡΠ½ΡΡΡ Π²ΠΎ Π²ΡΠ΅ ΡΡΠΈ ΠΌΠΎΠ΄Π½ΡΠ΅, ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠ΅ ΠΈ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΡΠ½ΠΎΡΡΠΈ Π²ΡΠΎΠ΄Π΅ Π±ΠΈΠ³Π΄Π°ΡΡ ΠΈΠ»ΠΈ ΠΠ β ΡΠ΅ΠΌ Π΄Π°Π»ΡΡΠ΅ Π²Ρ Π±ΡΠ΄Π΅ΡΠ΅ ΡΠ³Π»ΡΠ±Π»ΡΡΡΡΡ Π² ΡΡΡ ΡΠ΅ΠΌΠ°ΡΠΈΠΊΡ, ΡΠ΅ΠΌ ΠΌΠ΅Π½ΡΡΠ΅ Π² Π²Π°Ρ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ°, ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΡΡΡΠ½ΠΎΠ³ΠΎ, ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΠΊΠ°. ΠΠ΄Π΅-ΡΠΎ Π² ΡΠ°ΠΌΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ ΡΡΠΎΠ³ΠΎ Π΄Π»ΠΈΠ½Π½ΠΎΠ³ΠΎ-ΠΏΡΠ΅Π΄Π»ΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΊΠΎΡΠΈΠ΄ΠΎΡΠ° ΡΠΈΠ΄ΠΈΡ Π²ΠΎΠ²ΡΠ΅ Π½Π΅ ΠΠ΅ΠΎ ΠΈΠ· Β«ΠΠ°ΡΡΠΈΡΡΒ», Π° ΡΠ΄Π°ΠΊΠΈΠΉ ΡΠ΅Π±Π΅ ΠΡΠΈΠ³ΠΎΡΠΈΠΉ ΠΠ΅ΡΠ΅Π»ΡΠΌΠ°Π½, ΡΡΡΠ°Π²ΡΠΈΠΉ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ Ρ ΡΡΡΠΊΠΎΠΉ ΠΈ Π»ΠΈΡΡΠΎΠΌ Π±ΡΠΌΠ°Π³ΠΈ, ΠΈΠ½ΠΎΠ³Π΄Π° ΡΡΠΎΠΉ ΡΡΡΠΊΠΎΠΉ Π½Π° ΡΡΠΎΠΉ Π±ΡΠΌΠ°Π³Π΅ ΠΏΠΈΡΡΡΠΈΠΉ Π²Π΅ΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΡΠΎΠΌ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ Π΄Π²Π° Π³ΠΎΠ΄Π° ΡΠ°Π·ΠΆΠ΅Π²ΡΠ²Π°ΡΡ Π»ΡΡΡΠΈΠΌ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΠΊΠ°ΠΌ ΠΌΠΈΡΠ°. ΠΡΠ΅ΠΏΠΊΠΎ ΠΏΠΎΠ΄ΡΠΌΠ°ΠΉΡΠ΅, ΠΊΠ°ΠΊ Π³Π»ΡΠ±ΠΎΠΊΠΎ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°ΠΉΡΠΈ, Π²Π·Π²Π΅ΡΡΡΠ΅ ΡΠ²ΠΎΠΈ ΡΠΈΠ»Ρ.
3. ΠΠΎΡΠΎΠΊΠΈ Π΄Π°Π½Π½ΡΡ
Β«Π Π½Π΅ Π²ΠΈΠ΄Π΅Π»ΠΈ ΠΌΡ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ°Π²Ρ, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ ΡΠ²Π΅Π»Π° Π±Ρ, ΠΈ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π΄Π΅ΡΠ΅Π²Π°, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½Π΅ ΠΏΠ»ΠΎΠ΄ΠΎΠ½ΠΎΡΠΈΠ»ΠΎ Π±Ρ. ΠΠ°ΠΌΠ½ΠΈ ΠΆΠ΅ ΡΠ°ΠΌ β ΡΠΎΠ»ΡΠΊΠΎ Π΄ΡΠ°Π³ΠΎΡΠ΅Π½Π½ΡΠ΅Β».
Β«ΠΠ»Π°Π²Π°Π½ΠΈΠ΅ ΡΠ²ΡΡΠΎΠ³ΠΎ ΠΡΠ΅Π½Π΄Π°Π½Π°Β».
Itertools
ΠΠ΅ΡΠΎΠ΄Ρ ΠΌΠΎΠ΄ΡΠ»Ρ itertools Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΡ.
ΠΡΠ΅ΡΠ°ΡΠΎΡ β ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΏΠΎΡΠ»Π΅ΠΌΠ΅Π½ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±Ρ ΠΎΠ΄Π° Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΌΠ΅ΡΠΎΠ΄ next() Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ. ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠΎΠ² Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΎ Π½ΠΈΠΆΠ΅, Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Β«ΠΠΠ / Π£ΡΠΈΠ½Π°Ρ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡΒ». Π Β«Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΠ΅Β» Π΄Π°Π½Π½ΡΠ΅ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΡ ΠΏΠ΅ΡΠ΅Π³ΠΎΠ½ΡΡΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ for, next ΠΈΠ»ΠΈ list().
Itertools ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π³ΠΎΡΠΎΠ²ΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠΌΠΈ (ΠΏΠΎΡΠΎΠΆΠ΄Π°ΡΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ count, cycle ΠΈΠ»ΠΈ repeat), ΠΊΠΎΠ½Π΅ΡΠ½ΡΠΌΠΈ (accumulate, chain, takewhile ΠΈ Π΄ΡΡΠ³ΠΈΠ΅) ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΎΡΠ½ΡΠΌΠΈ (product, combinations, combinations_with_replacement, permutations). ΠΡΡΡΠ΅ ΠΈΠ·ΡΡΠΈΡΡ ΠΈΡ Π²ΡΠ΅, Ρ ΠΎΡΡ Π±Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠ½ΠΎ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π΄Π°ΠΆΠ΅ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΅Π΄ΠΊΠΎ ΡΠΏΠΎΡΡΠ΅Π±Π»ΡΠ΅ΠΌΡΠΉ ΠΌΠ΅ΡΠΎΠ΄, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ zip_longest(), ΠΈΠ½ΠΎΠ³Π΄Π° Π²Π΅ΡΡΠΌΠ° ΠΈ Π²Π΅ΡΡΠΌΠ° ΠΏΡΠΈΠ³ΠΎΠΆΠ΄Π°Π΅ΡΡΡ, ΠΈΠ΄Π΅Π°Π»ΡΠ½ΠΎ Π»ΠΎΠΆΠ°ΡΡ Π½Π° ΠΏΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΡΡ Π·Π°Π΄Π°ΡΡ.
ΠΡΠΈΠΌΠ΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠΌΠΈ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠ°ΠΌΠΈ:
from itertools import count, repeat, cycle
# ΠΡΠ΅ΡΠ°ΡΠΎΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠΈΠΉ ΡΠ°Π²Π½ΠΎΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
i1 = count(start=0, step=.1)
print(next(i1))
print(next(i1))
print(next(i1))
# ΠΡΠ΅ΡΠ°ΡΠΎΡ, ΡΠΈΠΊΠ»ΠΈΡΠ½ΠΎ ΠΈ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΈΡΠ΅ΡΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
i2 = cycle([1, 2])
print(next(i2))
print(next(i2))
print(next(i2))
# ΠΡΠ΅ΡΠ°ΡΠΎΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠΈΠΉ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ Π½Π΅ ΡΠΊΠ°Π·Π°Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° times
i3 = repeat("Wow!", times=3)
print(list(i3))
0
0.1
0.2
1
2
1
['Wow!', 'Wow!', 'Wow!']
ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΊΠΎΠ½Π΅ΡΠ½ΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠΎΠ²:
from itertools import accumulate, chain, compress, dropwhile, takewhile, pairwise
import operator
# ΠΡΠ΅ΡΠ°ΡΠΎΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠΈΠΉ Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ β ΡΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅)
i1 = accumulate([1, 2, 3, 4])
i2 = accumulate([1, 2, 3, 4], initial=10)
print(list(i1), list(i2))
i3 = accumulate([ -3, -2, -1, 1, 2, 3, 4], operator.mul)
print(list(i3))
# ΠΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΡ ΡΡΠ½ΠΊΡΠΈΡ
def myfunc(accumulated, current):
return accumulated + 2 * current
i4 = accumulate([1, 2, 3, 4], func=myfunc)
print(list(i4))
# ΠΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠΌΠ±Π΄Ρ (ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Ρ Π½ΠΈΠΆΠ΅)
i5 = accumulate([1, 2, 3, 4], lambda accumulated, current: accumulated + 2 * current)
print(list(i5))
# ΠΡΠ΅ΡΠ°ΡΠΎΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠΈΠΉ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π²Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ,
# ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠΌΠ΅ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΡΠ°Π²Π½ΡΠΉ True ΠΈΠ»ΠΈ 1 Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ selectors
i6 = compress("ABCDEF", [1, 1, 1, 0, 0, 1])
print(list(i6))
# ΠΡΠ΅ΡΠ°ΡΠΎΡ, ΠΎΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π²Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, Π΅ΡΠ»ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π²Π΅Π½ True.
# ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°Ρ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ False, ΡΠΎ ΠΎΡΠ±ΡΠ°ΡΡΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ°Π΅ΡΡΡ (ΠΏΡΠ΅Π΄ΠΈΠΊΠ°Ρ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ)
i7 = dropwhile(lambda x: x<5, [1, 4, 6, 4, 1, 1, 1, 0])
print(list(i7))
# takewhile, Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ dropwhile, Π½Π°ΠΎΠ±ΠΎΡΠΎΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π²Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ,
# Π΅ΡΠ»ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π²Π΅Π½ True
i8 = takewhile(lambda x: x<5, [1, 4, 6, 0, 4, 1, 2, 1])
print(list(i8))
# ΠΡΠ΅ΡΠ°ΡΠΎΡ, ΡΠΎΡΠΌΠΈΡΡΡΡΠΈΠΉ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
Π²Ρ
ΠΎΠ΄Π½ΡΡ
ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠ΅ΠΉ ΠΎΠ΄Π½Ρ ΠΎΠ±ΡΡΡ
i2 = chain(["A", "B", "C"],["D", "E", "F"],["G", "H", "I"])
print(list(i2))
# ΠΡΡΠ°ΡΠΈ, ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅ ΡΡΡΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠ½ΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΎΠ±ΡΡΠ½ΠΎΠΉ sum(), Π·Π°Π΄Π°Π² Π΅ΠΉ Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ [] (Ρ. Π΅. ΠΏΡΡΡΠΎΠΉ ΡΠΏΠΈΡΠΎΠΊ)
a = sum([["A", "B", "C"],["D", "E", "F"],["G", "H", "I"]], [])
print(a)
# ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π²Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ ΠΏΠΎΠΏΠ°ΡΠ½ΠΎ
i6 = pairwise([1, 2, 3, 4, 5])
print(list(i6))
[1, 3, 6, 10] [10, 11, 13, 16, 20]
[-3, 6, -6, -6, -12, -36, -144]
[1, 5, 11, 19]
[1, 5, 11, 19]
['A', 'B', 'C', 'F']
[6, 4, 1, 1, 1, 0]
[1, 4]
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
[(1, 2), (2, 3), (3, 4), (4, 5)]
ΠΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΎΡΠΈΠΊΠ°
from itertools import product, combinations, combinations_with_replacement, permutations
# Π‘ΠΎΠ·Π΄Π°Π΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π΅ Π²ΡΠ΅ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Π½ΡΠ΅ ΠΏΠ°ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΈΠ· Π²Ρ
ΠΎΠ΄Π½ΡΡ
ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²
a = product("abc", "xyz")
print(list(a))
b = product([0, 1], repeat=3)
print(list(b))
# ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π΄Π»ΠΈΠ½Ρ r ΠΈΠ· ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π²Ρ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΡΠ΅ΡΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠΈΠ΅ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π½Π΅ Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡΡΡ
c = combinations("abc", r=2)
print(list(c))
# ΠΡΠ΄Π°Π΅Ρ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΈΡΠ΅ΡΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
d = permutations("abc", r=2)
print(list(d))
# ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π΄Π»ΠΈΠ½Ρ r ΠΈΠ· ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π²Ρ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΡΠ΅ΡΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠΈΠ΅ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡ
e = combinations_with_replacement("abc", r=2)
print(list(e))
[('a', 'x'), ('a', 'y'), ('a', 'z'), ('b', 'x'), ('b', 'y'), ('b', 'z'), ('c', 'x'), ('c', 'y'), ('c', 'z')]
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]
[('a', 'b'), ('a', 'c'), ('b', 'c')]
[('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b')]
[('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c')]
Enumerate
ΠΠ½ΠΎΠ³Π΄Π°, ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π² ΡΠΈΠΊΠ»Π΅ for, Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ, Π½ΠΎ ΠΈ Π΅Π³ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠΎΠ²ΡΠΉ Π½ΠΎΠΌΠ΅Ρ. Π Π°Π·ΡΠΌΠ΅Π΅ΡΡΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, ΡΠΎΠ·Π΄Π°Π² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ°Π³Π΅ ΡΠΈΠΊΠ»Π°. ΠΠ΄Π½Π°ΠΊΠΎ, Π³ΠΎΡΠ°Π·Π΄ΠΎ ΡΠ΄ΠΎΠ±Π½Π΅Π΅ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠ° enumerate, Π²Π²Π΅Π΄Π΅Π½Π½ΡΠΌ Π² PEP-279. Enumerate β ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°Ρ Π°Ρ (Β«introduces ... to simplify a commonly used looping idiomΒ»), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ ΠΈ Π½Π°Π³Π»ΡΠ΄Π½Π΅Π΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠΈΠΌΠΈ ΠΈΡΠ΅ΡΠ°ΡΠΈΡ. ΠΠ΅ΡΠΎΠ΄ __next__() enumerate Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠΎΡΡΠ΅ΠΆ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ ΡΡΠΎΠΌΡ ΠΈΠ½Π΄Π΅ΠΊΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
Π Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΡΠ°Π±ΠΎΡΠ° enumerate ΡΠΏΡΠΎΡΠ΅Π½Π½ΠΎ ΠΎΠ±ΡΡΡΠ½ΡΠ΅ΡΡΡ ΡΠ΅ΡΠ΅Π· Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ:
def enumerate(sequence, start=0):
n = start
for elem in sequence:
yield n, elem
n += 1
ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ enumerate β Π½Π΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ, Π° ΠΈΡΠ΅ΡΠ°ΡΠΎΡ:
import collections
import types
e = enumerate("abcdef")
print(isinstance(e, enumerate))
print(isinstance(e, collections.Iterable))
print(isinstance(e, collections.Iterator))
print(isinstance(e, types.GeneratorType))
True
True
True
False
Enumerate ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π½Π΅ Π½Π° Python, Π° Π½Π° C, ΠΈ Π² Π΅Π³ΠΎ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅, ΡΠ°Π·ΡΠΌΠ΅Π΅ΡΡΡ, Π½Π΅Ρ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° yield.
ΠΡΠΈΠΌΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ enumerate:
values = ["a", "b", "c", "d"]
for count, value in enumerate(values):
print(count, value)
print("\n")
for count, value in enumerate(values, start=10 ):
print(count, value)
0 a
1 b
2 c
3 d
10 a
11 b
12 c
13 d
ΠΠ΅Π½Π΅ΡΠ°ΡΠΎΡ (generator)
ΠΡΠ±Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ°Ρ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ yield, Π²Π΅ΡΠ½Π΅Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ. ΠΠ΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π΅ Ρ ΡΠ°Π½ΠΈΡ Π² ΠΏΠ°ΠΌΡΡΠΈ Π²ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ, Π° ΠΏΡΠΎΡΡΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ Π΄Π»Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°; ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΠΈΠ»ΠΈ Π±ΡΠ°ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° Π΄Π°Π½Π½ΡΡ (ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ, ΡΠ°ΠΉΠ», ΡΠ΅ΡΠ΅Π²ΠΎΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ Ρ. Π΄.), ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΡ ΠΈΡ .
ΠΡΠΎΠΉΡΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π² ΡΠΈΠΊΠ»Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ°Π³Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡΠΈΡΠ»ΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, Π½ΠΎ Π½Π΅ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ. ΠΠ»Π΅ΠΌΠ΅Π½Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° Π½Π΅Π»ΡΠ·Ρ ΠΈΠ·Π²Π»Π΅ΡΡ ΠΏΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡ, Π±ΡΠ΄Π΅Ρ Π²ΡΠ±ΡΠΎΡΠ΅Π½Π° ΠΎΡΠΈΠ±ΠΊΠ°, Ρ. ΠΊ. Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄ __getitem__().
ΠΠ΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ:
def count(start, step):
current = start
while True:
yield current
current += step
c = count(100, 10)
print(next(c))
print(next(c))
print(next(c))
100
110
120
ΠΠΎΠ½Π΅ΡΠ½ΡΠΉ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ. Π’Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΎΡ, ΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡ Π² ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ list() (Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡ Π² list ΠΈ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ, Π½ΠΎ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΈΡΠΊΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°ΡΡΠ½ΡΡΡΡΡ :):
def count(start, stop, step):
current = start
while current <= stop:
yield current
current += step
c = count(100, 200, 10)
print(next(c))
print(next(c))
print(next(c))
print(list(c))
100
110
120
[130, 140, 150, 160, 170, 180, 190, 200]
Π‘Π»Π΅Π΄ΡΠ΅Ρ ΡΠ°Π·Π΄Π΅Π»ΡΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΡ ΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΡ. ΠΡΠ΅ΡΠ°ΡΠΎΡ β ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΌΠ΅ΡΠΎΠ΄ __next__() Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ. ΠΠ΅Π½Π΅ΡΠ°ΡΠΎΡ β ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΡΠ»ΠΎΠΆΠ΅Π½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΡΠΈ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ.
ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ°
ΠΠ±ΡΡΠ²ΠΈΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ. ΠΠ΅ΡΠ²ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ β ΠΎΠ±ΡΡΠ²ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ Ρ yield, ΠΊΠ°ΠΊ Π±ΡΠ»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²ΡΡΠ΅.
ΠΡΠΎΡΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ β ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ½ΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ (generator expression):
r = range(1, 11)
squares = (n**2 for n in r)
print(list(squares))
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
ΠΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΡ ΠΈΠ»ΠΈ Π΄Π΅Π»Π΅Π³ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π° Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° Π΄ΡΡΠ³ΠΎΠΌΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ yield from:
def subg():
yield 'World'
def generator():
yield 'Hello'
yield from subg()
yield '!'
for i in generator():
print(i, end = ' ')
Hello World !
ΠΠΎ ΡΠΈΡΠΎΠΊΠΎΠ³ΠΎ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΡ asyncio ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ yield from ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»Π°ΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΠΎΡΡΡΠΈΠ½ Π½Π° Π±Π°Π·Π΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠΎΠ².
ΠΠ΅ΠΊΠΎΡΠ°ΡΠΎΡΡ
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΡ?
ΠΠ΅ΠΊΠΎΡΠ°ΡΠΎΡ Π² ΡΠΈΡΠΎΠΊΠΎΠΌ ΡΠΌΡΡΠ»Π΅ β ΠΏΠ°ΡΡΠ΅ΡΠ½ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄ΡΡΠ³ΠΎΠ³ΠΎ. ΠΠ΅ΠΊΠΎΡΠ°ΡΠΎΡΡ β ΡΡΠΎ, ΠΏΠΎ ΡΡΡΠΈ, ΡΠ²ΠΎΠ΅ΠΎΠ±ΡΠ°Π·Π½ΡΠ΅ Β«ΠΎΠ±ΡΡΡΠΊΠΈΒ», ΠΊΠΎΡΠΎΡΡΠ΅ Π΄Π°ΡΡ Π½Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ-Π»ΠΈΠ±ΠΎ Π΄ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π΅Ρ Π΄Π΅ΠΊΠΎΡΠΈΡΡΠ΅ΠΌΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ, Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ Π΅Ρ. ΠΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΡΡΠΎ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΡΠ°Ρ Π°ΡΠΎΠΌ Π΄Π»Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π²ΠΈΠ΄Π°:
my_function = my_decorator(my_function)
def makebold(fn):
def wrapped():
return "<b>" + fn() + "</b>"
return wrapped
def makeitalic(fn):
def wrapped():
return "<i>" + fn() + "</i>"
return wrapped
# Π Π°Π·ΡΠΌΠ΅Π΅ΡΡΡ, ΠΏΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠΎΠ² ΠΈΠ³ΡΠ°Π΅Ρ ΡΠΎΠ»Ρ ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π΄Π΅ΠΊΠΎΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
@makebold
@makeitalic
def hello():
return "Hello, world!"
print(hello())
<b><i>Hello, world!</i></b>
ΠΠ΅ΠΊΠΎΡΠ°ΡΠΎΡ, ΠΏΠΎΠ΄ΡΡΠΈΡΡΠ²Π°ΡΡΠΈΠΉ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ:
import time
def perf_counter(function):
def counted(*args):
start_time = time.perf_counter_ns()
res = function(*args)
print(f"{time.perf_counter_ns() - start_time} ns")
return res
return counted
@perf_counter
def slow_sum(x, y):
time.sleep(1)
return x + y
print(slow_sum(1, 2))
1002478400 ns
3
LRU Cache
ΠΠ΅ΠΊΠΎΡΠ°ΡΠΎΡ, ΠΊΠ΅ΡΠΈΡΡΡΡΠΈΠΉ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ. ΠΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Ρ ΡΡΠΈΡΡΠ΅ΠΌΡ.
import functools
def recursion_sum(n):
if n == 1:
return n
print(n, end=" ")
return n + recursion_sum(n - 1)
recursion_sum(5)
print("\n")
recursion_sum(9)
print("\n")
@functools.lru_cache
def recursion_sum2(n):
if n == 1:
return n
print(n, end=" ")
return n + recursion_sum2(n - 1)
recursion_sum2(5)
print("\n")
recursion_sum2(9)
5 4 3 2
9 8 7 6 5 4 3 2
5 4 3 2
9 8 7 6
45
Π Π°Π·ΠΌΠ΅Ρ ΠΊΠ΅ΡΠ° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ 128 Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ. ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΌΠ΅Π½ΠΈΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ 'maxsize=None'.
ΠΠΎΠΊΠ° ΠΌΡ Π½Π΅ ΡΡΠ»ΠΈ Π΄Π°Π»Π΅ΠΊΠΎ ΠΎΡ ΡΠ΅ΠΌΡ ΠΊΠ΅ΡΠ°, ΠΏΠΎΠ³ΡΠ³Π»ΠΈΡΠ΅ Π·Π°ΠΎΠ΄Π½ΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ weakref ΠΈ WeakValueDictionary, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠ΅ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΡΡ ΡΠ°Π±ΠΎΡΡ Ρ ΠΊΠ΅ΡΠ΅ΠΌ.
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΉ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ
Π Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΈ ΠΏΠΎΠ·ΠΈΡΠΈΠΎΠ½Π½ΡΠ΅, ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ β args ΠΈ kwargs ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ. Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠΎΠ² Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ β Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π΄ΡΡΠ³ΡΡ ΡΡΠ½ΠΊΡΠΈΡ:
def text_wrapper(wrap_text):
def wrapped(function):
def wrapper(*args, **kwargs):
result = function(*args, **kwargs)
return f"{wrap_text}\n{result}\n{wrap_text}"
return wrapper
return wrapped
@text_wrapper('============')
def my_decorated_function(text):
return text
print(my_decorated_function('Hello, world!'))
============
Hello, world!
============
ΠΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΡΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ
ΠΠΎΠ΄, ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Π½ΡΠΉ Π²Π½ΡΡΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° with Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΡ: ΠΊΠ°ΠΊ Π΄ΠΎ, ΡΠ°ΠΊ ΠΈ ΠΏΠΎΡΠ»Π΅ ΡΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠΎΠ±ΡΡΠΈΡ Π²Ρ ΠΎΠ΄Π° Π² Π±Π»ΠΎΠΊ with ΠΈ Π²ΡΡ ΠΎΠ΄Π° ΠΈΠ· Π½Π΅Π³ΠΎ. ΠΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π»ΠΎΠ³ΠΈΠΊΡ ΡΠΎΠ±ΡΡΠΈΠΉ, Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΡΠΌ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠΎΠΌ.
ΠΠ° ΡΡΠΎΠ²Π½Π΅ ΠΊΠ»Π°ΡΡΠ° ΡΠΎΠ±ΡΡΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ __enter__ ΠΈ __exit__.
__enter__ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π² ΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ, ΠΊΠΎΠ³Π΄Π° Ρ
ΠΎΠ΄ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΡ Π²Π½ΡΡΡΡ with. ΠΠ΅ΡΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ Π²Π΅ΡΠ½ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠΌΡ Π²Π½ΡΡΡΠΈ Π±Π»ΠΎΠΊΠ° with ΠΊΠΎΠ΄Ρ.
__exit__ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π² ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΡ
ΠΎΠ΄Π° Π±Π»ΠΎΠΊΠ°, Π² Ρ.Ρ. ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π² ΠΌΠ΅ΡΠΎΠ΄ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π° ΡΡΠΎΠΉΠΊΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ (exc_class, exc_instance, traceback).
Π‘Π°ΠΌΡΠΉ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ½Π½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΡΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ β ΠΊΠ»Π°ΡΡ, ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΡΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ open. ΠΠ½ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ ΡΠ°ΠΉΠ» Π±ΡΠ΄Π΅Ρ Π·Π°ΠΊΡΡΡ Π΄Π°ΠΆΠ΅ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ Π²Π½ΡΡΡΠΈ Π±Π»ΠΎΠΊΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ°.
ΠΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠ±ΡΡΡΡΠ΅Π΅ Π²ΡΡ ΠΎΠ΄ΠΈΡΡ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ°, ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΈ ΡΠ΅ΡΡΡΡΡ.
with open('file.txt') as f:
data = f.read()
process_data(data)
Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π²ΡΡΠ΅ ΠΌΡ Π²ΡΡΠ»ΠΈ ΠΈΠ· Π±Π»ΠΎΠΊΠ° with ΡΡΠ°Π·Ρ ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΏΡΠΎΡΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»Π°. ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π΄Π°Π½Π½ΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ Π±Π»ΠΎΠΊΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
ΠΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΡΠ΅ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π·Π°ΠΌΠ΅Π½Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ, ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ΠΠ.
ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΠ²ΠΎΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΡΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ ΠΠ SQLite:
import sqlite3
class db_conn:
def __init__(self, db_name):
self.db_name = db_name
# ΠΡΠΊΡΡΠ²Π°Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΠ
def __enter__(self):
self.conn = sqlite3.connect(self.db_name)
return self.conn
# ΠΠ°ΠΊΡΡΠ²Π°Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΠ
def __exit__(self, exc_type, exc_value, exc_traceback):
self.conn.close()
if exc_value:
raise
if __name__ == "__main__":
db = "test_context_connect.db"
with db_conn(db) as conn:
cursor = conn.cursor()
ΠΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΡΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ Π½Π° Π±Π°Π·Π΅ contextlib
ΠΠ΅ΡΠ΅ΠΏΠΈΡΠ΅ΠΌ Π½Π°Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΡΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ ΠΠ SQLite ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ contextlib:
import sqlite3
from contextlib import contextmanager
# Π‘Ρ
Π΅ΠΌΠ° ΠΊΠΎΠ½ΡΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ°Ρ: Π²ΡΡ, ΡΡΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π΄ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° yield - Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π² ΡΠ°ΠΌΠΊΠ°Ρ
ΡΡΠ½ΠΊΡΠΈΠΈ __enter__,
# Π²ΡΡ ΡΡΠΎ ΠΏΠΎΡΠ»Π΅ β Π² ΡΠ°ΠΌΠΊΠ°Ρ
__exit__.
@contextmanager
def db_conn(db_name):
# ΠΡΠΊΡΡΠ²Π°Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΠ
conn = sqlite3.connect(db_name)
yield conn
# ΠΠ°ΠΊΡΡΠ²Π°Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΠ
conn.close()
if __name__ == "__main__":
db = "test_contextlib_connect.db"
with db_conn(db) as conn:
cursor = conn.cursor()
4. ΠΠΠ
Β«ΠΠ΅ΡΡΠΎ ΡΠΎ Π½Π΅ΡΠΊΠ°Π·Π°Π½Π½ΠΎ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ Π²ΠΈΠ΄ΠΎΠΌ: Π²ΡΡΠΊΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ Π±Π»Π°Π³ΠΎΡΠ²Π΅ΡΠ½ΠΎ, ΠΈ Π²ΡΡΠΊΠΈΠΉ ΠΏΠ»ΠΎΠ΄ Π·ΡΠ΅Π», ΠΈ Π²ΡΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΡΡΡΠ²Π° ΠΈΠ·ΠΎΠ±ΠΈΠ»ΡΡΡ, Π²ΡΡΠΊΠΎΠ΅ Π΄ΡΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ Π±Π»Π°Π³ΠΎΠ²ΠΎΠ½Π½ΠΎΒ».
Β«Π‘Π»Π°Π²ΡΠ½ΡΠΊΠ°Ρ ΠΊΠ½ΠΈΠ³Π° ΠΠ½ΠΎΡ Π°Β».
ΠΠ»Π°ΡΡΡ ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΡ
Π’ΡΡ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π±ΡΠ»ΠΎ Π±Ρ ΠΊ ΠΌΠ΅ΡΡΡ ΠΊΡΠ°ΡΠ΅Π½ΡΠΊΠΎΠ΅, ΠΌΠΈΠ½ΡΡ Π½Π° ΡΠΎΡΠΎΠΊ, Π²Π²Π΅Π΄Π΅Π½ΡΠΈΡΠ΅ Π² ΡΠ΅ΠΌΡ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², Π½ΠΎ Π² Π½Π°Ρ ΡΠ΅ΠΊΡΡΠΈΠΉ ΡΠΎΡΠΌΠ°Ρ ΡΠ°ΠΊΠ°Ρ ΠΌΠΎΡΠ½Π°Ρ Π²ΡΠ΅Π·ΠΊΠ° Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ ΡΠΊΠ»Π°Π΄ΡΠ²Π°Π΅ΡΡΡ. ΠΠ±ΡΡΡΠ½Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ, Π½Π° Π΄ΠΎΡΡΡΠΏΠ½ΡΡ
ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ
ΠΈΠ· ΠΊΠΈΠ½ΠΎΠ²ΡΠ΅Π»Π΅Π½Π½ΠΎΠΉ Β«Π§ΡΠΆΠΈΡ
Β»:
ΠΎΠ±ΡΠ΅ΠΊΡ β ΡΡΠΎ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΊΡΠ΅Π½ΠΎΠΌΠΎΡΡ;
ΠΊΠ»Π°ΡΡ β ΡΡΠΎ ΠΠΎΡΠΎΠ»Π΅Π²Π° ΠΊΡΠ΅Π½ΠΎΠΌΠΎΡΡΠΎΠ². ΠΠ»Π°ΡΡ Π»ΠΈΠ±ΠΎ ΡΠΎΠΆΠ°Π΅Ρ ΠΊΡΠ΅Π½ΠΎΠΌΠΎΡΡΠ°, Π»ΠΈΠ±ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΡΡΠΏΠΈΡΡ Π² Π±ΠΎΠΉ ΡΠ°ΠΌ (@staticmethod);
ΠΌΠ΅ΡΠ°ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ β ΡΡΠΎ ΡΠ°ΠΊΠ°Ρ Π‘ΡΠΏΠ΅Ρ-ΠΠΎΡΠΎΠ»Π΅Π²Π°, ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ Ρ Β«Π‘ΡΠ»Π°ΠΊΠΎΒ», ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΠΆΠ°Π΅Ρ Π΄ΡΡΠ³ΠΈΡ
ΠΠΎΡΠΎΠ»Π΅Π²;
Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ β ΡΡΠΎ ΠΊΡΠ΅Π½ΠΎΠΌΠΎΡΡ ΠΈΠ· Β«ΠΠΎΡΠΊΡΠ΅ΡΠ΅Π½ΠΈΡΒ», ΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΠΌΠΈΠ»Π΅Π½ΡΠΊΠΈΠΉ ΡΠ°ΠΊΠΎΠΉ, Π²Π·ΡΠ²ΡΠΈΠΉ Π»ΡΡΡΠ΅Π΅ ΠΈ ΠΎΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΉ Π³Π΅Π½Π΅ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ ΠΎΡ Π³Π΅Π½ΠΎΠ² Π ΠΈΠΏΠ»ΠΈ.
ΠΡ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ Π²Π΅ΡΠ½ΡΡΡΡΡ ΠΊ ΡΠ΅ΠΌΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Ρ ΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΡΡΠ΅Π·Π½ΡΠΌ Π½Π°ΡΡΡΠΎΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ·ΠΆΠ΅, Π² Π³Π»Π°Π²Π΅ Β«ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°Β», Π½ΠΎ, Π²ΠΎΠΎΠ±ΡΠ΅, Π² ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π½Π΅Ρ Π½ΠΈΡΠ΅Π³ΠΎ ΠΎΡΠΎΠ±ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΠ³ΠΎ; ΠΏΡΠΎΡΡΠΎ Π΄ΠΎ Π½Π΅Π³ΠΎ Π»ΡΡΡΠ΅ Π΄ΠΎΠΉΡΠΈ, ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ³ΡΡΠ·Π½ΡΠ² Π² ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ΅ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π°, ΠΊΠΎΠ³Π΄Π° Π·Π°ΡΠ°ΡΡΡΡ ΡΡΠΎΠΈΡ Π²ΡΠ±ΠΎΡ β ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΠΏΠΎΠ΄Π»Π΅ΡΠΈΡΡ ΡΡΠΎΡ ΠΊΡΡΠΎΠΊ ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ ΡΠΆΠ΅ ΡΡΡΠΏΠΈΡΡ ΠΈ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°ΡΡ Π²ΡΡ ΠΏΠΎ Π½ΠΎΠ²ΠΎΠΉ? ΠΠΎΠ³Π΄Π°-ΡΠΎ Π΄Π°Π²Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Ρ ΠΏΠΈΡΠ°Π» ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π΅ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ΅ Π΄Π»Ρ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ², ΡΠΎ ΡΠΈΡΠ°Ρ Π‘ΡΡΠ°ΡΡΡΡΡΠΏΠ°, ΡΠ»Π΅Π³ΠΊΠ° Π½Π΅Π΄ΠΎΡΠΌΠ΅Π²Π°Π» β Π·Π°ΡΠ΅ΠΌ Π²ΡΡ ΡΡΠΎ? Π§ΡΠΎΠ±Ρ ΠΎΡΠΎΠ·Π½Π°ΡΡ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΡ Π² ΠΎΠ±ΡΠ²ΠΈ, Π½Π°Π΄ΠΎ ΠΏΠΎΡ ΠΎΠ΄ΠΈΡΡ Π±ΠΎΡΠΈΠΊΠΎΠΌ.
ΠΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ
Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ (Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ magic ΠΈΠ»ΠΈ dunder) ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΊΠ»Π°ΡΡΠ° - ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠ°, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ°Ρ ΠΊΠ»Π°ΡΡΠ°ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°ΠΌ ΡΠ·ΡΠΊΠ°.
ΠΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΎΠ½ΠΈ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΠΏΠΎΡΡΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΡΠ²Π½ΠΎ. ΠΡ
Π²ΡΠ·ΡΠ²Π°ΡΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ»ΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠ½ΠΊΡΠΈΡ len() Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄ __len__() ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. ΠΠ΅ΡΠΎΠ΄ __add__(self, other) Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈ ΡΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ +.
ΠΡΠΈΠΌΠ΅ΡΡ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Ρ:
__init__: ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΊΠ»Π°ΡΡΠ°
__add__: ΡΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ Π΄ΡΡΠ³ΠΈΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ
__eq__: ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠ°Π²Π΅Π½ΡΡΠ²ΠΎ Ρ Π΄ΡΡΠ³ΠΈΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ
__cmp__: ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ (Π±ΠΎΠ»ΡΡΠ΅, ΠΌΠ΅Π½ΡΡΠ΅, ΡΠ°Π²Π½ΠΎ)
__iter__: ΠΏΡΠΈ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² ΡΠΈΠΊΠ»
print(dir(int), "\n")
class A: # An empty class
...
a = A()
print(dir(a), "\n")
print(repr(a), "\n")
print(str(a))
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_count', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
<__main__.A object at 0x000001A1FFF3AF20>
<__main__.A object at 0x000001A1FFF3AF20>
ΠΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° __init__ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ ΠΎΠ½ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½ΠΈΡΠ΅Π³ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ. ΠΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° Π΄Π°Π½Π½ΡΡ
Π±ΡΠ΄Π΅Ρ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅.
__repr__ (representation) Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ ΠΌΠ°ΡΠΈΠ½ΠΎ-ΡΠΈΡΠ°Π΅ΠΌΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ.
ΠΠ½ΠΎΠ³Π΄Π° repr ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π΄Π»Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
__str__ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠΎ-ΡΠΈΡΠ°Π΅ΠΌΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅. ΠΡΠ»ΠΈ __str__ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½, ΡΠΎ str ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ repr.
class Person: # A simple class with init, repr and str methods
def __init__(self, name: str):
self.name: str = name
def __repr__(self):
return f"Person '{self.name}'"
def __str__(self):
return f"{self.name}"
def say_hi(self):
print("Hi, my name is", self.name)
p = Person("Charlie")
p.say_hi()
print(repr(p))
print(str(p))
Hi, my name is Charlie
Person 'Charlie'
Charlie
@property
ΠΠ΅ΠΊΠΎΡΠ°ΡΠΎΡ @property ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΠΊΠ°ΠΊ ΠΏΠΎΠ»Ρ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΡΠ΅Π½ΠΈΡ/Π·Π°ΠΏΠΈΡΠΈ ΠΏΠΎΠ»Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°ΠΌΠΈΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΠ²Π΅ΡΠΊΠΎΠΉ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°.
import math
class Circle:
def __init__(self, radius, max_radius):
self._radius = radius
self.max_radius = max_radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if value <= self.max_radius:
self._radius = value
else:
raise ValueError
@property
def area(self):
return 2 * self.radius * math.pi
circle = Circle(10, 100)
circle.radius = 20 # OK
# circle.radius = 101 # Raises ValueError
print(circle.area)
125.66370614359172
@staticmethod
ΠΠ±ΡΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ (Ρ. Π΅. Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Π½ΡΠΉ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠ°ΠΌΠΈ @staticmethod ΠΈΠ»ΠΈ @classmethod) ΠΈΠΌΠ΅Π΅Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΊΠ»Π°ΡΡΠ°.
@staticmethod β ΠΌΠ΅ΡΠΎΠ΄, ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°ΡΠΈΠΉ ΠΊΠ»Π°ΡΡΡ, Π° Π½Π΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΊΠ»Π°ΡΡΠ°. ΠΠΎΠΆΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ Π±Π΅Π· ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°, Ρ. ΠΊ. ΠΌΠ΅ΡΠΎΠ΄ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°. ΠΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ @staticmethod ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π», Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ ΡΠ²ΡΠ·Π°Π½Π½ΡΠΉ Ρ ΠΊΠ»Π°ΡΡΠΎΠΌ, Π½ΠΎ Π½Π΅ ΡΡΠ΅Π±ΡΡΡΠΈΠΉ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°.
@classmethod, cls, self
ΠΡΠ»ΠΈ ΠΌΠ΅ΡΠΎΠ΄ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΊΠ»Π°ΡΡΠ° (ΠΊΠ°ΠΊ @staticmethod), Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ Π΄ΡΡΠ³ΠΈΠΌ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌ ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ ΠΊΠ»Π°ΡΡΠ°, ΡΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ @classmethod.
class B(object):
def foo(self, x):
print(f"Run foo({self}, {x})")
@classmethod
def class_foo(cls, x):
print(f"Run class_foo({cls}, {x})")
@staticmethod
def static_foo(x):
print(f"Run static_foo({x})")
b = B()
b.foo(1)
b.class_foo(1)
b.static_foo(1)
Run foo(<__main__.B object at 0x000001A1FFF3A980>, 1)
Run class_foo(<class '__main__.B'>, 1)
Run static_foo(1)
Π£ @classmethod ΠΏΠ΅ΡΠ²ΡΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ cls (ΠΊΠ»Π°ΡΡ), Π° Ρ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° - self (ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ°).
ΠΠ»Ρ @staticmethod Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π½ΠΈ cls, Π½ΠΈ self.
__dict__
ΠΠ°ΠΆΠ΄ΡΠΉ ΠΊΠ»Π°ΡΡ ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΠΌΠ΅Π΅Ρ Π°ΡΡΠΈΠ±ΡΡ __dict__. ΠΡΠΎ Β«ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉΒ», ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ Π°ΡΡΠΈΠ±ΡΡ, Π΅Π³ΠΎ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π²ΡΡΡΠ½ΡΡ. __dict__ β ΡΠ»ΠΎΠ²Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΡΠ°Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΡ; Π² Π½ΡΠΌ ΠΊΠ»ΡΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΠΌΡ Π°ΡΡΠΈΠ±ΡΡΠ°, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠ°.
class Supercriminal:
publisher = 'DC Comics'
Riddler = Supercriminal()
print(Supercriminal.__dict__)
print(Riddler.__dict__)
Riddler.name = 'Edward Nygma'
print(Riddler.__dict__) # Values from object __dict__
print(Riddler.publisher) # Value from class __dict__
{'__module__': '__main__', 'publisher': 'DC Comics', '__dict__': <attribute '__dict__' of 'Supercriminal' objects>, '__weakref__': <attribute '__weakref__' of 'Supercriminal' objects>, '__doc__': None}
{}
{'name': 'Edward Nygma'}
DC Comics
ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΡΠΈ Π·Π°ΠΏΡΠΎΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ Π°ΡΡΠΈΠ±ΡΡΠ° Python ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠ±ΡΡΠΊΠΈΠ²Π°Π΅Ρ ΡΠ°ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠ»Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈ ΠΊΠ»Π°ΡΡΡ, ΠΎΡ ΠΊΠΎΡΠΎΡΡΡ ΡΠ½Π°ΡΠ°Π»Π΅Π΄ΠΎΠ²Π°Π½ ΠΊΠ»Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
__slots__
ΠΡΠ»ΠΈ Π²Ρ ΠΏΡΠΈΠΏΠΎΠΌΠ½ΠΈΡΠ΅ ΡΠ°Π·Π½ΠΈΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΏΠΈΡΠΊΠΎΠΌ ΠΈ ΠΊΠΎΡΡΠ΅ΠΆΠ΅ΠΌ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ ΠΈ ΠΈΠΈΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΡΠΌ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ, ΡΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΠ΅, ΡΡΠΎ ΡΠΎΠ·Π΄Π°ΡΠ΅Π»ΠΈ Python ΠΏΡΡΠ°ΡΡΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ Π²ΡΠ±ΠΎΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎΠΌ ΠΈ ΡΠΊΠΎΡΠΎΡΡΡΡ (ΡΡΡ Π‘ΠΈ Ρ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ½ΡΠΌΠΈ Π²ΡΡΠ°Π²ΠΊΠ°ΠΌΠΈ ΡΠ»Π΅Π³ΠΊΠ° Π½Π°ΠΏΡΡΠ³Π°Π΅ΡΡΡ, Π½ΠΎ ΠΏΠΎΡΠΎΠΌ ΠΎΠΏΠ°Π΄Π°Π΅Ρ, ΠΊΠ°ΠΊ Π±ΡΠ΄ΡΠΎ Ρ ΠΎΡΠ΅Π» ΡΡΠΎ-ΡΠΎ ΡΠΊΠ°Π·Π°ΡΡ, Π½ΠΎ Π±Π»Π°Π³ΠΎΡΠ°Π·ΡΠΌΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄ΡΠΌΠ°Π»). Π ΡΠΏΠΈΡΠΊΡ ΡΠ°ΠΊΠΈΡ ΠΆΠ΅ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠ΅ΠΉ ΡΠ·ΡΠΊΠ°, Π·Π°ΡΠΎΡΠ΅Π½Π½ΡΡ Π½Π° ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΈ __slots__.
ΠΠΎΡ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½Π°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΏΠΎ __slots__, Π° Π²ΠΎΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ°Π·ΡΡΡΠ½Π΅Π½ΠΈΡ ΠΎΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ. ΠΡΠΈ Π²ΡΠ±ΠΎΡΠ΅ Β«slots ΠΈΠ»ΠΈ Π½Π΅ slotsΒ» ΠΏΠΎΠΌΠ½ΠΈΡΠ΅ ΠΏΡΠΎ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅ PEP 412 β Key-Sharing Dictionary, ΠΊΠΎΡΠΎΡΡΠΉ Π²Π½ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π·Π΄ΡΠ°ΠΉ Π² Π½Π΅ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎΠ΅ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ ΠΊ __slots__.
__dict__, ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΠΉ ΡΡΡΡ Π²ΡΡΠ΅ β ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠ°Ρ ΡΡΡΡΠΊΡΡΡΠ°, ΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π° Π»Π΅ΡΡ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΈ ΡΠ΄Π°Π»ΡΡΡ ΠΏΠΎΠ»Ρ ΠΈΠ· ΠΊΠ»Π°ΡΡΠ°, ΡΡΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ, Π½ΠΎ ΠΏΠΎΡΠΎΠΉ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°Π·ΠΌΠ΅Π½ΡΡΡ ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ Π½Π° ΡΠΊΠΎΡΠΎΡΡΡ ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, ΡΠΎΠ·Π΄Π°Π² __slots__ β ΠΆΠ΅ΡΡΠΊΠΎ Π·Π°Π΄Π°Π½Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΠ΅Π΄ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ², ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΡΡΡΠΈΠΉ ΠΏΠ°ΠΌΡΡΡ, ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π·Π°ΠΏΡΠ΅ΡΠ°Π΅Ρ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ __dict__ ΠΈ __weakref__. Π‘Π»ΠΎΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, ΠΊΠΎΠ³Π΄Π° Ρ ΠΊΠ»Π°ΡΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅ΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ORM, Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΊΡΠΈΡΠΈΡΠ½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠΏΠΈΡΠΊΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π±ΡΡΡΡΠ΅Π΅, ΡΠ΅ΠΌ ΠΏΠΎΠΈΡΠΊ Π² ΡΠ»ΠΎΠ²Π°ΡΠ΅.
class Clan:
__slots__ = ["first", "second"]
clan = Clan()
clan.first = "Joker"
clan.second = "Lex Luthor"
# clan.third = "Green Goblin" # Raises AttributeError
# print(clan.__dict__) # Raises AttributeError
Π‘Π»ΠΎΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ, ΡΠΊΠ°ΠΆΠ΅ΠΌ, Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°Ρ requests (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, __slots__ = ["url", "netloc", "simple_url", "pypi_url", "file_storage_domain"]) ΠΈΠ»ΠΈ ORM peewee (__slots__ = ('stack', '_sql', '_values', 'alias_manager', 'state')).
ΠΠ°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ __slots__ ΠΈΠΌΠ΅Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΡ ΠΈ Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΎ Π½ΠΈΠΆΠ΅.
Π§ΡΠΎΠ±Ρ Π±ΡΠ»ΠΎ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΠΎ ΠΊΠ°ΠΊΠΎΠΌ ΠΏΡΠΈΡΠΎΡΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈ ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΠΈ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ ΠΈΠ΄ΡΡ ΡΠ΅ΡΡ, ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΠΏΡΠΎΡΡΠΎΠ΅ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅:
import timeit
import pympler.asizeof # Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ sys.getsizeof - Π½Π΅ Π»ΡΡΡΠΈΠΉ Π²Π°ΡΠΈΠ°Π½Ρ, Π±Π΅ΡΠ΅ΠΌ ΡΡΠΎΡΠΎΠ½Π½Π΅Π΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅
class NotSlotted():
pass
class Slotted():
__slots__ = 'foo'
not_slotted = NotSlotted()
slotted = Slotted()
def get_set_delete_fn(obj):
def get_set_delete():
obj.foo = "Never Ending Song of Love"
del obj.foo
return get_set_delete
ns = min(timeit.repeat(get_set_delete_fn(not_slotted)))
s = min((timeit.repeat(get_set_delete_fn(slotted))))
print(ns, s, f'{(ns - s) / s * 100} %')
print(pympler.asizeof.asizeof(not_slotted), 'bytes')
print(pympler.asizeof.asizeof(slotted), 'bytes')
0.10838449979200959 0.08712740009650588 24.39772066187959 %
280 bytes
40 bytes
Π― Π² Python 3.10 Π² Windows Π²ΠΈΠΆΡ 24 % ΡΠ°Π·Π½ΠΈΡΡ.
ΠΠ° Π²ΡΡΠΊΠΈΠΉ ΡΠ»ΡΡΠ°ΠΉ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ Π΅ΡΠ΅ ΡΠ°Π· β ΠΏΡΠΎΠ³Π½ΡΠΉΡΠ΅ Π²ΡΠ΅ Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΊΠΎΠ΄Π° Π² IDE, ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π½ΡΠΆΠ½ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ, ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈ Π²ΠΈΠ΄ΠΎΠΈΠ·ΠΌΠ΅Π½ΡΡΡ. ΠΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Ρ __dict__ ΠΈ __slots__. Π Π·Π°ΠΎΠ΄Π½ΠΎ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ ΠΈΡΠΏΡΡΠ°ΠΉΡΠ΅ Π΄Π°Π²Π½ΠΎ Π½Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡΠΈΠΉΡΡ, ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ ΠΏΠΎΡΠ²ΠΈΠ²ΡΠΈΠΉΡΡ Π² Python 3.10 ΡΠΈΠΌΠ±ΠΈΠΎΠ· ΠΌΠ΅ΠΆΠ΄Ρ __slots__ ΠΈ dataclass.
Π£ΡΠΈΠ½Π°Ρ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡ
Π£ΡΠΈΠ½Π°Ρ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡ (duck types) - ΠΏΠΎΡΡΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΊΠ»Π°ΡΡΠΎΠΌ Π½Π΅ ΡΠ΅ΡΠ΅Π· ΡΠ²Π½ΠΎΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅, Π° ΡΠ΅ΡΠ΅Π· ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. Π’Π°ΠΊ, ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠ»Π°ΡΡ, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄Ρ __next__() ΠΈ __iter__(), Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ, Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΡΠ²Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ (ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π²ΡΠΎΠ΄Π΅ @iterator) ΠΈΠ»ΠΈ, ΡΠΊΠ°ΠΆΠ΅ΠΌ, Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΎΡ ΠΊΠ»Π°ΡΡΠ° Iterator.
Iterator
ΠΡΠ΅ΡΠ°ΡΠΎΡ - ΠΊΠ»Π°ΡΡ, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄Ρ __next__() ΠΈ __iter__().
ΠΠ΅ΡΠΎΠ΄ __next__() Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠ° ΠΈΠ»ΠΈ Π²ΡΠΊΠΈΠ΄ΡΠ²Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ StopIteration, ΡΡΠΎΠ±Ρ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΎΡ ΠΈΡΡΠ΅ΡΠΏΠ°Π» Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
ΠΠ΅ΡΠΎΠ΄ __iter__() Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ "self".
class LimitCounter:
def __init__(self, max_value: int):
self.count = 0
self.max_value = max_value
def __next__(self):
self.count += 1
if self.count <= self.max_value:
return self.count
else:
raise StopIteration
def __iter__(self):
return self
limit_counter = LimitCounter(2)
print(next(limit_counter))
print(next(limit_counter))
# print(next(limit_counter)) # Raises StopIteration
1
2
Comparable
ΠΠ°ΡΠΈΠ½Π°Ρ Ρ Python 3.4, Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±ΠΎΠΉ, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ __lt__ (ΠΌΠ΅Π½ΡΡΠ΅) ΠΈ __eq__ (ΡΠ°Π²Π½ΠΎ), Π° ΡΠ°ΠΊΠΆΠ΅ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ @functools.total_ordering.
from functools import total_ordering
@total_ordering
class Person:
def __init__(self, firstname: str, lastname: str):
self.firstname: str = firstname
self.lastname: str = lastname
def _is_valid_operand(self, other):
return hasattr(other, "lastname") and hasattr(other, "firstname")
def __eq__(self, other):
if not self._is_valid_operand(other):
return NotImplemented
return (self.lastname, self.firstname) == (other.lastname, other.firstname)
def __lt__(self, other):
if not self._is_valid_operand(other):
return NotImplemented
return (self.lastname, self.firstname) < (other.lastname, other.firstname)
Finn = Person("Finn", "the Human")
Jake = Person("Jake", "the Dog")
print(Finn != Jake)
True
Hashable
Π₯Π΅ΡΠΈΡΡΠ΅ΠΌΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ __hash__() ΠΈ __eq__(). Π₯Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠΈ Π²ΡΠ΅Π³ΠΎ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π°. Π₯Π΅ΡΠΈΡΡΠ΅ΠΌΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΠΊΠ»ΡΡΠΈ Π² ΡΠ»ΠΎΠ²Π°ΡΡΡ ΠΈ ΠΊΠ°ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ², ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΡΠΈ ΡΡΡΡΠΊΡΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΡ Π΄Π»Ρ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ .
Hashable objects that compare equal must have the same hash value, meaning default hash() that returns 'id(self)'
will not do. That is why Python automatically makes classes unhashable if you only implement eq().
class Hero:
def __init__(self, name: str, level: int):
self.name: str = name
self.level: int = level
def _is_valid_operand(self, other):
return hasattr(other, "name") and hasattr(other, "level")
def __eq__(self, other):
if not self._is_valid_operand(other):
return NotImplemented
return (self.name, self.level) == (other.name, other.level)
def __hash__(self):
return hash((self.name, self.level))
Finn = Hero("Finn the Human", 10_000)
Jake = Hero("Jake the Dog", 10_000)
print(hash(Finn))
print(hash(Jake))
-8707075988359731747
-2276052447712954388
Sortable
ΠΠ»Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΡΠ°ΠΊΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΊΠ°ΠΊ sort() ΠΈΠ»ΠΈ max() Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, ΠΊΠ°ΠΊ ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ Comparable, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ __lt__ (ΠΌΠ΅Π½ΡΡΠ΅) ΠΈ __eq__ (ΡΠ°Π²Π½ΠΎ), Π° ΡΠ°ΠΊΠΆΠ΅ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ @functools.total_ordering.
ΠΠ»Ρ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠΌΠΎΠ³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² ΡΡΠ»ΠΎΠ²ΠΈΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΡΠ½ΠΊΡΠΈΠΉ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ (__lt()__, __gt()__, __le__() ΠΈ __ge__()).
ΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΊΠ»Π°ΡΡ ΡΡΡΠ΄Π΅Π½ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Π½Π΅ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ, Π° ΠΏΠΎ ΡΡΠ΅Π΄Π½Π΅ΠΌΡ Π±Π°Π»Π»Ρ.
from functools import total_ordering
from statistics import mean
@total_ordering
class Student:
def __init__(self, name: str, grades: list[int]):
self.name: str = name
self.grades: list[int] = grades
def _is_valid_operand(self, other):
return hasattr(other, "name") and hasattr(other, "grades")
def __eq__(self, other):
if not self._is_valid_operand(other):
return NotImplemented
return mean(self.grades) == mean(other.grades)
def __lt__(self, other):
if not self._is_valid_operand(other):
return NotImplemented
return mean(self.grades) < mean(other.grades)
# ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ str Π΄Π»Ρ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠΎ-ΡΠΈΡΠ°Π΅ΠΌΠΎΠΉ ΡΠ΅ΠΏΡΠ΅Π·Π΅Π½ΡΠ°ΡΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
def __str__(self):
return self.name + " " + str(mean(self.grades))
Melissa = Student("Melissa Andrew", [4, 3, 4, 5, 4])
Peter = Student("Peter Shining Jr.", [3, 3, 4, 5, 3])
Joe = Student("Just Joe", [5, 5, 4, 5, 5])
print([str(stud) for stud in sorted([Peter, Melissa, Joe], reverse=True)])
['Just Joe 4.8', 'Melissa Andrew 4', 'Peter Shining Jr. 3.6']
Callable
ΠΠ»Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π²ΡΠ·ΠΎΠ²Π° ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ __call__. Π’ΠΈΠΏΡ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡ Π²ΡΠ·ΠΎΠ²Π° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π½Π°Π±ΠΎΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ².
class Counter:
def __init__(self):
self.i = 0
def __call__(self):
self.i += 1
return self.i
counter = Counter()
print(counter())
print(counter())
print(counter())
1
2
3
@classmethod Π½Π΅Π»ΡΠ·Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ:
class Check():
@classmethod
def class_method(cls):
pass
@staticmethod
def static_method():
pass
def instance_method(self):
pass
for attr, val in vars(Check).items():
if not attr.startswith("__"):
print (attr, f"{'is' if callable(val) else 'is NOT'} callable")
class_method is NOT callable
static_method is callable
instance_method is callable
ΠΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΡΠ΅ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΡ, ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ Π³Π»Π°Π²Π΅, ΡΠΎΠΆΠ΅, ΠΊΠ°ΠΊ ΠΌΡ ΡΠ΅ΠΏΠ΅ΡΡ Π²ΠΈΠ΄ΠΈΠΌ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ ΡΠ΅ΡΠ΅Π· ΡΡΠΈΠ½ΡΡ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² __enter__ ΠΈ __exit__.
Π£ΡΠΈΠ½Π°Ρ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡ ΠΈΡΠ΅ΡΠΈΡΡΠ΅ΠΌΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²
Iterable
Iterable β ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΠΎΠΎΡΠ΅ΡΡΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡ ΠΎΠ΄Π° ΠΏΠΎ Π²ΡΠ΅ΠΌ ΡΠ²ΠΎΠΈΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ __iter__(), Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠΈΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΎΡ. Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ __iter__() Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ __contains__().
class MyIterable:
def __init__(self, *args):
self.a = list(args)
def __iter__(self):
return iter(self.a)
mi = MyIterable(1, 2, 3, 4)
print([el for el in mi])
print(1 in mi) # __contains__()
[1, 2, 3, 4]
True
Collection
Collection β ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΠΎΡΠ΅ΡΡΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡ
ΠΎΠ΄Π° ΠΏΠΎ Π²ΡΠ΅ΠΌ ΡΠ²ΠΎΠΈΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ ΠΈ ΠΎΠ±Π»Π°Π΄Π°ΡΡΠΈΠΉ ΠΊΠΎΠ½Π΅ΡΠ½ΡΠΌ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ.
Π Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ iter() Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΌΠ΅ΡΠΎΠ΄ len(), Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠΈΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ.
class MyCollection:
def __init__(self, *args):
self.a = list(args)
def __iter__(self):
return iter(self.a)
def __len__(self):
return len(self.a)
mc = MyCollection(1, 2, 3, 4)
print([el for el in mc])
print(1 in mc)
print(len(mc))
[1, 2, 3, 4]
True
4
Sequence
Π’ΡΠ΅Π±ΡΠ΅Ρ ΠΌΠ΅ΡΠΎΠ΄Ρ len() and getitem(). getitem() Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΠ΄Π°Π²Π°ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Ρ ΡΡΠ΅Π±ΡΠ΅ΠΌΡΠΌ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠΌ ΠΈΠ»ΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ IndexError.
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π±ΡΠ΄ΡΡ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Ρ ΠΌΠ΅ΡΠΎΠ΄Ρ iter(), reversed() ΠΈ contains().
class MySequence:
def __init__(self, a):
self.a = a
def __len__(self):
return len(self.a)
def __getitem__(self, i):
return self.a[i]
ABC Sequence
ΠΠΎΠ»Π»Π΅ΠΊΡΠΈΡ Sequence ΠΈΠ· Abstract Base Classes for Containers ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΎΠ±ΡΡΠ½ΠΎΠΉ Sequence.
ΠΡΡ ΡΠ°ΠΊ ΠΆΠ΅ ΡΡΠ΅Π±ΡΡ __getitem__ ΠΈ __len__, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ __contains__, __iter__, __reversed__, index ΠΈ count.
from collections import abc
class MyAbcSequence(abc.Sequence):
def __init__(self, a):
self.a = a
def __len__(self):
return len(self.a)
def __getitem__(self, i):
return self.a[i]
Π’Π°Π±Π»ΠΈΡΠ° ΡΡΠ΅Π±ΡΠ΅ΠΌΡΡ ΠΈ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ²:
+------------+------------+------------+------------+--------------+
| | Iterable | Collection | Sequence | ABC Sequence |
+------------+------------+------------+------------+--------------+
| iter() | Π½ΡΠΆΠ΅Π½ | Π½ΡΠΆΠ΅Π½ | + | + |
| contains() | + | + | + | + |
| len() | | Π½ΡΠΆΠ΅Π½ | Π½ΡΠΆΠ΅Π½ | Π½ΡΠΆΠ΅Π½ |
| getitem() | | | Π½ΡΠΆΠ΅Π½ | Π½ΡΠΆΠ΅Π½ |
| reversed() | | | + | + |
| index() | | | | + |
| count() | | | | + |
+------------+------------+------------+------------+--------------+
Π Π²ΠΎΠΎΠ±ΡΠ΅, ΠΏΠΎΡΡΠ°ΡΠ΅Π»ΡΠ½Π΅Π΅ ΠΏΡΠΈΡΠΌΠΎΡΡΠΈΡΠ΅ΡΡ Ρ collections.abc, ΡΠ°ΠΌ Π΅ΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π·Π°Π³ΠΎΡΠΎΠ²ΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠΌΠΎΠ³ΡΡ Π²Π°ΠΌ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΡ Π½Π΅ΠΌΠ°Π»ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ ΠΊ ΡΠΏΠΎΠΌΡΠ½ΡΡΡΠΌ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ABC Sequence __getitem__ ΠΈ __len__ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ __setitem__, __delitem__ ΠΈ insert, ΡΠΎ Π² ΠΎΡΠ²Π΅Ρ Π²Ρ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ MutableSequence, ΠΊΠΎΡΠΎΡΠ°Ρ, ΠΊΡΠΎΠΌΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ Sequence, ΠΈΠΌΠ΅Π΅Ρ Π΅ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ append, reverse, extend, pop, remove ΠΈ __iadd__.
ΠΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²
Π Python ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ (=) Π½Π΅ ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΎΠ½ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ²ΡΠ·Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ ΠΈ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π§ΡΠΎΠ±Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠΎΠΏΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² Python, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ copy. ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π΄Π²Π° ΡΠΏΠΎΡΠΎΠ±Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΠΎΠΏΠΈΠΉ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ copy.
Shallow Copy β ΡΡΠΎ ΠΏΠΎΠ±ΠΈΡΠΎΠ²Π°Ρ ΠΊΠΎΠΏΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. Π‘ΠΎΠ·Π΄Π°Π½Π½ΡΠΉ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΡΠ½ΡΡ ΠΊΠΎΠΏΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π² ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ΅. ΠΡΠ»ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΡΠ»ΠΊΠΎΠΉ Π½Π° Π΄ΡΡΠ³ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΊΠΎΠΏΠΈΡΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π°Π΄ΡΠ΅ΡΠ° ΡΡΡΠ»ΠΎΠΊ Π½Π° Π½ΠΈΡ .
Deep Copy β ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ Π²ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΎΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΊ ΡΠ΅Π»Π΅Π²ΠΎΠΌΡ, Ρ. Π΅. Π΄ΡΠ±Π»ΠΈΡΡΠ΅Ρ Π΄Π°ΠΆΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΡΠ»Π°Π΅ΡΡΡ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ.
from copy import copy, deepcopy
class A:
def __init__(self, val: list):
self.val = val
def change_val(self, val: list):
self.val = val
a = A(list("one"))
# ΠΡΠΎΡΡΠΎ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ
b = a # Assignment
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΡΠ»ΠΎΠΊ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡΡ, Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΠ΅ Π² ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ΅
c = copy(a) # Shallow copy
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΌ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΡ
ΡΡ Π²Π½ΡΡΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²
d = deepcopy(a) # Deep Copy
b.change_val(list("two"))
c.change_val(list("three"))
d.change_val(list("four"))
print(a.val, b.val, c.val, d.val)
print(id(a), id(b), id(c), id(d))
print(id(a.val[1]), id(c.val[1]))
['t', 'w', 'o'] ['t', 'w', 'o'] ['t', 'h', 'r', 'e', 'e'] ['f', 'o', 'u', 'r']
1795295519472 1795295519472 1793149281968 1793149273808
1795217224688 1795217321264
ΠΠ°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
class Employee(Person):
def __init__(self, name, age, staff_num, email):
super().__init__(name, age)
self.staff_num = staff_num
self.email = email
ΠΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅
ΠΡΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠΌ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² (method resolution order, MRO) ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΠΈΡΠΎΠ½Ρ Π²ΡΡΡΠ½ΠΈΡΡ, ΠΈΠ· ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°-ΠΏΡΠ΅Π΄ΠΊΠ° Π½ΡΠΆΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄, Π΅ΡΠ»ΠΈ ΠΎΠ½ Π½Π΅ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² ΠΊΠ»Π°ΡΡΠ΅-ΠΏΠΎΡΠΎΠΌΠΊΠ΅.
class PrivateStaffData:
def __init__(self, private_email):
self.private_email = private_email
class PublicStaffData:
def __init__(self, work_email):
self.work_email = work_email
class StaffData(PrivateStaffData, PublicStaffData):
def __init__(self, private_email, work_email):
super().__init__()
print(StaffData.mro())
[<class '__main__.StaffData'>, <class '__main__.PrivateStaffData'>, <class '__main__.PublicStaffData'>, <class 'object'>]
MRO ΡΡΡΠΎΠΈΡ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΊΠ»Π°ΡΡΠ°-ΠΏΠΎΡΠΎΠΌΠΊΠ° ΠΏΠ΅ΡΠ΅ΠΊΡΡΠ²Π°Π»ΠΈ ΠΌΠ΅Π½Π΅Π΅ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΊΠ»Π°ΡΡΠ°-ΠΏΡΠ΅Π΄ΠΊΠ°. MRO ΡΡΡΠΎΠΈΡ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΊΠ»Π°ΡΡΠΎΠ², Π² ΠΊΠΎΡΠΎΡΡΡ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡΡ ΠΏΠΎΠΈΡΠΊ ΠΌΠ΅ΡΠΎΠ΄Π° ΡΠ»Π΅Π²Π° Π½Π°ΠΏΡΠ°Π²ΠΎ (Π»ΠΈΠ½Π΅Π°ΡΠΈΠ·Π°ΡΠΈΡ ΠΊΠ»Π°ΡΡΠ°).
ΠΠ»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠΎΠΌΠ±ΠΎΠ²ΠΈΠ΄Π½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ (ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ΡΠ²Π½ΠΎ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ Π΄Π°ΠΆΠ΅ Π² ΠΏΡΠΎΡΡΠ΅ΠΉΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π²ΡΠ΅ ΠΊΠ»Π°ΡΡΡ Π½Π°ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΎΡ object) Π»ΠΈΠ½Π΅Π°ΡΠΈΠ·Π°ΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΌΠΎΠ½ΠΎΡΠΎΠ½Π½ΠΎΠΉ. ΠΠΎΠ½ΠΎΡΠΎΠ½Π½ΠΎΡΡΡ β ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠΎΠ±Π»ΡΠ΄Π΅Π½ΠΈΡ Π² Π»ΠΈΠ½Π΅Π°ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠ°-ΠΏΠΎΡΠΎΠΌΠΊΠ° ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΠΏΠΎΡΡΠ΄ΠΊΠ° ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ²-ΠΏΡΠ°ΡΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ, ΡΡΠΎ ΠΈ Π² Π»ΠΈΠ½Π΅Π°ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠ°-ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ. ΠΠΈΠ½Π΅Π°ΡΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎ ΡΡΡΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΎΠΉ. Π ΡΠ°Π½Π½ΠΈΡ Π²Π΅ΡΡΠΈΡΡ Python ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ DLR, ΡΠ΅ΠΉΡΠ°Ρ Π² Ρ ΠΎΠ΄Ρ C3-Π»ΠΈΠ½Π΅Π°ΡΠΈΠ·Π°ΡΠΈΡ.
ΠΡΠ»ΠΈ ΠΏΠΎΡΠ»Π΅ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΠ΅Π½ΠΈΡ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΌΠΎΠ½ΠΎΡΠΎΠ½Π½ΠΎΡΡΠΈ ΠΎΡΡΠ°ΡΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠ° Π»ΠΈΠ½Π΅Π°ΡΠΈΠ·Π°ΡΠΈΠΈ, ΡΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡΠ°ΡΡΠΈΠ½ΡΡΠ²Π° (local precedence ordering), Ρ. Π΅. ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΡΠΎΠ±Π»ΡΠ΄Π΅Π½ΠΈΡ Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠΎΠ²-ΡΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ Π² Π»ΠΈΠ½Π΅Π°ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠ°-ΠΏΠΎΡΠΎΠΌΠΊΠ° ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΠΏΠΎΡΡΠ΄ΠΊΠ°, ΡΡΠΎ ΠΈ ΠΏΡΠΈ Π΅Π³ΠΎ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ ΠΊΠ»Π°ΡΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ ΠΊΠ°ΠΊ D(A, B, C), ΡΠΎ Π² Π»ΠΈΠ½Π΅Π°ΡΠΈΠ·Π°ΡΠΈΠΈ D ΠΊΠ»Π°ΡΡ A Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡΠΎΡΡΡ ΡΠ°Π½ΡΡΠ΅ B, Π° ΠΊΠ»Π°ΡΡ B β ΡΠ°Π½ΡΡΠ΅ C.
ΠΡΠ»ΠΈ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅Ρ
ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ² ΠΏΡΠΈ Π»ΠΈΠ½Π΅Π°ΡΠΈΠ·Π°ΡΠΈΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠΎ ΠΎΡΡΠ°Π΅ΡΡΡ ΡΡΠΈ ΠΏΡΡΠΈ:
1 - ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½ΠΎΠΉ ΠΌΠ΅ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ²-ΠΏΡΠ΅Π΄ΠΊΠΎΠ² Π² ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ ΠΊΠ»Π°ΡΡΠ°-ΠΏΠΎΡΠΎΠΌΠΊΠ° (Π½ΠΎ ΡΡΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ Π²ΡΠ΅Π³Π΄Π°);
2 - ΠΏΠ΅ΡΠ΅ΡΠΌΠΎΡΡ ΠΈΠ΅ΡΠ°ΡΡ
ΠΈΠΈ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ;
3 - ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠ΅ΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΉ Π»ΠΈΠ½Π΅Π°ΡΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΡΠ΅Π· ΠΌΠ΅ΡΠ°ΠΊΠ»Π°ΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° mro(cls). ΠΠΎ ΠΏΡΠΈ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Π΅ Π½Π°Π΄ΠΎ Π±ΡΡΡ Π³ΠΎΡΠΎΠ²ΡΠΌ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ ΠΌΠ΅Π½Π΅Π΅ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΊΠ»Π°ΡΡΠ°-ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ Π²ΠΌΠ΅ΡΡΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΊΠ»Π°ΡΡΠ°-ΠΏΠΎΡΠΎΠΌΠΊΠ°.
ΠΡΠΈ Π·Π°Π΄Π°Π½ΠΈΠΈ ΡΠ²ΠΎΠ΅ΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΉ Π»ΠΈΠ½Π΅Π°ΡΠΈΠ·Π°ΡΠΈΠΈ Python ΠΎΡΠΊΠ»ΡΡΠ°Π΅Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ.
ΠΠ°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠΎΠ² ΡΠΎ __slots__
ΠΡΠΈ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΠΎΠΌ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠΈ __slots__ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΡΡΡ, Π½ΠΎ ΡΡΠΎ Π½Π΅ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ __dict__:
class SlotsClass:
__slots__ = 'foo', 'bar'
class ChildSlotsClass(SlotsClass):
...
obj = ChildSlotsClass()
print(obj.__slots__)
obj.something_new = "underwater stones"
print(obj.__dict__)
('foo', 'bar')
{'something_new': 'underwater stones'}
ΠΠ»Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΠ΅ΡΠ½Π΅Π³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΡΠ»ΠΎΡΠ°ΠΌΠΈ Π½ΡΠΆΠ½ΠΎ Π² Π½ΡΠΌ ΡΠ½ΠΎΠ²Π° ΠΏΡΠΈΡΠ²ΠΎΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΡ __slots__, ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΠΏΠΎΠ»Ρ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°ΡΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ.
class SlotsClass:
__slots__ = 'foo', 'bar'
class ChildSlotsClass(SlotsClass):
__slots__ = 'baz'
obj = ChildSlotsClass()
# obj.something_new = "underwater stones" # Raises AttributeError: 'ChildSlotsClass' object has no attribute 'something_new'
ΠΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΠΆΠ΅ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠΎΠ² Ρ Π½Π΅ΠΏΡΡΡΡΠΌΠΈ __slots__ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.
ΠΠ΅ΡΠ°ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΊΠ»Π°ΡΡ? ΠΡΠΎ, Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅, ΠΏΡΠΎΡΡΠΎ ΠΊΡΡΠΎΠΊ ΠΊΠΎΠ΄Π°, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠΈΠΉ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ. ΠΠΎ Π² Python ΠΊΠ»Π°ΡΡ β ΡΡΠΎ Π½Π΅ΡΡΠΎ Π±ΠΎΠ»ΡΡΠ΅Π΅, ΠΊΠ»Π°ΡΡΡ ΡΠ°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ; ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ class, Python ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ:
class A:
...
Π ΠΏΠ°ΠΌΡΡΠΈ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ ΠΎΠ±ΡΠ΅ΠΊΡ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ A.
ΠΠ»Π°ΡΡΡ, ΠΊΠ°ΠΊ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½Π° Ρ ΠΎΠ΄Ρ:
def custom_class(name):
if name == "foo":
class Foo:
...
return Foo # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊΠ»Π°ΡΡ, Π° Π½Π΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ
else:
class Bar:
...
return Bar
MyClass = custom_class("foo")
print(MyClass) # Π€ΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠ»Π°ΡΡ, Π° Π½Π΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ
print(my_class := MyClass()) # ΠΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ°
<class '__main__.custom_class.<locals>.Foo'>
<__main__.custom_class.<locals>.Foo object at 0x000001F0ECF97610>
ΠΠΎ ΡΡΠΎ Π½Π΅ ΠΎΡΠ΅Π½Ρ ΡΠ΄ΠΎΠ±Π½ΠΎ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π½Π°ΠΌ Π΄ΠΎ ΡΠΈΡ ΠΏΠΎΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΈΡΠ°ΡΡ Π²Π΅ΡΡ ΠΊΠΎΠ΄ ΠΊΠ»Π°ΡΡΠ°.
ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΡΠ΅Π»Ρ ΠΌΠ΅ΡΠ°ΠΊΠ»Π°ΡΡΠΎΠ² β Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΊΠ»Π°ΡΡ Π² ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ, Π³Π΅Π½Π΅ΡΠΈΡΡΡ ΠΊΠ»Π°ΡΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΡΠ΅ΠΊΡΡΠΈΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠΌ.
Π‘Π°ΠΌΠΈ ΠΏΠΎ ΡΠ΅Π±Π΅ ΠΌΠ΅ΡΠ°ΠΊΠ»Π°ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΡ ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
ΠΏΠ΅ΡΠ΅Ρ
Π²Π°ΡΡΠ²Π°ΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ°,
ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΊΠ»Π°ΡΡ,
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠ»Π°ΡΡ.
ΠΠΎ ΠΎΠ±ΡΡΠ½ΠΎ Π»ΠΎΠ³ΠΈΠΊΡ ΡΠ°Π±ΠΎΡΡ ΠΌΠ΅ΡΠ°ΠΊΠ»Π°ΡΡΠΎΠ² Π½Π°ΡΡΡΠ°ΡΡ Π²Π΅ΡΠ°ΠΌΠΈ Π²ΡΠΎΠ΄Π΅ ΠΈΠ½ΡΡΠΎΡΠΏΠ΅ΠΊΡΠΈΠΈ ΠΈΠ»ΠΈ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΡΡΠΈΠ΅ΠΉ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΠΊΠΎΠ΄ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π³ΡΠΎΠΌΠΎΠ·Π΄ΠΊΠΎ.
ΠΠ΄Π΅ΡΡ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π΅ΡΠ΅ ΠΏΠ°ΡΡ ΡΡΡΠ°Π½ΠΈΡ ΠΏΡΠΎ Π½ΡΡΠ°Π½ΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈ ΡΠ°Π±ΠΎΡΡ ΠΌΠ΅ΡΠ°ΠΊΠ»Π°ΡΡΠΎΠ², Π½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΠ΅ ΠΏΠ΅ΡΠ΅Π°Π΄ΡΠ΅ΡΠΎΠ²Π°ΡΡ Π²Π°Ρ Π½Π° Π²ΠΎΡ ΡΡΡ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΡΡ ΡΡΠ°ΡΡΡ.
ΠΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΌΠ΅ΡΠ°ΠΊΠ»Π°ΡΡΠΎΠ² Ρ ΠΎΡΠΎΡΠΎ ΡΠ΅ΡΠ°ΡΡΡΡ Π·Π°Π΄Π°ΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠΎΠ² Π΄Π»Ρ ORM. Π‘ΠΊΠ°ΠΆΠ΅ΠΌ, Π΄Π»Ρ
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
ΠΊΠΎΠ΄
keanu = Person(name="Keanu Reeves", age=58)
print(keanu.age)
ΡΠ°ΡΠΏΠ΅ΡΠ°ΡΠ°Π΅Ρ ΡΠΈΡΠ»ΠΎ, Π²Π·ΡΡΠΎΠ΅ ΠΈΠ· ΠΠ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ models.Model ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ __metaclass__, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΡΠ²ΠΎΡΠΈΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΌΠ°Π³ΠΈΡ ΠΈ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡ ΠΊΠ»Π°ΡΡ Person, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΉ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΡΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Π² ΡΠ»ΠΎΠΆΠ½ΡΡ ΠΏΡΠΈΠ²ΡΠ·ΠΊΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ .
ΠΡΠ»ΠΈ Π²Ρ Π²ΡΡ Π΅ΡΠ΅ Π»ΠΎΠΌΠ°Π΅ΡΠ΅ Π³ΠΎΠ»ΠΎΠ²Ρ, Π³Π΄Π΅ Π±Ρ Π²Π°ΠΌ ΠΏΡΠΈΡΠΈΡΡ ΠΌΠ΅ΡΠ°ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΡΠ²ΠΎΡΠΌ ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΎΠΌ ΡΠΏΠΎΠΌΡΠ½ΡΡΡ ΠΎΠ± ΡΡΠΎΠΌ Π² ΡΠ΅Π·ΡΠΌΠ΅, ΡΠΎ Π²ΠΎΡ Π²Π°ΠΌ Π½Π° 147 % ΡΠΌΠ΅ΡΡΠ½Π°Ρ ΡΠΈΡΠ°ΡΠ° ΠΈΠ· Π’ΠΈΠΌΠ° ΠΠΈΡΠ΅ΡΡΠ°: Β«[Metaclasses] are deeper magic than 99% of users should ever worry about. If you wonder whether you need them, you donβt (the people who actually need them know with certainty that they need them, and donβt need an explanation about why)Β», ΡΡΠΎ Π² Π²ΠΎΠ»ΡΠ½ΠΎΠΌ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Β«ΠΠ΅ΡΠ°ΠΊΠ»Π°ΡΡΡ Π½ΡΠΆΠ½Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ²Π΅ΡΠ΅Π½Π½ΡΠΌ Π² ΡΠ΅Π±Π΅ Π»ΡΠ΄ΡΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΡΠ½ΠΎ Π·Π½Π°ΡΡ, ΡΠ΅Π³ΠΎ Ρ ΠΎΡΡΡ ΠΎΡ ΠΆΠΈΠ·Π½ΠΈ, Π° Π²ΠΎΠ²ΡΠ΅ Π½Π΅ ΡΠ΅Π±Π΅Β».
@abstractmethod
ΠΠ±ΡΡΡΠ°ΠΊΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ Π² Python - Π°Π½Π°Π»ΠΎΠ³ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π² Π΄ΡΡΠ³ΠΈΡ ΡΠ·ΡΠΊΠ°Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² C#) - ΠΊΠ»Π°ΡΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΈΠ³Π½Π°ΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², Π±Π΅Π· ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΏΠ΅ΡΠ΅Π»ΠΎΠΆΠ΅Π½Π° Π½Π° ΠΊΠ»Π°ΡΡΡ-ΠΏΠΎΡΠΎΠΌΠΊΠΈ. ΠΠ°Π΄Π°ΡΠ° Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π·Π°Π΄Π°ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° - ΠΎΠ±ΡΠ·Π°ΡΡ ΠΊΠ»Π°ΡΡΡ-ΠΏΠΎΡΠΎΠΌΠΊΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ Π²ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ, Π·Π°Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ Π² ΠΊΠ»Π°ΡΡΠ΅-ΡΠΎΠ΄ΠΈΡΠ΅Π»Π΅.
import abc
class AbstractClass(metaclass=abc.ABCMeta):
@abc.abstractmethod
def return_anything(self):
return
class ConcreteClass(AbstractClass):
def return_anything(self):
return 42
c = ConcreteClass()
print(c.return_anything())
42
ΠΡΠ»ΠΈ Π½Π΅ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ return_anything() Π² ConcreteClass, ΠΏΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ Π²ΡΠ·Π²Π°ΡΡ c.return_anything() Π±ΡΠ΄Π΅Ρ Π²ΡΠ±ΡΠΎΡΠ΅Π½ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ TypeError: Can't instantiate abstract class ConcreteClass with abstract method return_anything.
5. ΠΠ½ΡΡΡΠ΅Π½Π½ΠΎΡΡΠΈ ΡΠ·ΡΠΊΠ°
Β«ΠΡΠ° ΡΡΠ΅Π½Π° ΡΡΠ½Π΅ΡΡΡ Ρ ΡΠ³Π° Π½Π° ΡΠ΅Π²Π΅Ρ, ΠΈ Π² Π½Π΅ΠΉ Π΅ΡΡΡ Π»ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡ ΠΎΠ΄, ΡΠΊΡΡΠ²Π°Π΅ΠΌΡΠΉ ΠΏΡΠ»Π°ΡΡΠΈΠΌ ΠΏΠ»Π°ΠΌΠ΅Π½Π΅ΠΌ, ΡΠ°ΠΊ ΡΡΠΎ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΡΠΌΠ΅ΡΡΠ½ΡΠΉ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ΄Π° ΠΏΡΠΎΠ½ΠΈΠΊΠ½ΡΡΡ.Β»
Β«ΠΡΠΈΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΡΡΠ° ΠΠΆΠΎΠ½Π° ΠΠ°Π½Π΄Π΅Π²ΠΈΠ»ΡΒ».
Π‘Π±ΠΎΡΡΠΈΠΊ ΠΌΡΡΠΎΡΠ°
Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ Python (CPython) ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ ΠΌΡΡΠΎΡΠ° Π΄Π²Π° Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°: ΠΏΠΎΠ΄ΡΡΠ΅Ρ ΡΡΡΠ»ΠΎΠΊ (reference counting, Π½Π΅ΠΎΡΠΊΠ»ΡΡΠ°Π΅ΠΌΡΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ) ΠΈ garbage collector (ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ gc ΠΈΠ· Python, ΠΎΡΠΊΠ»ΡΡΠ°Π΅ΠΌΡΠΉ). ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° ΡΡΡΠ»ΠΎΠΊ Π½Π΅ ΡΠΌΠ΅Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΡΠ»ΠΊΠΈ.
Π¦ΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΡΠ»ΠΊΠΈ ΠΌΠΎΠ³ΡΡ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² βΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ½ΡΡ β ΠΎΠ±ΡΠ΅ΠΊΡΠ°Ρ , Ρ.Π΅. Π² ΠΎΠ±ΡΠ΅ΠΊΡΠ°Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Ρ ΡΠ°Π½ΠΈΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π² ΡΠΏΠΈΡΠΊΠ°Ρ , ΡΠ»ΠΎΠ²Π°ΡΡΡ , ΠΊΠ»Π°ΡΡΠ°Ρ ΠΈ ΠΊΠΎΡΡΠ΅ΠΆΠ°Ρ . GC Π½Π΅ ΡΠ»Π΅Π΄ΠΈΡ Π·Π° ΠΏΡΠΎΡΡΡΠΌΠΈ ΠΈ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΡΡΠ΅ΠΆΠ΅ΠΉ. ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠΎΡΡΠ΅ΠΆΠΈ ΠΈ ΡΠ»ΠΎΠ²Π°ΡΠΈ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΡΡ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΡΠ»Π΅ΠΆΠΊΠΈ ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΡΡΠ»ΠΎΠ²ΠΈΠΉ. Π‘ΠΎ Π²ΡΠ΅ΠΌΠΈ ΠΎΡΡΠ°Π»ΡΠ½ΡΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° ΡΡΡΠ»ΠΎΠΊ.
Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° ΡΡΡΠ»ΠΎΠΊ, ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈΠΉ GC Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ, Π° Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ. GC ΡΠ°Π·Π΄Π΅Π»ΡΠ΅Ρ Π²ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π½Π° 3 ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΡ. ΠΠΎΠ²ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΏΠΎΠΏΠ°Π΄Π°ΡΡ Π² ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅. ΠΡΠ»ΠΈ Π½ΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π²ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ±ΠΎΡΠΊΠΈ ΠΌΡΡΠΎΡΠ°, ΡΠΎ ΠΎΠ½ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΡΡΡ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅. Π§Π΅ΠΌ Π²ΡΡΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅, ΡΠ΅ΠΌ ΡΠ΅ΠΆΠ΅ ΠΎΠ½ΠΎ ΡΠΊΠ°Π½ΠΈΡΡΠ΅ΡΡΡ. Π’Π°ΠΊ ΠΊΠ°ΠΊ Π½ΠΎΠ²ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π·Π°ΡΠ°ΡΡΡΡ ΠΈΠΌΠ΅ΡΡ ΠΎΡΠ΅Π½Ρ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΠΉ ΡΡΠΎΠΊ ΠΆΠΈΠ·Π½ΠΈ (ΡΠ²Π»ΡΡΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ), ΡΠΎ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ» ΠΎΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ ΠΈΡ
ΡΠ°ΡΠ΅, ΡΠ΅ΠΌ ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΆΠ΅ ΠΏΡΠΎΡΠ»ΠΈ ΡΠ΅ΡΠ΅Π· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠ°ΠΏΠΎΠ² ΡΠ±ΠΎΡΠΊΠΈ ΠΌΡΡΠΎΡΠ°.
Π ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΎΠΊΠΎΠ»Π΅Π½Π½ Π΅ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΡΠ΅ΡΡΠΈΠΊ ΠΈ ΠΏΠΎΡΠΎΠ³ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΡ, ΠΏΡΠΈ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΠΈ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ±ΠΎΡΠΊΠΈ ΠΌΡΡΠΎΡΠ°. ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π² Python ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΎΠ½ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΡΠΈ ΠΏΠΎΡΠΎΠ³ΠΈ. ΠΡΠ»ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ ΡΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ, ΡΠΎ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ±ΠΎΡΠΊΠΈ ΠΌΡΡΠΎΡΠ°.
Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΠΏΠΎΡΠΎΠ³ΠΈ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΡ Π΄Π»Ρ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΉ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ Π½Π° 700, 10 ΠΈ 10 ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, Π½ΠΎ Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΈΡ
Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ gc.get_threshold ΠΈ gc.set_threshold.
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΠΏΠΎΠΈΡΠΊΠ° ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈΡ ΡΡΡΠ»ΠΎΠΊ: Π³ΠΎΠ²ΠΎΡΡ ΠΊΡΠ°ΡΠΊΠΎ, GC ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎ Π²ΡΠ΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ ΠΈΠ· Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΡ ΠΈ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΠ΄Π°Π»ΡΠ΅Ρ Π²ΡΠ΅ ΡΡΡΠ»ΠΊΠΈ ΠΎΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. ΠΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ, Ρ ΠΊΠΎΡΠΎΡΡΡ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΡΡΠ΅ΡΡΠΈΠΊ ΡΡΡΠ»ΠΎΠΊ ΠΌΠ΅Π½ΡΡΠ΅ Π΄Π²ΡΡ , ΡΡΠΈΡΠ°ΡΡΡΡ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌΠΈ ΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ΄Π°Π»Π΅Π½Ρ.
Π ΡΡΠ½ΠΎΠΉ ΠΎΡΠ»ΠΎΠ² ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈΡ ΡΡΡΠ»ΠΎΠΊ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Π½Π°Π»ΠΈΡΠΈΡ Ρ GC ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΠΎΠΌΡ ΡΠ»Π°Π³Ρ DEBUG_SAVEALL, Ρ ΠΊΠΎΡΠΎΡΡΠΌ Π²ΡΠ΅ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π±ΡΠ΄ΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ Π² ΡΠΏΠΈΡΠΎΠΊ gc.garbage:
gc.set_debug(gc.DEBUG_SAVEALL)
Π‘ΠΏΠΈΡΠΎΠΊ gc.garbage, Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ objgraph:
Π Π΄ΡΡΠ³ΠΈΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ°Ρ Python ΠΈΠΌΠ΅ΡΡΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΡ ΡΠ±ΠΎΡΠΊΠΈ ΠΌΡΡΠΎΡΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ΅ PyPy ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° ΡΡΡΠ»ΠΎΠΊ. ΠΠ·-Π·Π° ΡΡΠΎΠ³ΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ°ΠΉΠ»Π° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΠΏΡΠΎΡ ΠΎΠ΄Π° GC, Π° Π½Π΅ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΡΠ°ΠΉΠ» Π±ΡΠ» Π·Π°ΠΊΡΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅.
ΠΡΠ»ΠΈ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ°Π±ΠΎΡΡ Π²Ρ ΡΡΡΠΎΠΈΡΠ΅ Π±ΠΎΠ»ΡΡΡΡ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΠ°Ρ Π²Π°ΠΌ ΡΠΎΡΠ½ΠΎ Π½Π΅ Π½ΡΠΆΠ½Π° ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, ΡΠΎ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ» Π²ΡΠ·Π²Π°ΡΡ ΡΠ±ΠΎΡΡΠΈΠΊ ΠΌΡΡΠΎΡΠ° Π² ΡΡΡΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ Π΄Π»Ρ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΡ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΏΠ°ΠΌΡΡΠΈ:
import gc
del my_big_object
gc.collect()
ΠΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΡΡΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° ΡΠ±ΠΎΡΡΠΈΠΊΠ° ΠΌΡΡΠΎΡΠ° Π΅ΡΡΡ ΡΠ°Π·Π½ΡΠ΅ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ, Π½ΠΎ Π² ΡΠ΅Π»ΠΎΠΌ ΡΠ°ΠΊΠ°Ρ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° ΠΏΡΠΈΠ·Π½Π°ΡΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ (ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅, ΡΠΌΠΎΡΡΠΈΡΠ΅ ΠΎΠΆΠΈΠ²Π»ΡΠ½Π½ΡΠ΅ ΠΊΠΎΠΌΠΌΠ΅ΡΠ°ΡΠΈΠΈ ΠΊ ΠΏΠ΅ΡΠ²ΠΎΠΌΡ ΠΎΡΠ²Π΅ΡΡ).
Arguments
Inside Function Call
(<positional_args>) # f(0, 0) (<keyword_args>) # f(x=0, y=0) (<positional_args>, <keyword_args>) # f(0, y=0)
Inside Function Definition
def f(<nondefault_args>): # def f(x, y): def f(<default_args>): # def f(x=0, y=0): def f(<nondefault_args>, <default_args>): # def f(x, y=0):
A function has its default values evaluated when it's first encountered in the scope. Any changes to default values that are mutable will persist between invocations.
Splat Operator
Inside Function Call
Splat expands a collection into positional arguments, while splatty-splat expands a dictionary into keyword arguments.
args = (1, 2) kwargs = {'x': 3, 'y': 4, 'z': 5} func(*args, **kwargs)
Is the same as:
func(1, 2, x=3, y=4, z=5)
Inside Function Definition
Splat combines zero or more positional arguments into a tuple, while splatty-splat combines zero or more keyword arguments into a dictionary.
def add(*a): return sum(a)
add(1, 2, 3) 6
Legal argument combinations:
def f(*, x, y, z): # f(x=1, y=2, z=3) def f(x, *, y, z): # f(x=1, y=2, z=3) | f(1, y=2, z=3) def f(x, y, *, z): # f(x=1, y=2, z=3) | f(1, y=2, z=3) | f(1, 2, z=3)
def f(*args): # f(1, 2, 3) def f(x, *args): # f(1, 2, 3) def f(*args, z): # f(1, 2, z=3)
def f(**kwargs): # f(x=1, y=2, z=3) def f(x, **kwargs): # f(x=1, y=2, z=3) | f(1, y=2, z=3) def f(*, x, **kwargs): # f(x=1, y=2, z=3)
def f(*args, **kwargs): # f(x=1, y=2, z=3) | f(1, y=2, z=3) | f(1, 2, z=3) | f(1, 2, 3) def f(x, *args, **kwargs): # f(x=1, y=2, z=3) | f(1, y=2, z=3) | f(1, 2, z=3) | f(1, 2, 3) def f(*args, y, **kwargs): # f(x=1, y=2, z=3) | f(1, y=2, z=3)
Other Uses
= [ [, ...]] = { [, ...]} = (*, [...]) = {** [, ...]}
head, *body, tail =
ΠΠ°ΠΊ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π² ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ»ΠΈ ΠΌΠ΅ΡΠΎΠ΄? ΠΠ°ΠΊ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π² Python (by value or reference)?
lambda-ΡΡΠ½ΠΊΡΠΈΠΈ
ΠΡΠΎ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠ½ΠΈ Π½Π΅ ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΡΡΡ ΠΈΠΌΠ΅Π½ΠΈ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ ΠΈΠΌΠ΅Π½. ΠΡΠΌΠ±Π΄Ρ ΡΠ°ΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π² ΡΡΠ½ΠΊΡΠΈΠΈ map, reduce, filter.
ΠΡΠΌΠ±Π΄Ρ Π² ΠΠΈΡΠΎΠ½Π΅ ΠΌΠΎΠ³ΡΡ ΡΠΎΡΡΠΎΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΡΠΊΠΎΠ±ΠΎΠΊ, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΎΡΠΌΠΈΡΡ ΡΠ΅Π»ΠΎ Π»ΡΠΌΠ±Π΄Ρ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΠΎΠΊ.
ΠΠΎΠΏΡΡΡΠΈΠΌΡ Π»ΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ?
nope = lambda: pass riser = lambda x: raise Exception(x) ΠΠ΅Ρ, ΠΏΡΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ Π²ΡΡΠΊΠΎΡΠΈΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ SyntaxError. Π ΡΠ΅Π»Π΅ Π»ΡΠΌΠ±Π΄Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅. pass ΠΈ raise ΡΠ²Π»ΡΡΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°ΠΌΠΈ.
Lambda
= lambda: <return_value> = lambda <arg_1>, <arg_2>: <return_value>
Conditional Expression
<obj> = <exp_if_true> if <condition> else <exp_if_false>
>>> [a if a else 'zero' for a in (0, 1, 2, 3)]
['zero', 1, 2, 3]
Closure
We have/get a closure in Python when: A nested function references a value of its enclosing function and then the enclosing function returns the nested function.
def get_multiplier(a):
def out(b):
return a * b
return out
>>> multiply_by_3 = get_multiplier(3)
>>> multiply_by_3(10)
30
If multiple nested functions within enclosing function reference the same value, that value gets shared.
To dynamically access function's first free variable use '<function>.__closure__[0].cell_contents'
.
ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ (Exceptions)
ΠΠ΅ΡΠ΅Ρ Π²Π°Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ
ΠΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ:
a: float = 0
b: float = 0
try:
b: float = 1/a
except ZeroDivisionError as e:
print(f"Error: {e}")
Error: division by zero
ΠΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ.
ΠΠΎΠ΄ Π² Π±Π»ΠΎΠΊΠ΅ else ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΡΡΡΡΡΠ²ΠΈΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ.
ΠΠΎΠ΄ Π² Π±Π»ΠΎΠΊΠ΅ finally ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΡΡ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π±ΡΠ»ΠΎ Π»ΠΈ Π²ΡΠ·Π²Π°Π½ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π½Π΅Ρ.
import traceback
a: float = 0
b: float = 0
try:
b: float = 1/a
except ZeroDivisionError as e:
print(f"Error: {e}")
except ArithmeticError as e:
print(f"We have a bit more complicated problem: {e}")
except Exception as serious_problem: # Catch all exceptions
print(f"I don't really know what is going on: {traceback.print_exception(serious_problem)}")
else:
print("No errors!")
finally:
print("This part is always called")
Error: division by zero
This part is always called
ΠΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ
Π‘ΠΎΠΊΡΠ°ΡΠ΅Π½Π½ΠΎΠ΅ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:
BaseException
+-- SystemExit # Raised by the sys.exit() function
+-- KeyboardInterrupt # Raised when the user press the interrupt key (ctrl-c)
+-- Exception # User-defined exceptions should be derived from this class
+-- ArithmeticError # Base class for arithmetic errors
| +-- ZeroDivisionError # Dividing by zero
+-- AttributeError # Attribute is missing
+-- EOFError # Raised by input() when it hits end-of-file condition
+-- LookupError # Raised when a look-up on a collection fails
| +-- IndexError # A sequence index is out of range
| +-- KeyError # A dictionary key or set element is missing
+-- NameError # An object is missing
+-- OSError # Errors such as βfile not foundβ
| +-- FileNotFoundError # File or directory is requested but doesn't exist
+-- RuntimeError # Error that don't fall into other categories
| +-- RecursionError # Maximum recursion depth is exceeded
+-- StopIteration # Raised by next() when run on an empty iterator
+-- TypeError # An argument is of wrong type
+-- ValueError # When an argument is of right type but inappropriate value
+-- UnicodeError # Encoding/decoding strings to/from bytes fails
ΠΠΎΠ»Π½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ Π·Π΄Π΅ΡΡ.
ΠΡΠ·ΠΎΠ² ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ
from decimal import *
def div(a: Decimal, b: Decimal) -> Decimal:
if b == 0:
raise ValueError("Second argument must be non-zero")
return a/b
try:
c: Decimal = div(1, 0)
except ValueError as ve:
print(f"{ve}. We have ValueError, as a planned!")
# raise # We can re-raise exception
Second argument must be non-zero. We have ValueError, as a planned!
ΠΡΡ ΠΎΠ΄ ΠΈΠ· ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Π²ΡΠ·ΠΎΠ²Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ SystemExit
import sys
# sys.exit() # Exits with exit code 0 (success)
# sys.exit(8) # Exits with passed exit code
ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ
class MyException(Exception):
pass
raise MyException("My car is broken")
---------------------------------------------------------------------------
MyException Traceback (most recent call last)
c:\Works\amaargiru\pycore\05_language_skeleton.ipynb Cell 18 in <cell line: 4>()
<a href='vscode-notebook-cell:/c%3A/Works/amaargiru/pycore/05_language_skeleton.ipynb#X23sZmlsZQ%3D%3D?line=0'>1</a> class MyException(Exception):
<a href='vscode-notebook-cell:/c%3A/Works/amaargiru/pycore/05_language_skeleton.ipynb#X23sZmlsZQ%3D%3D?line=1'>2</a> pass
----> <a href='vscode-notebook-cell:/c%3A/Works/amaargiru/pycore/05_language_skeleton.ipynb#X23sZmlsZQ%3D%3D?line=3'>4</a> raise MyException("My car is broken")
MyException: My car is broken
ΠΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ
ΠΠ°ΡΠΈΠ½Π°Ρ Ρ Python 3.11 ΠΎΡΠ»Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠ³Π°ΡΠ°ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ:
try:
raise TypeError('Bad type')
except Exception as e:
e.add_note('We are powerless, we rely on a higher authority')
raise
ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ β Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΏΠΎΡΠ½Π°Ρ ΡΠ΅ΠΌΠ°, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ ΡΠΈΠ»ΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΡΠ΅ΠΊΠ°Π΅ΡΡΡ Ρ ΡΠ΅ΠΌΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΉ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠΎΡΡΠΎΠΌΡ ΠΊΡΠΎ-ΡΠΎ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΡΡΠΊΠΈ Success/Failure, ΠΊΡΠΎ-ΡΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ²ΠΎΠΈ ΠΊΠ»Π°ΡΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠΌΠ΅ΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π»ΠΎΠ³Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΡΠΈΠ»ΡΠ½ΠΎ ΠΎΠ±Π»Π΅Π³ΡΠ°Π΅Ρ ΠΎΡΠ»Π°Π΄ΠΊΡ.
ΠΠΈΡΠ½ΠΎ Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Ρ ΠΏΡΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ, Π½Π° ΠΌΠΎΠΉ Π²Π·Π³Π»ΡΠ΄, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°ΡΡ Β«ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΌΒ»:
ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΎΡΠ»Π°Π΄ΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΡΠΌΠΈ;
ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½ΠΎ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π½ΡΡΠ΅;
Π½Π° ΡΠ°ΠΌΡΠΉ Π²Π΅ΡΡ
Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠΎΠ½ΠΈΠΊΠ½ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ (ΠΊΠΎΡΠΎΡΡΠ΅, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅, ΠΏΠΎΠΏΠ°Π΄ΡΡ ΠΈΠ»ΠΈ Π² ΠΎΡΡΠ΅Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²ΡΠΈΠΊΠ° ΠΈΠ»ΠΈ Π² Π±Π°Π³-ΡΠ΅ΠΏΠΎΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ ΡΠΎΠΆΠ΅ Π±ΡΠ΄ΡΡ ΠΊΡΠΏΠΈΡΠΎΠ²Π°Π½Ρ).
ΠΠ΄ΠΈΠ½Π°ΡΠ½ΠΎΠ΅ (_) ΠΈ Π΄Π²ΠΎΠΉΠ½ΠΎΠ΅ (__) ΠΏΠΎΠ΄ΡΠ΅ΡΠΊΠΈΠ²Π°Π½ΠΈΡ. Name mangling.
Python Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ Π΄ΠΎΡΡΡΠΏΠ°, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ private, public, protected ΠΈ Ρ. Π΄. ΠΠ΄Π½Π°ΠΊΠΎ, Π² Π½Π΅ΠΌ Π΅ΡΡΡ ΠΈΠΌΠΈΡΠ°ΡΠΈΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΏΡΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ΄ΠΈΠ½Π°ΡΠ½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΡΠ΅ΡΠΊΠΈΠ²Π°Π½ΠΈΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠ΅ΡΠΈΠΊΡΠ° ΠΊ ΠΈΠΌΠ΅Π½Π°ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ . ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π±Π΅Π· ΠΏΠΎΠ΄ΡΠ΅ΡΠΊΠΈΠ²Π°Π½ΠΈΡ ΡΠ²Π»ΡΡΡΡΡ ΠΎΠ±ΡΠ΅Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌΠΈ.
ΠΠΎΠ»Π΅ ΠΊΠ»Π°ΡΡΠ° Ρ ΠΎΠ΄Π½ΠΈΠΌ Π»ΠΈΠ΄ΠΈΡΡΡΡΠΈΠΌ ΠΏΠΎΠ΄ΡΠ΅ΡΠΊΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²Π½ΡΡΡΠΈ ΠΊΠ»Π°ΡΡΠ°. ΠΡΠΈ ΡΡΠΎΠΌ ΠΎΠ½ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π΄Π»Ρ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΈΠ·Π²Π½Π΅.
class Foo(object):
def __init__(self):
self._bar = 42
Foo()._bar
42
Π‘ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ IDE Π²ΡΠΎΠ΄Π΅ PyCharm ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΈΠ²Π°ΡΡ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΏΠΎΠ»Ρ Ρ ΠΏΠΎΠ΄ΡΠ΅ΡΠΊΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ, Π½ΠΎ ΠΎΡΠΈΠ±ΠΊΠΈ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ.
ΠΠΎΠ»Ρ Ρ Π΄Π²ΠΎΠΉΠ½ΡΠΌ ΠΏΠΎΠ΄ΡΠ΅ΡΠΊΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π²Π½ΡΡΡΠΈ ΠΊΠ»Π°ΡΡΠ°, Π½ΠΎ ΠΈΠ·Π²Π½Π΅ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΠΊ ΠΏΠΎΠ»Ρ Π²ΠΈΠ΄Π° ___ (name mangling). ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΊΡΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ»Ρ Π²Π½Π΅ ΠΊΠ»Π°ΡΡΠ° ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ ΡΡΠΎ ΡΠΌΠΎΡΡΠΈΡΡΡ ΡΡΠΎΠ΄Π»ΠΈΠ²ΠΎ.
class Foo(object):
def __init__(self):
self.__bar = 42
Foo().__bar
AttributeError: 'Foo' object has no attribute '__bar'
Foo()._Foo__bar
42
Π ΡΠ΅Π»ΠΎΠΌ, Π΄ΠΆΠ΅Π½ΡΠ΅Π»ΡΠΌΠ΅Π½ΡΠΊΠΎΠ΅ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΠΉΡΠΎΠ½-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΎΠ² ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ (ΠΏΡΠΎΡΡΠΎΠ΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π»Ρ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ΄ΠΈΠ½Π°ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΡΠ΅ΡΠΊΠΈΠ²Π°Π½ΠΈΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΡΠ΅Π½Ρ Π½Π΅ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ Π²ΡΡΠ°ΡΠΊΠΈΠ²Π°ΡΡ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Ρ ΠΊΠ»Π°ΡΡΠ°) + ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ
class Stack(object):
def __init__(self):
self._storage = []
def push(self, value):
self._storage.append(value)
ΠΠ½ΡΡΠΎΡΠΏΠ΅ΠΊΡΠΈΡ
ΠΠ½Π°Π»ΠΈΠ· ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅
ΠΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ dir() Π±Π΅Π· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΎΠ½Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² (Π²ΠΊΠ»ΡΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΠΈ), Π΄ΠΎΡΡΡΠΏΠ½ΡΡ Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ.
local_variables: list = dir()
locals() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ»ΠΎΠ²Π°ΡΡ ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² (Π°ΡΡΠΈΠ±ΡΡ __dict__). locals() ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½Π° vars() Π±Π΅Π· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°.
local_vars: dict = locals()
globals() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ»ΠΎΠ²Π°ΡΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²
global_variables: dict = globals()
print(local_variables)
print(local_vars)
print(global_variables)
['In', 'Out', '_', '__', '___', '__annotations__', '__builtin__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '__vsc_ipynb_file__', '_dh', '_i', '_i1', '_ih', '_ii', '_iii', '_oh', 'exit', 'get_ipython', 'quit']
{'__name__': '__main__', '__doc__': 'Automatically created module for IPython interactive environment', '__package__': None, '__loader__': None, '__spec__': None, '__builtin__': <module 'builtins' (built-in)>, '__builtins__': <module 'builtins' (built-in)>, '_ih': ['', 'local_variables: list = dir()', 'local_vars: dict = locals()', 'global_variables: dict = globals()\n\nprint(local_variables)\nprint(local_vars)\nprint(global_variables)'], '_oh': {}, '_dh': [WindowsPath('c:/Works/amaargiru/pycore')], 'In': ['', 'local_variables: list = dir()', 'local_vars: dict = locals()', 'global_variables: dict = globals()\n\nprint(local_variables)\nprint(local_vars)\nprint(global_variables)'], 'Out': {}, 'get_ipython': <bound method InteractiveShell.get_ipython of <ipykernel.zmqshell.ZMQInteractiveShell object at 0x000002B22DC22260>>, 'exit': <IPython.core.autocall.ZMQExitAutocall object at 0x000002B22DC22D10>, 'quit': <IPython.core.autocall.ZMQExitAutocall object at 0x000002B22DC22D10>, '_': '', '__': '', '___': '', '__vsc_ipynb_file__': 'c:\\Works\\amaargiru\\pycore\\05_language_skeleton.ipynb', '_i': 'local_vars: dict = locals()', '_ii': 'local_variables: list = dir()', '_iii': '', '_i1': 'local_variables: list = dir()', '__annotations__': {'local_variables': <class 'list'>, 'local_vars': <class 'dict'>, 'global_variables': <class 'dict'>}, 'local_variables': ['In', 'Out', '_', '__', '___', '__annotations__', '__builtin__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '__vsc_ipynb_file__', '_dh', '_i', '_i1', '_ih', '_ii', '_iii', '_oh', 'exit', 'get_ipython', 'quit'], '_i2': 'local_vars: dict = locals()', 'local_vars': {...}, '_i3': 'global_variables: dict = globals()\n\nprint(local_variables)\nprint(local_vars)\nprint(global_variables)', 'global_variables': {...}}
{'__name__': '__main__', '__doc__': 'Automatically created module for IPython interactive environment', '__package__': None, '__loader__': None, '__spec__': None, '__builtin__': <module 'builtins' (built-in)>, '__builtins__': <module 'builtins' (built-in)>, '_ih': ['', 'local_variables: list = dir()', 'local_vars: dict = locals()', 'global_variables: dict = globals()\n\nprint(local_variables)\nprint(local_vars)\nprint(global_variables)'], '_oh': {}, '_dh': [WindowsPath('c:/Works/amaargiru/pycore')], 'In': ['', 'local_variables: list = dir()', 'local_vars: dict = locals()', 'global_variables: dict = globals()\n\nprint(local_variables)\nprint(local_vars)\nprint(global_variables)'], 'Out': {}, 'get_ipython': <bound method InteractiveShell.get_ipython of <ipykernel.zmqshell.ZMQInteractiveShell object at 0x000002B22DC22260>>, 'exit': <IPython.core.autocall.ZMQExitAutocall object at 0x000002B22DC22D10>, 'quit': <IPython.core.autocall.ZMQExitAutocall object at 0x000002B22DC22D10>, '_': '', '__': '', '___': '', '__vsc_ipynb_file__': 'c:\\Works\\amaargiru\\pycore\\05_language_skeleton.ipynb', '_i': 'local_vars: dict = locals()', '_ii': 'local_variables: list = dir()', '_iii': '', '_i1': 'local_variables: list = dir()', '__annotations__': {'local_variables': <class 'list'>, 'local_vars': <class 'dict'>, 'global_variables': <class 'dict'>}, 'local_variables': ['In', 'Out', '_', '__', '___', '__annotations__', '__builtin__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '__vsc_ipynb_file__', '_dh', '_i', '_i1', '_ih', '_ii', '_iii', '_oh', 'exit', 'get_ipython', 'quit'], '_i2': 'local_vars: dict = locals()', 'local_vars': {...}, '_i3': 'global_variables: dict = globals()\n\nprint(local_variables)\nprint(local_vars)\nprint(global_variables)', 'global_variables': {...}}
ΠΠ°Π±Ρ Π½Π΅ ΡΠ³Π»ΡΠ±Π»ΡΡΡΡ Π² Π΄Π΅Π±ΡΠΈ ΠΈΠ½ΡΡΠΎΡΠΏΠ΅ΠΊΡΠΈΠΈ ΠΎΡΠΎΠ±ΠΎ Π³Π»ΡΠ±ΠΎΠΊΠΎ (ΡΡΡΡ, Π΄ΡΠΌΠ°Ρ, Π²Ρ ΡΠΆΠ΅ ΡΠ»ΠΎΠ²ΠΈΠ»ΠΈ), Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»ΠΈΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΠ΅ Π΅Ρ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ².
ΠΡΡΠΈΠ±ΡΡΡ
l: list = dir(object) # ΠΠΌΠ΅Π½Π° Π°ΡΡΠΈΠ±ΡΡΠΎΠ² ΠΎΠ±ΡΠ΅ΠΊΡΠ° (Π²ΠΊΠ»ΡΡΠ°Ρ ΠΌΠ΅ΡΠΎΠ΄Ρ)
d: dict = vars(object) # ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ object.__dict__.
value = getattr(object, 'attr_name') # Raises AttributeError if attribute is missing.
b: bool = hasattr(object, 'attr_name') # Checks if getattr() raises an AttributeError.
setattr(object, 'attr_name', value) # Only works on objects with '__dict__' attribute.
delattr(object, 'attr_name') # Same. Also `del <object>.<attr_name>`.
Parameters
= inspect.signature() # Function's Signature object.
= .parameters # Dict of Parameter objects.
= .kind # Member of ParameterKind enum.
= .default # Default value or .empty.
= .annotation # Type or .empty.
GIL
Global Interpreter Lock - ΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΡΠ΅Π΄, ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ΅Π΄Ρ Π² ΡΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΡΡΠ°ΠΈΠ²Π°ΡΡ.
GIL ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ ΡΠΎΠ³Π»Π°ΡΠΎΠ²ΡΠ²Π°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ . ΠΠ΅Π· ΡΡΠΎΠ³ΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ ΡΡΠ΅Π΄ ΡΠ΄Π°Π»ΠΈΡ Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ°, Π° Π²ΡΠΎΡΠΎΠΉ Π½Π°ΡΠ½Π΅Ρ ΠΈΡΠ΅ΡΠ°ΡΠΈΡ ΠΏΠΎ Π½Π΅ΠΌΡ, ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ°. ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ, ΡΠ±ΠΎΡΡΠΈΠΊ ΠΌΡΡΠΎΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΡΠ°ΡΡ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΠΏΠΎΠ΄ΡΡΠΈΡΡΠ²Π°ΡΡ ΡΡΡΠ»ΠΊΠΈ. ΠΡΠΎΠ±Π»Π΅ΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΡΠΈΡΡ, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ² Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π½Π° Π²ΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ , Π½ΠΎ ΡΡΠΎ ΠΏΡΠΈΠ²Π½Π΅ΡΠ»ΠΎ Π±Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ: ΠΎΠ²Π΅ΡΡ Π΅Π΄ ΠΏΠΎ ΠΊΠΎΠ΄Ρ, ΠΏΠΎΡΠ΅ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ deadlocks. GIL ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡ ΠΏΡΠΎΡΡΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ C-Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°ΡΠ°ΡΡΡΡ ΡΠΎΠΆΠ΅ Π½Π΅ ΠΏΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½Ρ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π±ΡΡΡΡΡΡ ΡΠ°Π±ΠΎΡΡ ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ ΡΠΊΡΠΈΠΏΡΠΎΠ².
GIL ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ°ΠΊ: Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΡΠ΅Π΄ Π²ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠ²Π°Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΠ½ ΠΈΠ·ΠΌΠ΅ΡΡΠ΅ΡΡΡ Π² ΠΌΠ°ΡΠΈΠ½Π½ΡΡ Π΅Π΄ΠΈΠ½ΠΈΡΠ°Ρ βΡΠΈΠΊΠ°Ρ β ΠΈ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠ°Π²Π΅Π½ 100. ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΡΡΠ΅Π΄ Π±ΡΠ»ΠΎ ΠΏΠΎΡΡΠ°ΡΠ΅Π½ΠΎ 100 ΡΠΈΠΊΠΎΠ², ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ Π±ΡΠΎΡΠ°Π΅Ρ ΡΡΠΎΡ ΡΡΠ΅Π΄ ΠΈ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π½Π° Π²ΡΠΎΡΠΎΠΉ, ΡΡΠ°ΡΠΈΡ 100 ΡΠ°ΠΊΡΠΎΠ² Π½Π° Π½Π΅Π³ΠΎ, Π·Π°ΡΠ΅ΠΌ ΡΡΠ΅ΡΠΈΠΉ, ΠΈ ΡΠ°ΠΊ ΠΏΠΎ ΠΊΡΡΠ³Ρ. ΠΡΠΎΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ Π³Π°ΡΠ°Π½ΠΈΡΡΡΠ΅Ρ, ΡΡΠΎ Π²ΡΠ΅ΠΌ ΡΡΠ΅Π΄Π°ΠΌ Π±ΡΠ΄Π΅Ρ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΎ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΏΠΎΡΠΎΠ²Π½Ρ.
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΈΠ·-Π·Π° GIL Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ Π²ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ΅ΡΠ΅Π½Ρ Π² ΡΡΠ΅Π΄Π°Ρ . ΠΠ°ΠΏΡΠΎΡΠΈΠ², ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠ½ΠΈΠΆΠ°Π΅Ρ Π±ΡΡΡΡΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π‘ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΠ΅Π΄ΠΎΠ² ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ»Π΅Π΄ΠΈΡΡ Π·Π° Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΠΊ ΠΎΠ±ΡΠΈΠΌ ΡΠ΅ΡΡΡΡΠ°ΠΌ: ΡΠ»ΠΎΠ²Π°ΡΡΠΌ, ΡΠ°ΠΉΠ»Π°ΠΌ, ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ΠΌ ΠΊ ΠΠ.
ΠΠ°ΠΊ ΠΎΠ±ΠΎΠΉΡΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, Π½Π°ΠΊΠ»Π°Π΄ΡΠ²Π°Π΅ΠΌΡΠ΅ GIL?
ΠΠ°ΡΠΈΠ°Π½Ρ 1 - ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΡ Python, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ PyPy.
ΠΠ°ΡΠΈΠ°Π½Ρ 2 - ΡΡ
ΠΎΠ΄ ΠΎΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΠΈ Π² ΡΡΠΎΡΠΎΠ½Ρ ΠΌΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠ½ΠΎΡΡΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ multiprocessing. ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΠ°Π·ΠΎΠ±ΡΠ°Π½ Π½ΠΈΠΆΠ΅.
*args, **kwargs, *
ΠΡΡΠ°ΠΆΠ΅Π½ΠΈΡ *args ΠΈ **kwargs ΠΎΠ±ΡΡΠ²Π»ΡΡΡ Π² ΡΠΈΠ³Π½Π°ΡΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠ½ΠΈ ΠΎΠ·Π½Π°ΡΠ°ΡΡ, ΡΡΠΎ Π²Π½ΡΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π±ΡΠ΄ΡΡ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Ρ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ args ΠΈ kwargs (Π±Π΅Π· Π·Π²Π΅Π·Π΄ΠΎΡΠ΅ΠΊ).
args β ΡΡΠΎ ΠΊΠΎΡΡΠ΅ΠΆ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°Π΅Ρ ΠΏΠΎΠ·ΠΈΡΠΈΠΎΠ½Π½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ. kwargs β ΡΠ»ΠΎΠ²Π°ΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΠΎΠ½Π½ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ², Π³Π΄Π΅ ΠΊΠ»ΡΡ β ΠΈΠΌΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ β Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°. ΠΠΌΠ΅ΡΡΠΎ args ΠΈ kwargs ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΠΈΠΌΠ΅Π½Π° (ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΡ ΡΠ°Π²Π½ΠΎ Β«ΠΏΠΎΠΉΠΌΡΡΒ», ΡΡΠΎ ΠΎΡ Π½Π΅Ρ Ρ ΠΎΡΡΡ, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Π·Π²Π΅Π·Π΄ΠΎΡΠΊΠ΅ ΠΈ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Π·Π²Π΅Π·Π΄ΠΎΡΠΊΠ΅), Π½ΠΎ ΡΡΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° ΠΌΠ°Π»ΠΎ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π°.
ΠΠ°ΠΆΠ½ΠΎ: Π΅ΡΠ»ΠΈ Π² ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π±ΡΠ΄ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ°Π²Π½Ρ ΠΏΡΡΡΠΎΠΌΡ ΠΊΠΎΡΡΠ΅ΠΆΡ ΠΈ ΠΏΡΡΡΠΎΠΌΡ ΡΠ»ΠΎΠ²Π°ΡΡ, Π° Π½Π΅ None.
Operator
Module of functions that provide the functionality of operators.
import operator as op
<el> = op.add/sub/mul/truediv/floordiv/mod(<el>, <el>) # +, -, *, /, //, %
<int/set> = op.and_/or_/xor(<int/set>, <int/set>) # &, |, ^
<bool> = op.eq/ne/lt/le/gt/ge(<sortable>, <sortable>) # ==, !=, <, <=, >, >=
<func> = op.itemgetter/attrgetter/methodcaller(<obj>) # [index/key], .name, .name()
elementwise_sum = map(op.add, list_a, list_b)
sorted_by_second = sorted(<collection>, key=op.itemgetter(1))
sorted_by_both = sorted(<collection>, key=op.itemgetter(1, 0))
product_of_elems = functools.reduce(op.mul, <collection>)
union_of_sets = functools.reduce(op.or_, <coll_of_sets>)
first_element = op.methodcaller('pop', 0)(<list>)
Binary operators require objects to have and(), or(), xor() and invert() special methods, unlike logical operators that work on all types of objects.
Also: `'<bool> = <bool> &|^ <bool>'` and `'<int> = <bool> &|^ <int>'`.
6. ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΡ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°ΡΠ½ΠΎΡΡΡ
Β«Π Π΄ΠΎΠ»Π³ΠΎ ΠΎΡΡΠ°Π²Π°Π»ΠΈΡΡ Π½Π° ΠΌΠ΅ΡΡΠ΅ ΡΠ°ΠΌ, Π° ΡΠΎΠ»Π½ΡΠ° Π½Π΅ Π²ΠΈΠ΄Π΅Π»ΠΈ, Π½ΠΎ ΡΠ²Π΅Ρ Π±ΡΠ» ΠΌΠ½ΠΎΠ³ΠΎΠΎΠ±ΡΠ°Π·Π½ΠΎ ΡΠ²Π΅ΡΡΡΠΈΠΉΡΡ, ΡΠΈΡΡΡΠΈΠΉ ΡΡΡΠ΅ ΡΠΎΠ»Π½ΡΠ°. Π Π½Π° Π³ΠΎΡΠ°Ρ ΡΠ΅Ρ ΡΠ»ΡΡΠ°Π»ΠΈ ΠΎΠ½ΠΈ ΠΏΠ΅Π½ΠΈΠ΅, Π»ΠΈΠΊΠΎΠ²Π°Π½ΡΡ ΠΈ Π²Π΅ΡΠ΅Π»ΡΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠ΅.Β»
ΠΠ°ΡΠΈΠ»ΠΈΠΉ, Π°ΡΡ ΠΈΠ΅ΠΏΠΈΡΠΊΠΎΠΏ ΠΠΎΠ²Π³ΠΎΡΠΎΠ΄ΡΠΊΠΈΠΉ.
ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΡ
ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ Threading. ΠΡΠΎ Π½Π°ΡΠΈΠ²Π½ΡΠ΅ Posix-ΡΡΠ΅Π΄Ρ, ΡΠ°ΠΊΠΈΠ΅ ΡΡΠ΅Π΄Ρ ΠΈΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ, Π° Π½Π΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½ΠΎΠΉ.
Π ΡΠ΅ΠΌ ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΡΡΠ΅Π΄ΠΎΠ² ΠΎΡ ΠΌΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΈΠ½Π³Π°?
ΠΠ»Π°Π²Π½ΠΎΠ΅ ΠΎΡΠ»ΠΈΡΠΈΠ΅ Π² ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΠ°ΠΌΡΡΠΈ. ΠΡΠΎΡΠ΅ΡΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡ Π΄ΡΡΠ³ ΠΎΡ Π΄ΡΡΠ³Π°, ΠΈΠΌΠ΅ΡΡ ΡΠ°Π·Π΄Π΅Π»ΡΠ½ΡΠ΅ Π°Π΄ΡΠ΅ΡΠ½ΡΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°, ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ, ΡΠ΅ΡΡΡΡΡ. Π’ΡΠ΅Π΄Ρ ΠΈΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π² ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠΌ Π°Π΄ΡΠ΅ΡΠ½ΠΎΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅, ΠΈΠΌΠ΅ΡΡ ΠΎΠ±ΡΠΈΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΏΠ°ΠΌΡΡΠΈ, ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ, Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΠΌ ΠΌΠΎΠ΄ΡΠ»ΡΠΌ.
ΠΠ°ΠΊΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ Ρ ΠΎΡΠΎΡΠΎ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΡΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠ»ΠΎΡ ΠΎ?
Π’Π΅ Π·Π°Π΄Π°ΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΡΠΎΠΆΠ΄Π°ΡΡ Π΄ΠΎΠ»Π³ΠΈΠΉ IO. ΠΠΎΠ³Π΄Π° ΡΡΠ΅Π΄ ΡΠΏΠΈΡΠ°Π΅ΡΡΡ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅ΡΠ° ΠΈΠ»ΠΈ Π΄ΠΈΡΠΊΠ°, ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ Π±ΡΠΎΡΠ°Π΅Ρ ΡΡΠΎΡ ΡΡΠ΅Π΄ ΠΈ ΡΡΠ°ΡΡΡΠ΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ. ΠΡΠΎ Π·Π½Π°ΡΠΈΡ, Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΡΠΎΡ ΠΈΠ·-Π·Π° ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ. ΠΠ°ΠΎΠ±ΠΎΡΠΎΡ, Π΅ΡΠ»ΠΈ Ρ ΠΎΠ΄ΠΈΡΡ Π² ΡΠ΅ΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΡΠ΅Π΄Π΅ (Π² ΡΠΈΠΊΠ»Π΅), ΡΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΆΠ΄Π°ΡΡ ΠΎΡΠ²Π΅ΡΠ°.
ΠΠ΄Π½Π°ΠΊΠΎ, Π΅ΡΠ»ΠΈ Π·Π°ΡΠ΅ΠΌ Π² ΡΡΠ΅Π΄Π΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΡΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ½ ΠΎΠ΄ΠΈΠ½. ΠΡΠΎ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ Π΄Π°ΡΡ ΠΏΡΠΈΡΠΎΡΡΠ° Π² ΡΠΊΠΎΡΠΎΡΡΠΈ, Π½ΠΎ ΠΈ Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠ·-Π·Π° ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π½Π° Π΄ΡΡΠ³ΠΈΠ΅ ΡΡΠ΅Π΄Ρ.
ΠΠΎΡΠΎΡΠΊΠΈΠΉ ΠΎΡΠ²Π΅Ρ: Ρ ΠΎΡΠΎΡΠΎ Π»ΠΎΠΆΠ°ΡΡΡ Π½Π° ΡΡΠ΅Π΄Ρ Π·Π°Π΄Π°ΡΠΈ ΠΏΠΎ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΡΠ΅ΡΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΡΠΊΠ°ΡΠ°ΡΡ ΡΡΠΎ ΡΡΠ»ΠΎΠ². ΠΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΠΉΡΠ΅ Π²Π½Π΅ ΡΡΠ΅Π΄ΠΎΠ².
ΠΡΠΆΠ½ΠΎ ΠΏΠΎΡΡΠΈΡΠ°ΡΡ 100 ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΉ. ΠΠ΅Π»Π°ΡΡ ΡΡΠΎ Π² ΡΡΠ΅Π΄Π°Ρ ΠΈΠ»ΠΈ Π½Π΅Ρ?
ΠΠ΅Ρ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π² ΡΡΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ Π½Π΅Ρ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°. ΠΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ ΡΠΎΠ»ΡΠΊΠΎ Π±ΡΠ΄Π΅Ρ ΡΡΠ°ΡΠΈΡΡ Π»ΠΈΡΠ½Π΅Π΅ Π²ΡΠ΅ΠΌΡ Π½Π° ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅Π΄ΠΎΠ². Π‘Π»ΠΎΠΆΠ½ΡΠ΅ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ Π»ΡΡΡΠ΅ Π²ΡΠ½ΠΎΡΠΈΡΡ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ, Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ Π΄Π»Ρ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ Π·Π°Π΄Π°Ρ Celery, Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡ ΠΊΠ°ΠΊ C-Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
ΠΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ heap dump ΠΈ thread dump.
ΠΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΠΈ, ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² Π΅ΠΉ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, Ρ ΡΡΠΈΠΌ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ (ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ, Π»ΠΎΠΊΠΈ, race condition ΠΈ Ρ.Π΄.);
-
ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΡ - Π²Π°ΡΠΈΠ°Π½Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΌ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ, ΠΏΡΠΈΡΡΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΡΠ΅Π²Π΄ΠΎΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ. Π ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ , Π³Π΄Π΅ ΡΠ΅ΡΠΌΠΈΠ½Ρ "ΠΏΠΎΡΠΎΠΊ" ΠΈ "ΠΏΡΠΎΡΠ΅ΡΡ" ΡΠ°Π·Π»ΠΈΡΠ°ΡΡΡΡ, ΠΏΠΎΠ΄ "ΠΏΠΎΡΠΎΠΊΠΎΠΌ" ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΡΠΎΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ (ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ ΠΆΠ΅ Π²Π»Π°Π΄Π΅Π΅Ρ ΡΡΡΠ½ΠΎΡΡΡ, Π½Π°Π·ΡΠ²Π°Π΅ΠΌΠ°Ρ "ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ"). ΠΠ±ΡΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ°ΡΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈΠ²Π°Π½ΠΈΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΡΡΠΈΡΠ»ΠΈΡΠ΅Π»Π΅ΠΉ (ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠ² ΠΈ ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°).
-
ΠΠ½ΠΎΠ³ΠΎΠΏΡΠΎΡΠ΅ΡΡΠ½ΠΎΡΡΡ - Π²Π°ΡΠΈΠ°Π½Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ, ΠΊΠΎΠ³Π΄Π° Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ². Π ΡΠΈΡΡΠ΅ΠΌΠ°Ρ , Π³Π΄Π΅ ΠΏΠΎΠ΄ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΡΡΡ ΡΡΡΠ½ΠΎΡΡΡ, Π²Π»Π°Π΄Π΅ΡΡΠ°Ρ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ (ΠΏΠ°ΠΌΡΡΡΡ, ΠΎΡΠΊΡΡΡΡΠΌΠΈ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ, ΡΠ΅ΡΠ΅Π²ΡΠΌΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡΠΌΠΈ), Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ Ρ ΡΠ΅Π»ΡΡ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π° ΡΠ°ΠΊΠΆΠ΅ Ρ ΡΠ΅Π»ΡΡ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ. Π’.ΠΊ. ΠΠ‘ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ ΠΏΡΠΎΡΠΈΡ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ (Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ ΠΏΠΎΡΠΎΠΊΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² Π΅Π΄ΠΈΠ½ΠΎΠΌ Π°Π΄ΡΠ΅ΡΠ½ΠΎΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅), ΡΠΎ Π°) Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ ΡΠΏΠ°Π²ΡΠΈΠΉ (ΡΠΈΡΠ°ΠΉ - ΡΠ±ΠΈΡΡΠΉ ΠΠ‘) ΠΏΡΠΎΡΠ΅ΡΡ Π½Π΅ ΡΡΠΎΠ½ΠΈΡ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅; Π±) Π΅ΡΠ»ΠΈ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Π½Π°ΡΠ°Π» Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΡΠΆΠ΅ΡΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ·-Π·Π° RCE ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ), ΡΠΎ ΠΎΠ½ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠΌΡ ΠΏΠ°ΠΌΡΡΠΈ Π² Π΄ΡΡΠ³ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°Ρ . ΠΠ½ΠΎΠ³ΠΎΠΏΡΠΎΡΠ΅ΡΡΠ½ΠΎΡΡΡ ΡΠ΅Π³ΠΎΠ΄Π½Ρ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ°Ρ , ΠΊΠΎΠ³Π΄Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π² ΡΠ°Π·Π½ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°Ρ , ΠΈ ΡΠΏΠ°Π²ΡΠ°Ρ Π²ΠΊΠ»Π°Π΄ΠΊΠ° (ΠΈΠ·-Π·Π° js ΠΈΠ»ΠΈ ΠΈΠ·-Π·Π° ΠΊΡΠΈΠ²ΠΎΠ³ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½Π°) ΡΡΠ½Π΅Ρ Π·Π° ΡΠΎΠ±ΠΎΠΉ Π½Π΅ Π²Π΅ΡΡ Π±ΡΠ°ΡΠ·Π΅Ρ, Π° ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅Π±Ρ ΠΈΠ»ΠΈ Π΅ΡΠ΅ ΠΏΠ°ΡΡ Π²ΠΊΠ»Π°Π΄ΠΎΠΊ.
# ΠΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
import time
COUNT = 100_000_000
def countdown(n):
while n > 0:
n -= 1
start = time.time()
countdown(COUNT)
end = time.time()
print("Count time", end - start)
Count time 3.81453800201416
# ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π±ΡΠ΄Π΅Ρ Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ Ρ ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ, Ρ. ΠΊ. Π΄ΠΎΠ±Π°Π²ΡΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π·Π°ΡΡΠ°ΡΡ Π½Π° ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠ²
import time
from threading import Thread
COUNT = 100_000_000
def countdown(n):
while n > 0:
n -= 1
t1 = Thread(target=countdown, args=(COUNT//2,))
t2 = Thread(target=countdown, args=(COUNT//2,))
start = time.time()
t1.start()
t2.start()
t1.join()
t2.join()
end = time.time()
print("Count time", end - start)
Count time 3.8378489017486572
# ΠΠ½ΠΎΠ³ΠΎΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
import time
import multiprocessing as mp
COUNT = 100_000_000
def countdown(n):
while n > 0:
n -= 1
if __name__ == '__main__':
pool = mp.Pool()
start = time.time()
pool.apply_async(countdown, args=(COUNT // 2,))
pool.apply_async(countdown, args=(COUNT // 2,))
pool.close()
pool.join()
end = time.time()
print("Count time", end - start)
Count time 2.0029137134552
Threading
CPython interpreter can only run a single thread at a time. That is why using multiple threads won't result in a faster execution, unless at least one of the threads contains an I/O operation.
from threading import Thread, RLock, Semaphore, Event, Barrier
from concurrent.futures import ThreadPoolExecutor
Thread
<Thread> = Thread(target=<function>) # Use `args=<collection>` to set the arguments.
<Thread>.start() # Starts the thread.
<bool> = <Thread>.is_alive() # Checks if the thread has finished executing.
<Thread>.join() # Waits for the thread to finish.
Use 'kwargs=<dict>'
to pass keyword arguments to the function.
Use 'daemon=True'
, or the program will not be able to exit while the thread is alive.**
Lock
<lock> = RLock() # Lock that can only be released by the owner.
<lock>.acquire() # Waits for the lock to be available.
<lock>.release() # Makes the lock available again.
Or:
with <lock>: # Enters the block by calling acquire(),
... # and exits it with release().
Semaphore, Event, Barrier
<Semaphore> = Semaphore(value=1) # Lock that can be acquired by 'value' threads.
<Event> = Event() # Method wait() blocks until set() is called.
<Barrier> = Barrier(n_times) # Wait() blocks until it's called n_times.
Thread Pool Executor
Object that manages thread execution. An object with the same interface called ProcessPoolExecutor provides true parallelism by running a separate interpreter in each process. All arguments must be pickable.
<Exec> = ThreadPoolExecutor(max_workers=None) # Or: `with ThreadPoolExecutor() as <name>: β¦`
<Exec>.shutdown(wait=True) # Blocks until all threads finish executing.
<iter> = <Exec>.map(<func>, <args_1>, ...) # A multithreaded and non-lazy map().
<Futr> = <Exec>.submit(<func>, <arg_1>, ...) # Starts a thread and returns its Future object.
<bool> = <Futr>.done() # Checks if the thread has finished executing.
<obj> = <Futr>.result() # Waits for thread to finish and returns result.
asyncio
https://realpython.com/async-io-python/
Π JavaScript async / await ΡΠ΄Π΅Π»Π°Π½Ρ ΠΆΠ°Π΄Π½ΡΠΌΠΈ ΠΊΠ°ΠΊ Promise. ΠΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ async ΡΡΠ½ΠΊΡΠΈΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π·Π°Π΄Π°ΡΠ° ΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π½Π° ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² event loop. await, Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΠΏΡΠΎΡΡΠΎ ΠΆΠ΄ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ.
Π ΠΏΠΈΡΠΎΠ½Π΅ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½ΡΠΈΠ½Ρ Π·Π°Π΄ΠΈΠ·Π°ΠΉΠ½ΠΈΠ»ΠΈ ΠΈΠ½Π°ΡΠ΅ - Π»Π΅Π½ΠΈΠ²ΠΎ.
ΠΡΠ·ΠΎΠ² async ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ β ΠΊΠΎΡΡΡΠΈΠ½Ρ, β ΠΊΠΎΡΠΎΡΠ°Ρ Π½ΠΈ ΡΠ΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ.
asyncio.run() ΡΠΎΠ·Π΄Π°ΡΡ event loop, Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ (ΠΊΠΎΡΠ½Π΅Π²ΡΡ) ΠΊΠΎΡΡΡΠΈΠ½Ρ ΠΈ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊ Π΄ΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°.
await Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΠΊΠΎΡΡΡΠΈΠ½Ρ ΠΈΠ·Π½ΡΡΡΠΈ Π΄ΡΡΠ³ΠΎΠΉ ΠΊΠΎΡΡΡΠΈΠ½Ρ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ event loop ΠΈ ΠΆΠ΄ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ.
ΠΠ»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΊΠΎΡΡΡΠΈΠ½Ρ Π±Π΅Π· ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ (ΠΊΠ°ΠΊ ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ Promise) ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ asyncio.create_task(coro). ΠΠΈΠ±ΠΎ asyncio.gather(*aws), Π΅ΡΠ»ΠΈ Π½Π°Π΄ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΡΠ°Π·Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ. ΠΡΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ»Π΅Π΄ΠΈΡΡ, ΡΡΠΎΠ±Ρ ΡΡΡΠ»ΠΊΠ° Π½Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΡ ΡΠ°Π½ΡΠ»Π°ΡΡ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ, ΠΈΠ½Π°ΡΠ΅ Π΅Π³ΠΎ ΠΏΠΎΠΆΡΠ΅Ρ GC ΠΈ Π²ΡΠ΅ ΠΎΠ±ΠΎΡΠ²Π΅ΡΡΡ Π½Π° ΡΠ°ΠΌΠΎΠΌ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ (ΠΏΡΠΎΠΌΠΈΡ Π±Ρ ΠΎΡΡΠ°Π±ΠΎΡΠ°Π» Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° Π½Π΅ ΡΠΌΠΎΡΡΡ Π½ΠΈ Π½Π° ΡΡΠΎ).
Π JS ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ event loop, ΠΏΠΎΡΡΠΎΠΌΡ Π±ΡΠ»ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ ΡΠ°Π·ΡΠΌΠ½ΠΎ Π·Π°ΠΊΠΎΠΏΠ°ΡΡ Π΅Π³ΠΎ Π²Π½ΡΡΡΡ promise / async / await ΠΊΠ°ΠΊ Π΄Π΅ΡΠ°Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΡΠΏΡΠΎΡΡΠΈΠ² ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΌΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ. Π ΠΏΠΈΡΠΎΠ½Π΅ ΠΎΡΠ·Π΅ΡΠΊΠ°Π»ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠ°Π½Π½ΠΈΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΠΊΠΎΡΡΡΠΈΠ½ Π½Π° Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ°Ρ , Π΄Π°Π»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°Π·Π½ΡΠ΅ event loop ΠΈ Π²ΡΡΡΠ°Π²ΠΈΠ»ΠΈ Π²ΡΠ΅ ΠΊΠΈΡΠΊΠΈ Π½Π°ΡΡΠΆΡ.
ΠΡΠΎΡΡΠ΅ΠΉΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ Π·Π°ΠΏΡΡΠΊ Π΄Π²ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΡΡ Π² "ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠΌ" ΠΌΠΈΡΠ΅ Π·Π°Π½ΡΠ»ΠΎ Π±Ρ 2 ΡΠ΅ΠΊΡΠ½Π΄Ρ, Π½ΠΎ Π² "Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠΌ" ΠΌΠΈΡΠ΅ ΠΎΠ½ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π·Π° 1 ΡΠ΅ΠΊΡΠ½Π΄Ρ.
ΠΠ΅Π· asyncio, ΠΏΡΠΎΡΡΠΎ Π΄Π²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ ΠΈΠΌΠΈΡΠ°ΡΠΈΠ΅ΠΉ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ:
import time
from time import perf_counter
def fun1():
sumi: int = 0
for i in range(1000_000):
sumi += i
time.sleep(1)
print(f'Sum: {sumi}')
def fun2():
producti: int = 1
for i in range(1, 25):
producti = i * producti
time.sleep(1)
print(f'Product: {producti}')
start_time = perf_counter()
fun1()
fun2()
duration = perf_counter() - start_time
print(f'Total duration: {duration} seconds')
Sum: 499999500000
Product: 620448401733239439360000
Total duration: 2.047113300068304 seconds
Π‘ asyncio (ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π²ΡΠ·ΠΎΠ²Π° amain() ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Π² ΡΠ²ΡΠ·ΠΈ Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΠΌΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ asyncio Π² Jupiter Notebook):
import asyncio
from time import perf_counter
async def afun1():
sumi: int = 0
for i in range(1000_000):
sumi += i
await asyncio.sleep(1)
print(f'Sum: {sumi}')
async def afun2():
producti: int = 1
for i in range(1, 25):
producti = i * producti
await asyncio.sleep(1)
print(f'Product: {producti}')
async def amain():
task1 = asyncio.create_task(afun1())
task2 = asyncio.create_task(afun2())
await task1
await task2
start_time = perf_counter()
# asyncio.run(amain())
await amain()
duration = perf_counter() - start_time
print(f'Total duration: {duration} seconds')
Sum: 499999500000
Product: 620448401733239439360000
Total duration: 1.0792618000414222 seconds
ΠΡΠΈΠΌΠ΅Ρ Π·Π°ΠΏΡΡΠΊΠ° Π½Π° ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Π²ΡΡ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΡ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈΡ Π·Π°Π΄Π°Ρ:
import asyncio
from datetime import datetime
async def periodic_fun1(a, b):
while True:
await asyncio.sleep(1)
print(f'periodic_fun1 complete with result {a + b}')
async def periodic_fun2(a, b):
while True:
await asyncio.sleep(0.5)
print(f'periodic_fun2 complete with result {a - b}')
async def main():
start_time = datetime.now()
task1 = asyncio.create_task(periodic_fun1(3, 2))
task2 = asyncio.create_task(periodic_fun2(3, 2))
await asyncio.sleep(10)
task1.cancel()
task2.cancel()
duration_time = datetime.now() - start_time
print(f'Total duration time: {duration_time}')
if __name__ == '__main__':
# asyncio.run(main())
await amain() # https://stackoverflow.com/questions/55409641/asyncio-run-cannot-be-called-from-a-running-event-loop-when-using-jupyter-no
Sum: 499999500000
Product: 620448401733239439360000
ΠΡΠΈΠΌΠ΅Ρ Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΎΡ Π΄Π²ΡΡ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΡ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈΡ Π·Π°Π΄Π°Ρ Π² ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΡΡΡΡΠΊΡΡΡΠ΅ Π΄Π°Π½Π½ΡΡ asyncio.Queue():
import asyncio
import random
from datetime import datetime
# ΠΡΠΈΠΌΠ΅Ρ Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ
ΠΎΡ Π΄Π²ΡΡ
Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΡ
ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈΡ
Π·Π°Π΄Π°Ρ Π² ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΡΡΡΡΠΊΡΡΡΠ΅ Π΄Π°Π½Π½ΡΡ
asyncio.Queue().
async def produce_small_random(queue):
while True:
await asyncio.sleep(0.5)
r: int = random.randint(1, 9)
print(f'Small random produced {r}')
await queue.put(r)
async def produce_big_random(queue):
while True:
await asyncio.sleep(1)
r: int = random.randint(100, 999)
print(f'Big random produced {r}')
await queue.put(r)
async def main():
q = asyncio.Queue()
start_time = datetime.now()
small_random_task = asyncio.create_task(produce_small_random(q))
big_random_task = asyncio.create_task(produce_big_random(q))
await asyncio.sleep(10)
small_random_task.cancel()
big_random_task.cancel()
# Dumping asyncio.queue into list
randl: list[int] = []
while q.qsize() > 0:
randl.append(await q.get())
q.task_done()
duration_time = datetime.now() - start_time
print(f'Total queue = {randl}')
print(f'Total duration time: {duration_time}')
if __name__ == '__main__':
# asyncio.run(main())
await main() # https://stackoverflow.com/questions/55409641/asyncio-run-cannot-be-called-from-a-running-event-loop-when-using-jupyter-no
Small random produced 1
Big random produced 929
Small random produced 4
Small random produced 3
Big random produced 967
Small random produced 8
Small random produced 1
Big random produced 622
Small random produced 9
Small random produced 7
Big random produced 891
Small random produced 5
Small random produced 5
Big random produced 820
Small random produced 8
Small random produced 5
Big random produced 771
Small random produced 5
Small random produced 6
Big random produced 289
Small random produced 6
Small random produced 8
Big random produced 873
Small random produced 8
Small random produced 3
Big random produced 127
Small random produced 6
Small random produced 3
Total queue = [1, 929, 4, 3, 967, 8, 1, 622, 9, 7, 891, 5, 5, 820, 8, 5, 771, 5, 6, 289, 6, 8, 873, 8, 3, 127, 6, 3]
Total duration time: 0:00:10.001941
7. ΠΠΎΠΏΡΠ»ΡΡΠ½ΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ
Β«ΠΡΠ°ΡΠΎΡΠ° ΠΈ Π±Π»Π°Π³ΠΎΠ»Π΅ΠΏΠΈΠ΅ ΡΡΠΎΠ³ΠΎ Π³ΠΎΡΠΎΠ΄Π° ΡΠ°ΠΊΠΎΠ²Ρ, ΠΊΠ°ΠΊΠΎΠ²ΡΡ Π³Π»Π°Π· ΡΠ΅Π»ΠΎΠ²Π΅ΡΠ΅ΡΠΊΠΈΠΉ Π½Π΅ Π²ΠΈΠ΄Π΅Π», ΠΈ ΡΡ ΠΎ Π½Π΅ ΡΠ»ΡΡΠ°Π»ΠΎ, ΠΈ ΠΌΡΡΠ»Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ, ΠΈ ΡΠΌ Π½Π΅ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΏΠΎΡΡΠΈΠ³Π½ΡΡΡ β Π½ΠΈ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠ΅ΡΠΊΠΈΠΉ, Π½ΠΈ Π°Π½Π³Π΅Π»ΡΡΠΊΠΈΠΉ.Β»
ΠΠ½ΠΎΠΊ ΠΡΠΈΠ³ΠΎΡΠΈΠΉ, Β«ΠΠΈΠ΄Π΅Π½ΠΈΠ΅ ΡΡΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΡΡΠ΄Π°Β».
ΠΠΎΠ³Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
import pathlib
import sys
import logging
from logging.handlers import RotatingFileHandler
from colorlog import ColoredFormatter
class TestLogger:
@staticmethod
def get_logger(path_to_log_file: str, max_file_size: int, max_file_count: int) -> logging.Logger:
logger = logging.getLogger("sample_logger")
logger.setLevel(logging.DEBUG)
# Π€ΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈ Π²ΡΠ²ΠΎΠ΄Π΅ Π² ΡΠ°ΠΉΠ»
flog_formatter = logging.Formatter("%(asctime)s.%(msecs)03d %(filename)-24s %(levelname)-8s %(message)s",
datefmt="%a, %d %b %Y %H:%M:%S")
file_handler = RotatingFileHandler(filename=path_to_log_file, mode="a", maxBytes=max_file_size,
backupCount=max_file_count, encoding="utf-8", delay=False)
file_handler.setFormatter(flog_formatter)
logger.addHandler(file_handler)
# Π€ΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈ Π²ΡΠ²ΠΎΠ΄Π΅ Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ
clog_formatter = ColoredFormatter("%(asctime)s.%(msecs)03d %(filename)-24s :%(lineno)4d "
"%(log_color)s%(levelname)-8s %(message)s%(reset)s",
datefmt="%a, %d %b %Y %H:%M:%S")
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setFormatter(clog_formatter)
logger.addHandler(console_handler)
return logger
log_file_max_size: int = 25 * 1024 ** 2 # ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π»ΠΎΠ³ΠΎΠ²
log_file_max_count: int = 10 # ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ² Π»ΠΎΠ³ΠΎΠ²
log_file_path: str = "logs/sample_logger.log"
try:
path = pathlib.Path(log_file_path) # Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΡΡΡ ΠΊ ΡΠ°ΠΉΠ»Ρ Π»ΠΎΠ³ΠΎΠ², Π΅ΡΠ»ΠΈ ΠΎΠ½ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ
path.parent.mkdir(parents=True, exist_ok=True)
logger = TestLogger.get_logger(log_file_path, log_file_max_size, log_file_max_count)
except Exception as err:
print(f"ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»Π° Π»ΠΎΠ³Π°: {str(err)}")
sys.exit() # ΠΠ²Π°ΡΠΈΠΉΠ½ΡΠΉ Π²ΡΡ
ΠΎΠ΄
logger.debug("Debug message")
logger.info("Hello, world!")
logger.error("Error!")
Thu, 15 Sep 2022 17:37:36.754 1628851721.py : 44 οΏ½[37mDEBUG Debug messageοΏ½[0m
Thu, 15 Sep 2022 17:37:36.755 1628851721.py : 45 οΏ½[32mINFO Hello, world!οΏ½[0m
Thu, 15 Sep 2022 17:37:36.756 1628851721.py : 46 οΏ½[31mERROR Error!οΏ½[0m
ΠΡΠΎΡΠΈΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
Stopwatch
from time import time
start_time = time()
j: int = 0
for i in range(10_000_000): # Long operation
j = i ** 2
duration = time() - start_time
print(f"{duration} seconds")
2.2923033237457275 seconds
High performance
from time import perf_counter
start_time = perf_counter()
j: int = 0
for i in range(10_000_000): # Long operation
j = i ** 2
duration = perf_counter() - start_time
print(f"{duration} seconds")
2.2668115999549627 seconds
timeit
Try to avoid a number of common traps for measuring execution times
from timeit import timeit
def long_pow():
j: int = 0
for i in range(1_000_000): # Long operation
j = i ** 2
timeit("long_pow()", number=10, globals=globals(), setup='pass')
1.8498943001031876
Call Graph
Π‘ΠΎΠ·Π΄Π°Π΅Ρ PNG ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π³ΡΠ°ΡΠ° Π²ΡΠ·ΠΎΠ²ΠΎΠ² Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠ΅Π½Π½ΡΠΌΠΈ ΡΠ·ΠΊΠΈΠΌΠΈ ΠΌΠ΅ΡΡΠ°ΠΌΠΈ
from pycallgraph3 import PyCallGraph
from pycallgraph3.output import GraphvizOutput
def long_pow():
j: int = 0
for i in range(1000_000): # Long operation
j = i ** 2
def short_pow():
j: int = 0
for i in range(1000): # Short operation
j = i ** 2
with PyCallGraph(output=GraphvizOutput()):
# Code to be profiled
long_pow()
short_pow()
# This will generate a file called pycallgraph3.png
Random
import random
rf: float = random.random() # A float inside [0, 1)
print(f"Single float random: {rf}")
ri: int = random.randint(1, 10) # An int inside [from, to]
print(f"Single int random: {ri}")
rb = random.randbytes(10)
print(f"Random bytes: {rb}")
rc: str = random.choice(["Alice", "Bob", "Maggie", "Madhuri Dixit"])
print(f"Random choice: {rc}")
rs: str = random.sample([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 5)
print(f"Random list without duplicates: {rs}")
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(f"List before shuffle: {a}")
random.shuffle(a)
print(f"List after shuffle: {a}")
Single float random: 0.9024807633898538
Single int random: 7
Random bytes: b'>\xe0^\x16PX\xf8E\xf8\x98'
Random choice: Bob
Random list without duplicates: [5, 10, 3, 6, 1]
List before shuffle: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
List after shuffle: [10, 4, 6, 5, 1, 8, 3, 9, 7, 2]
Input
Reads a line from user input or pipe if present.
= input(prompt=None)
Trailing newline gets stripped. Prompt string is printed to the standard output before reading input. Raises EOFError when user hits EOF (ctrl-d/ctrl-zβ) or input stream gets exhausted.
Command Line Arguments
import sys
scripts_path = sys.argv[0]
arguments = sys.argv[1:]
Argument Parser
from argparse import ArgumentParser, FileType
p = ArgumentParser(description=<str>)
p.add_argument('-<short_name>', '--<name>', action='store_true') # Flag.
p.add_argument('-<short_name>', '--<name>', type=<type>) # Option.
p.add_argument('<name>', type=<type>, nargs=1) # First argument.
p.add_argument('<name>', type=<type>, nargs='+') # Remaining arguments.
p.add_argument('<name>', type=<type>, nargs='*') # Optional arguments.
args = p.parse_args() # Exits on error.
value = args.<name>
Use `'help=<str>'` to set argument description.
Use `'default=<el>'` to set the default value.
Use `'type=FileType(<mode>)'` for files.
print(<el_1>, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Use `'file=sys.stderr'` for messages about errors.
Use `'flush=True'` to forcibly flush the stream.
Pretty Print
from pprint import pprint
pprint(<collection>, width=80, depth=None, compact=False, sort_dicts=True)
Levels deeper than 'depth' get replaced by '...'.
Π¨ΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π΄Π΅ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅
# pip install pycryptodomex
import hashlib
from Cryptodome import Random
from Cryptodome.Cipher import AES
from Cryptodome.Util.Padding import pad
from Cryptodome.Util.Padding import unpad
def encrypt_data(password: str, raw_data: bytes) -> bytes:
res = bytes()
try:
key = hashlib.sha256(password.encode()).digest()
align_raw = pad(raw_data, AES.block_size)
iv = Random.new().read(AES.block_size)
cipher = AES.new(key, AES.MODE_CBC, iv)
ciphered_data = cipher.encrypt(align_raw)
res = iv + ciphered_data
except Exception as e:
print(f"Encrypt error: {str(e)}")
return res
def decrypt_data(password: str, encrypted_data: bytes) -> bytes:
res = bytes()
try:
key = hashlib.sha256(password.encode()).digest()
iv = encrypted_data[:AES.block_size]
ciphered_data = encrypted_data[AES.block_size:]
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypt_data = cipher.decrypt(ciphered_data)
res = unpad(decrypt_data, AES.block_size)
except Exception as e:
print(f"Decrypt error: {str(e)}")
return res
def encrypt_file(src_file: str, dst_file: str, password: str) -> bool:
try:
with open(src_file, "rb") as reader, open(dst_file, "wb") as writer:
data = reader.read()
data_enc = encrypt_data(password, data)
writer.write(data_enc)
writer.flush()
print(f"{src_file} encrypted into {dst_file}")
return True
except Exception as e:
print(f"Encrypt_file error: {str(e)}")
return False
def decrypt_file(src_file: str, dst_file: str, password: str) -> bool:
try:
with open(src_file, "rb") as reader, open(dst_file, "wb") as writer:
data = reader.read()
data_decrypt = decrypt_data(password, data)
writer.write(data_decrypt)
writer.flush()
print(f"{src_file} decrypted into {dst_file}")
return True
except Exception as e:
print(f"Decrypt file error: {str(e)}")
return False
if __name__ == '__main__':
mes: bytes = bytes("A am the Message", "utf-8")
passw: str = "h3AC3TsU8TECvyCqd5Q5WUag5uXLjct2"
print(f"Original message: {mes}")
# Encrypt message
enc: bytes = encrypt_data(passw, mes)
print(f"Encrypted message: {enc}")
# Decrypt message
dec: bytes = decrypt_data(passw, enc)
print(f"Decrypted message: {dec}")
Original message: b'A am the Message'
Encrypted message: b' E\x92\xbeH\x87\xdde\t\xd3\x9ap\x0cO\xc3\xf8\x84\xc7~\x1c\x90\xcd\x9a\xd3\x1bNd\xccDt\x1b\xfcZ\x91\xb5\xd78\x85\x91R\x1e]3\x9c\xec\xcbC\xd8'
Decrypted message: b'A am the Message'
Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, pytest
ΠΠ»Ρ ΡΠ°Π±ΠΎΡΡ Ρ pytest Π²Π½ΡΡΡΠΈ Jupiter notebook Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ ipytest
# pip install -U ipytest
import ipytest
ipytest.autoconfig()
%%ipytest
import ipytest
def test_my_func():
assert my_func(0) == 0
assert my_func(1) == 0
assert my_func(2) == 2
assert my_func(3) == 2
def my_func(x):
return x // 2 * 2
οΏ½[32m.οΏ½[0mοΏ½[32m [100%]οΏ½[0m
οΏ½[32mοΏ½[32mοΏ½[1m1 passedοΏ½[0mοΏ½[32m in 0.01sοΏ½[0mοΏ½[0m
%%ipytest
import pytest
@pytest.mark.parametrize('input,expected', [
(0, 0),
(1, 0),
(2, 2),
(3, 2),
])
def test_parametrized(input, expected):
assert my_func(input) == expected
@pytest.fixture
def my_fixture():
return 42
def test_fixture(my_fixture):
assert my_fixture == 42
οΏ½[32m.οΏ½[0mοΏ½[32m.οΏ½[0mοΏ½[32m.οΏ½[0mοΏ½[32m.οΏ½[0mοΏ½[32m.οΏ½[0mοΏ½[32m [100%]οΏ½[0m
οΏ½[32mοΏ½[32mοΏ½[1m5 passedοΏ½[0mοΏ½[32m in 0.01sοΏ½[0mοΏ½[0m
ΠΠΎΠΊΠΈ, ΡΡΠ°Π±Ρ
Π’Π΅ΡΡΠΎΠ²ΡΠΉ Π΄Π²ΠΎΠΉΠ½ΠΈΠΊ - ΡΠ΅ΡΠΌΠΈΠ½, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠΈΠΉ Π²ΡΠ΅ Π²ΠΈΠ΄Ρ ΡΠ°Π»ΡΡΠΈΠ²ΡΡ
(fake) Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, Π½Π΅ΠΏΡΠΈΠ³ΠΎΠ΄Π½ΡΡ
ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΠΏΡΠΎΠ΄ΡΠΊΡΠ΅ (non-production-ready). Π’Π°ΠΊΠ°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΈ Π²Π΅Π΄Π΅Ρ ΡΠ΅Π±Ρ ΠΊΠ°ΠΊ Π΅Π΅ Π°Π½Π°Π»ΠΎΠ³, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΠΉ Π΄Π»Ρ production, Π½ΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΏΡΠΎΡΠ΅Π½Π½ΠΎΠΉ Π²Π΅ΡΡΠΈΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ½ΠΈΠΆΠ°Π΅Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ ΠΈ ΠΎΠ±Π»Π΅Π³ΡΠ°Π΅Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅. ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π±ΡΠ²Π°ΡΡ ΠΏΡΡΠΈ ΡΠΈΠΏΠΎΠ², Π½ΠΎ Π΄Π»Ρ ΠΏΡΠΎΡΡΠΎΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡΡΡ Π΄Π²ΡΠΌΡ: ΠΌΠΎΠΊΠΈ (mock) ΠΈ ΡΡΠ°Π±Ρ (stub).
ΠΠΎΠΊΠΈ ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ ΠΈΠΌΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈ ΠΈΠ·ΡΡΠ°ΡΡ ΠΈΡΡ
ΠΎΠ΄ΡΡΠΈΠ΅ (outcoming) Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ. Π’ΠΎ Π΅ΡΡΡ Π²ΡΠ·ΠΎΠ²Ρ, ΡΠΎΠ²Π΅ΡΡΠ°Π΅ΠΌΡΠ΅ ΡΠ΅ΡΡΠΈΡΡΠ΅ΠΌΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ (SUT) ΠΊ Π΅Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌ Π΄Π»Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΈΡ
ΡΠΎΡΡΠΎΡΠ½ΠΈΡ.
Π‘ΡΠ°Π±Ρ ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ ΠΈΠΌΠΈΡΠΈΡΠΎΠ²Π°ΡΡ Π²Ρ
ΠΎΠ΄ΡΡΠΈΠ΅ (incoming) Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ. Π’ΠΎ Π΅ΡΡΡ Π²ΡΠ·ΠΎΠ²Ρ, ΡΠΎΠ²Π΅ΡΡΠ°Π΅ΠΌΡΠ΅ SUT ΠΊ Π΅Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π²Ρ
ΠΎΠ΄Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
.
ΠΠΎΠ½ΡΡΠΈΠ΅ ΠΌΠΎΠΊΠΎΠ² ΠΈ ΡΡΠ°Π±ΠΎΠ² ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΎΠΌ command-query separation (CQS). ΠΡΠΈΠ½ΡΠΈΠΏ CQS Π³Π»Π°ΡΠΈΡ, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π»ΠΈΠ±ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ, Π»ΠΈΠ±ΠΎ Π·Π°ΠΏΡΠΎΡΠΎΠΌ, Π½ΠΎ Π½Π΅ ΠΎΠ±ΠΎΠΈΠΌΠΈ.
ΠΠΎΠΌΠ°Π½Π΄Ρ - ΡΡΠΎ ΠΌΠ΅ΡΠΎΠ΄Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΏΠΎΠ±ΠΎΡΠ½ΡΠ΅ ΡΡΡΠ΅ΠΊΡΡ ΠΈ Π½Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΡΠΈΠΌΠ΅ΡΡ ΠΏΠΎΠ±ΠΎΡΠ½ΡΡ
ΡΡΡΠ΅ΠΊΡΠΎΠ² Π²ΠΊΠ»ΡΡΠ°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° Π² ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΈ Ρ. Π΄.
ΠΠ°ΠΏΡΠΎΡΡ, Π½Π°ΠΎΠ±ΠΎΡΠΎΡ, Π½Π΅ ΠΈΠΌΠ΅ΡΡ ΠΏΠΎΠ±ΠΎΡΠ½ΡΡ
ΡΡΡΠ΅ΠΊΡΠΎΠ² ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, Π·Π°Π΄Π°Π²Π°Ρ Π²ΠΎΠΏΡΠΎΡ, Π²Ρ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΌΠ΅Π½ΡΡΡ ΠΎΡΠ²Π΅Ρ. ΠΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ°ΠΊΠΎΠ΅ ΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅, ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π»Π΅Π³ΡΠ΅ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ. Π’Π΅ΡΡΠΎΠ²ΡΠ΅ Π΄Π²ΠΎΠΉΠ½ΠΈΠΊΠΈ, Π·Π°ΠΌΠ΅Π½ΡΡΡΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ ΠΌΠΎΠΊΠ°ΠΌΠΈ, ΠΈ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΡΠ΅ΡΡΠΎΠ²ΡΠ΅ Π΄Π²ΠΎΠΉΠ½ΠΈΠΊΠΈ, Π·Π°ΠΌΠ΅Π½ΡΡΡΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΡ, ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ ΡΡΠ°Π±Π°ΠΌΠΈ.
ΠΠ΅ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠΎ ΡΡΠ°Π±Π°ΠΌΠΈ
ΠΠ°ΠΊ ΡΠΆΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡ, ΡΡΠ°Π±Ρ ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΌΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ Π²Ρ ΠΎΠ΄ΡΡΠΈΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ, Π° Π½Π΅ ΠΈΠ·ΡΡΠ°ΡΡ ΠΈΡ . ΠΠ· ΡΡΠΎΠ³ΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ, ΡΡΠΎ Π²Ρ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΡΠΎ ΡΡΠ°Π±Π°ΠΌΠΈ. ΠΡΠ·ΠΎΠ² ΠΎΡ SUT ΠΊ ΡΡΠ°Π±Ρ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΡΡΡ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ΄Π°Π΅Ρ SUT. Π’Π°ΠΊΠΎΠΉ Π²ΡΠ·ΠΎΠ² - ΡΡΠΎ Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°; ΡΡΠΎ Π΄Π΅ΡΠ°Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΡΠΎ ΡΡΠ°Π±Π°ΠΌΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΠΌ Π°Π½ΡΠΈ-ΠΏΠ°ΡΡΠ΅ΡΠ½ΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Ρ ΡΡΠΏΠΊΠΈΠΌ ΡΠ΅ΡΡΠ°ΠΌ. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Ρ ΡΡΠΏΠΊΠΎΡΡΠΈ ΡΠ΅ΡΡΠΎΠ² - ΡΡΠΎ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΡΡΠΈ ΡΠ΅ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ (ΠΊΠΎΡΠΎΡΡΠΉ Π² ΠΈΠ΄Π΅Π°Π»Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠ° Π² ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠ½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ, Π° Π½Π΅ Π΄Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ°), Π° Π½Π΅ Π΄Π΅ΡΠ°Π»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
Π‘Π°ΠΌΠΎΠ΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎΡΡΡ ΡΠ΅ΡΡΠΎΠ²
Π ΡΠ΅ΡΡΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΎΡΠ½ΠΎΡΠΈΡΡΡΡ ΠΊΠ°ΠΊ ΠΊ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠΌΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ: ΠΏΡΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ ΠΎΠ΄Π½ΠΈΡ ΠΈ ΡΠ΅Ρ ΠΆΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ², ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΡΠΎΠ²Π½ΠΎ ΡΠΎΡ ΠΆΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ. Π’Π΅ΡΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠ°ΠΌΠΎΠ΄ΠΎΡΡΠ°ΡΠΎΡΠ½Ρ, Π½Π΅Π»ΡΠ·Ρ ΠΎΠ±ΡΡΠ»Π°Π²Π»ΠΈΠ²Π°ΡΡ Π²ΡΠ·ΠΎΠ² Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ΅ΡΡΠ° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΡΠΎ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠ°.
8. ΠΠ»Π³ΠΎΡΠΈΡΠΌΡ
Β«Π‘ΡΠΎΠ»Ρ ΡΠΈΠ»ΡΠ½ΡΠΌ Π±ΡΠ» Π°ΡΠΎΠΌΠ°Ρ ΡΠ²Π΅ΡΠΎΠ², ΡΡΠΎ ΠΎΠ½ Π΄ΠΎΠ½ΠΎΡΠΈΠ»ΡΡ ΠΎΡΡΡΠ΄Π° Π΄Π°ΠΆΠ΅ Π΄ΠΎ Π½Π°Ρ. ΠΠΈΡΠ΅Π»ΠΈ ΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ° Π±ΡΠ»ΠΈ ΠΎΠ±Π»Π°ΡΠ΅Π½Ρ Π² ΡΠ²Π΅ΡΡΡΠΈΠ΅ΡΡ Π°Π½Π³Π΅Π»ΡΡΠΊΠΈΠ΅ ΠΎΠ΄Π΅ΠΆΠ΄Ρ, ΠΈ ΠΎΠ΄Π΅ΠΆΠ΄Π° ΠΈΡ Π±ΡΠ»Π° ΠΏΠΎΠ΄ΠΎΠ±Π½Π° ΠΌΠ΅ΡΡΡ, Π³Π΄Π΅ ΠΏΡΠ΅Π±ΡΠ²Π°Π»ΠΈ ΠΎΠ½ΠΈΒ».
Β«ΠΡΠΊΡΠΎΠ²Π΅Π½ΠΈΠ΅ ΠΠ΅ΡΡΠ°Β».
FizzBuzz
ΠΠ°ΠΏΠΈΡΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π½Π° ΡΠΊΡΠ°Π½ ΡΠΈΡΠ»Π° ΠΎΡ 1 Π΄ΠΎ 100. ΠΠΌΠ΅ΡΡΠΎ ΡΠΈΡΠ΅Π», ΠΊΡΠ°ΡΠ½ΡΡ ΡΡΠ΅ΠΌ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΡΠ»ΠΎΠ²ΠΎ Β«FizzΒ», Π° Π²ΠΌΠ΅ΡΡΠΎ ΡΠΈΡΠ΅Π», ΠΊΡΠ°ΡΠ½ΡΡ ΠΏΡΡΠΈ β ΡΠ»ΠΎΠ²ΠΎ Β«BuzzΒ». ΠΡΠ»ΠΈ ΡΠΈΡΠ»ΠΎ ΠΊΡΠ°ΡΠ½ΠΎ ΠΈ 3, ΠΈ 5, ΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΡΠ»ΠΎΠ²ΠΎ Β«FizzBuzzΒ».
n: int = 100
for i in range(1, n + 1):
if i % 15 == 0:
item = "FizzBuzz"
elif i % 5 == 0:
item = "Buzz"
elif i % 3 == 0:
item = "Fizz"
else:
item = i
print(item, end=" ")
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz 41 Fizz 43 44 FizzBuzz 46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59 FizzBuzz 61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 FizzBuzz 76 77 Fizz 79 Buzz Fizz 82 83 Fizz Buzz 86 Fizz 88 89 FizzBuzz 91 92 Fizz 94 Buzz Fizz 97 98 Fizz Buzz
Π-ΠΎ-ΠΎ! ΠΠΎΠ»ΡΡΠΎΠ΅!
ΠΠΎΡΠ°ΡΠΈΡ O - Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° Π°ΡΠΈΠΌΠΏΡΠΎΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° Π±Π΅Π· ΡΡΠ΅ΡΠ° ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ.
n! >> 2^n >> n^3 >> n^2 >> nlogn >> n >> logn >> 1
ΠΡΠ·ΡΡΡΠΊΠΎΠ²Π°Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° (BubbleSort)
ΠΡΠΎΡΡΠ΅ΠΉΡΠΈΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ, ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠΈΡ ΡΡ ΠΏΡΠΎΡ ΠΎΠ΄ΠΎΠ² ΠΏΠΎ ΡΠΎΡΡΠΈΡΡΠ΅ΠΌΠΎΠΌΡ ΠΌΠ°ΡΡΠΈΠ²Ρ. Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡΠΎΡ ΠΎΠ΄Π° ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΌΠ°ΡΡΠΈΠ²Π° ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡΡΡ ΠΏΠΎΠΏΠ°ΡΠ½ΠΎ; ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ, Π½Π΅ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡΠΈΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ, ΠΌΠ΅Π½ΡΡΡΡΡ ΠΌΠ΅ΡΡΠ°ΠΌΠΈ.
def bubblesort(arr):
for i in range(len(arr)):
for j in range(len(arr) - 1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
arr: list = [28, 64, 2, 1, 13, 0]
print(bubblesort(arr))
[0, 1, 2, 13, 28, 64]
ΠΡΡΡΡΠ°Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° (QuickSort)
ΠΠ΄Π΅Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΡΠ»Π΅Π΄ΡΡΡΠ°Ρ:
- ΠΡΠ±ΠΈΡΠ°Π΅ΡΡΡ ΠΎΠΏΠΎΡΠ½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΡΡΠΎ Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π»ΡΠ±ΠΎΠΉ ΠΈΠ· ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΌΠ°ΡΡΠΈΠ²Π°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ· ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Ρ ΠΌΠ°ΡΡΠΈΠ²Π°.
- ΠΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΌΠ°ΡΡΠΈΠ²Π° ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡΡΡ Ρ ΠΎΠΏΠΎΡΠ½ΡΠΌ ΠΈ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π²Π»ΡΡΡΡΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΠΌΠ°ΡΡΠΈΠ², ΡΠΎΡΡΠΎΡΡΠΈΠΉ ΠΈΠ· Π΄Π²ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠ² - ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΌΠ΅Π½ΡΡΠΈΠ΅ ΠΎΠΏΠΎΡΠ½ΠΎΠ³ΠΎ, ΡΠ°Π²Π½ΡΠ΅ ΠΎΠΏΠΎΡΠ½ΠΎΠΌΡ + Π±ΠΎΠ»ΡΡΠΈΠ΅ ΠΎΠΏΠΎΡΠ½ΠΎΠ³ΠΎ.
- ΠΡΠ»ΠΈ Π΄Π»ΠΈΠ½Π° ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΎΠ² Π±ΠΎΠ»ΡΡΠ΅ 1, ΡΠΎ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΡ ΠΈ Π΄Π»Ρ Π½ΠΈΡ ΡΠΎΠΆΠ΅.
def quicksort(arr):
less = []
equal = []
greater = []
if len(arr) > 1:
pivot = arr[0]
for x in arr:
if x < pivot:
less.append(x)
elif x == pivot:
equal.append(x)
elif x > pivot:
greater.append(x)
return quicksort(less) + equal + quicksort(greater)
else:
return arr
arr: list = [28, 64, 2, 1, 13, 0]
print(quicksort(arr))
[0, 1, 2, 13, 28, 64]
Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΡΠ»ΠΈΡΠ½ΠΈΠ΅ΠΌ (MergeSort)
ΠΠ»ΡΡΠ΅Π²ΡΠΌ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠΌ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ»ΠΈΡΠ½ΠΈΠ΅ΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ (ΠΊΠ°ΠΊ Π½ΠΈ ΡΡΡΠ°Π½Π½ΠΎ :) ΡΠ»ΠΈΡΠ½ΠΈΠ΅ Π΄Π²ΡΡ
ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ². ΠΡΠΈ ΡΠ»ΠΈΡΠ½ΠΈΠΈ ΠΌΠ°ΡΡΠΈΠ²Ρ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡΡΡ ΠΏΠΎΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎ ΠΈ ΠΌΠ΅Π½ΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π² ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠΉ ΠΌΠ°ΡΡΠΈΠ²; ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π΄ΠΎΡΡΠΈΠ³Π½ΡΡ ΠΊΠΎΠ½Π΅Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ², Π² ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠΉ ΠΌΠ°ΡΡΠΈΠ² ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ "Ρ
Π²ΠΎΡΡ" ΠΎΡΡΠ°Π²ΡΠ΅Π³ΠΎΡΡ ΠΌΠ°ΡΡΠΈΠ²Π°.
Π‘ΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΡΠΎ ΡΠ»ΠΈΡΠ½ΠΈΠ΅ΠΌ Π΄Π²ΡΡ
ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎΠ΅ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π° Π½Π° ΡΠ΅Π³ΠΌΠ΅Π½ΡΡ ΠΌΠ΅Π½ΡΡΠ΅Π³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°.
def mergesort(arr):
if len(arr) < 2:
return arr
result, mid = [], int(len(arr)//2)
y = mergesort(arr[:mid])
z = mergesort(arr[mid:])
while (len(y) > 0) and (len(z) > 0):
if y[0] > z[0]:
result.append(z.pop(0))
else:
result.append(y.pop(0))
return result + y + z
arr: list = [28, 64, 2, 1, 13, 0]
print(mergesort(arr))
[0, 1, 2, 13, 28, 64]
ΠΠΈΡΠ°ΠΌΠΈΠ΄Π°Π»ΡΠ½Π°Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° (HeapSort)
ΠΡΠ΅Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΌΠ°ΡΡΠΈΠ² Π² Π΄Π²ΠΎΠΈΡΠ½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ Π·Π° Π(n) ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ.
Π Π°Π· Π·Π° ΡΠ°Π·ΠΎΠΌ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΡ Π΄Π΅ΡΠ΅Π²ΠΎ, ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ².
def heap_sort():
end = len(arr)
start = end // 2 - 1
for i in range(start, -1, -1):
heapify(end, i)
for i in range(end-1, 0, -1):
swap(i, 0)
heapify(i, 0)
def heapify(end,i):
l = 2 * i + 1
r = 2 * (i + 1)
max = i
if l < end and arr[i] < arr[l]:
max = l
if r < end and arr[max] < arr[r]:
max = r
if max != i:
swap(i, max)
heapify(end, max)
def swap(i, j):
arr[i], arr[j] = arr[j], arr[i]
arr: list = [28, 64, 2, 1, 13, 0]
heap_sort()
print(arr)
[0, 1, 2, 13, 28, 64]
Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° Π²ΡΡΠ°Π²ΠΊΠ°ΠΌΠΈ (InsertionSort)
ΠΠ°ΠΆΠ΄ΡΠΉ Π½ΠΎΠ²ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π·Π°Π½ΠΎΡΠΈΡΡΡ Π² Π²ΡΡ ΠΎΠ΄Π½ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ "ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡΠ°Π»ΡΠ½ΠΎ", Ρ. Π΅. ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· Π΄Π»Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠ΄Π²ΠΈΠ³Π°ΡΡ ΡΠ°ΡΡΡ ΠΌΠ°ΡΡΠΈΠ²Π°. ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠΉ, Π΄Π»Ρ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΡ Π²ΡΡΠ°Π²ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±ΠΈΠ½Π°ΡΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ.
def insertionsort(arr):
for index in range(1, len(arr)):
currentvalue = arr[index]
position = index
while position > 0 and arr[position - 1] > currentvalue:
arr[position] = arr[position - 1]
position = position - 1
arr[position] = currentvalue
arr: list = [28, 64, 2, 1, 13, 0]
insertionsort(arr)
print(arr)
[0, 1, 2, 13, 28, 64]
Timsort
ΠΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ, ΡΠΎΡΠ΅ΡΠ°ΡΡΠΈΠΉ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΡ Π²ΡΡΠ°Π²ΠΊΠ°ΠΌΠΈ, ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΡ ΡΠ»ΠΈΡΠ½ΠΈΠ΅ΠΌ ΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΡΠΎ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ ΠΌΠΈΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΡΠ°ΡΡΠΎ ΡΠΆΠ΅ ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Ρ (ΠΏΠΎΠΈΡΠΊ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Π½ΡΡ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ²). Π‘ΡΠ°Π½Π΄Π°ΡΡ Π΄Π»Ρ Python, Java, Swift.
Introsort
ΠΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π±ΡΡΡΡΡΡ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΡ, ΠΏΠ»ΡΡ, ΠΏΡΠΈ ΠΏΡΠ΅Π²ΡΡΠ΅Π½ΠΈΠΈ Π³Π»ΡΠ±ΠΈΠ½Ρ ΡΠ΅ΠΊΡΡΡΠΈΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π»ΠΎΠ³Π°ΡΠΈΡΠΌΠ° ΠΎΡ ΡΠΈΡΠ»Π° ΡΠΎΡΡΠΈΡΡΠ΅ΠΌΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²), ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π½Π° ΠΏΠΈΡΠ°ΠΌΠΈΠ΄Π°Π»ΡΠ½ΡΡ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΡ. Π‘ΡΠ°Π½Π΄Π°ΡΡ Π΄Π»Ρ .NET.
ΠΠΎΡΠ°Π·ΡΡΠ΄Π½Π°Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° (RadixSort)
Π‘ΠΎΡΡΠΈΡΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΡΠ½ΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π·Π±ΠΈΡΡ Π½Π° "ΡΠ°Π·ΡΡΠ΄Ρ", ΠΈΠΌΠ΅ΡΡΠΈΠ΅ ΡΠ°Π·Π½ΡΠΉ Π²Π΅Ρ. ΠΡΠΎ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅Π»ΡΠ΅ ΡΠΈΡΠ»Π° ΠΈΠ»ΠΈ ΡΡΡΠΎΠΊΠΈ. Π‘ΠΎΠΎΡΠ²Π΅ΡΡΠ²Π΅Π½Π½ΠΎ, ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠΎΡΡΠΈΡΡΡΡΡΡ ΠΏΠΎΡΠ°Π·ΡΡΠ΄Π½ΠΎ, Π½Π°ΡΠΈΠ½Π°Ρ Ρ ΡΠ°Π·ΡΡΠ΄Π°, ΠΈΠΌΠ΅ΡΡΠ΅Π³ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ Π²Π΅Ρ.
def radixsort(arr: list):
n = len(str(max(arr)))
for k in range(n):
bucket_list=[[] for i in range(10)]
for i in arr:
bucket_list[i // (10**k) % 10].append(i)
arr = sum(bucket_list, []) # Flattening a list of lists to a list
return arr
arr: list = [28, 64, 2, 1, 13, 0]
print(radixsort(arr))
[0, 1, 2, 13, 28, 64]
Π’Π°Π±Π»ΠΈΡΠ° ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ
Β Β
<style> table th:first-of-type { width: 35%; } table th:nth-of-type(2) { width: 35%; } table th:nth-of-type(3) { width: 5%; } table th:nth-of-type(4) { width: 5%; } table th:nth-of-type(5) { width: 5%; } table th:nth-of-type(6) { width: 5%; } table th:nth-of-type(7) { width: 5%; } table th:nth-of-type(8) { width: 5%; } </style>Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° | ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ | Best | Avg | Worst | Mem | Stable | Paral |
---|---|---|---|---|---|---|---|
ΠΡΠ·ΡΡΡΠΊΠΎΠ²Π°Ρ (Bubble) |
ΠΡΠΎΡΡΠ΅ΠΉΡΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ | n | n^2 | n^2 | 1 | + | + |
ΠΡΡΡΡΠ°Ρ (Quick) |
Π₯ΠΎΡΠΎΡΠ΅Π΅ Π±ΡΡΡΡΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π² ΡΡΠ΅Π΄Π½Π΅ΠΌ ΡΠ»ΡΡΠ°Π΅ | n*logn | n*logn | n^2 | logn | +/- (depends) |
+ |
Π‘Π»ΠΈΡΠ½ΠΈΠ΅ΠΌ (Merge) |
ΠΠΎΠΆΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎ ΡΡΡΡΠΊΡΡΡΠ°ΠΌΠΈ, ΠΊ ΠΊΠΎΡΠΎΡΡΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠΉ Π΄ΠΎΡΡΡΠΏ | n*logn | n*logn | n*logn | n (depends) |
+ | + |
ΠΠΈΡΠ°ΠΌΠΈΠ΄Π°Π»ΡΠ½Π°Ρ (Heap) |
ΠΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠ°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π² Π½Π°ΠΈΡ ΡΠ΄ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, ΡΠ΅ΠΊΠΎΠΌΠ΅Π΄ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠΎΡΡΠΈ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ | n*logn | n*logn | n*logn | 1 | - | - |
ΠΡΡΠ°Π²ΠΊΠ°ΠΌΠΈ (Insertion) |
Π Π΅ΠΊΠΎΠΌΠ΅Π΄ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠΎΡΡΠΈ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ ΠΈΠ»ΠΈ Π΄Π»Ρ ΠΌΠ°Π»ΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² | n | n^2 | n^2 | 1 | + | - |
Timsort | ΠΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ. Π‘ΡΠ°Π½Π΄Π°ΡΡ Π΄Π»Ρ Python, Java, Swift | n*logn | n*logn | n*logn | logn | - | - |
Introsort | ΠΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ. Π‘ΡΠ°Π½Π΄Π°ΡΡ Π΄Π»Ρ .Net | n*logn | n*logn | n*logn | logn | - | - |
ΠΠΎΡΠ°Π·ΡΡΠ΄Π½Π°Ρ (Radix) |
ΠΡΡΡΡΠ°Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° Π΄Π»Ρ ΡΠ΅Π»ΡΡ ΡΠΈΡΠ΅Π» ΠΈ ΡΡΡΠΎΠΊ | n*w | n*w | n*w | n+w | +/- (depends) |
+ |
ΠΠΈΠ½Π΅ΠΉΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ
ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π² Π½Π΅ΠΎΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΌΠ°ΡΡΠΈΠ²Π΅
def linear_search(arr, x):
for i in range(len(arr)):
if arr[i] == x:
return i
return None
arr: list = [28, 64, 2, 1, 13, 0]
print(linear_search(arr, 64))
1
ΠΠΈΠ½Π°ΡΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ
Π Π°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΌΠ°ΡΡΠΈΠ²Π°ΠΌΠΈ. ΠΠ΅ΡΠ΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Ρ ΠΌΠ°ΡΡΠΈΠ²Π° ΠΈ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅ΡΡΡ Ρ ΠΈΡΠΊΠΎΠΌΠΎΠΉ Π²Π΅Π»ΠΈΡΠΈΠ½ΠΎΠΉ. Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠΈΠΉ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΉ ΠΏΠΎΠΈΡΠΊ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΡΡΡ Π² ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π΅ Π»ΠΈΠ±ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ, Π»ΠΈΠ±ΠΎ ΠΏΡΠ°Π²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²Π°.
def binary_search(arr, x):
left, right = 0, len(arr) - 1
while left <= right:
middle = (left + right) // 2
if arr[middle] == x:
return middle
if arr[middle] < x:
left = middle + 1
elif arr[middle] > x:
right = middle - 1
arr: list = [0, 24, 64, 222, 1300, 2048]
print(binary_search(arr, 64))
2
ΠΠΎΠΈΡΠΊ Π² Π³Π»ΡΠ±ΠΈΠ½Ρ (DFS)
ΠΠ΅ΡΠΎΠ΄ ΠΎΠ±Ρ ΠΎΠ΄Π° Π³ΡΠ°ΡΠ°. Depth-first search (DFS) ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΡ ΡΠΎΡΠ½Π΅Π΅ ΠΏΠ΅ΡΠ΅Π²Π΅ΡΡΠΈ ΠΊΠ°ΠΊ "ΠΏΠΎΠΈΡΠΊ Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π² Π³Π»ΡΠ±ΠΈΠ½Ρ". Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΏΠΎΠΈΡΠΊΠ° ΠΈΠ΄Π΅Ρ Β«Π²Π³Π»ΡΠ±ΡΒ» Π³ΡΠ°ΡΠ°, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠΡΡΡ Π½Π΅ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°, ΡΠ°Π·Π³ΡΡΠΆΠ°ΡΡΠΈΠ΅ ΡΡΠ΅ΠΊ Π²ΡΠ·ΠΎΠ²ΠΎΠ².
# Using a Python dictionary to act as an adjacency list
graph = {
'5' : ['3','7'],
'3' : ['2', '4'],
'7' : ['8'],
'2' : [],
'4' : ['8'],
'8' : []
}
visited = set() # Set to keep track of visited nodes of graph
def dfs(visited, graph, node): # Function for DFS
if node not in visited:
print (node)
visited.add(node)
for neighbour in graph[node]:
dfs(visited, graph, neighbour)
dfs(visited, graph, '5')
5
3
2
4
8
7
ΠΠΎΠΈΡΠΊ Π² ΡΠΈΡΠΈΠ½Ρ (BFS)
Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠ° Π°Π»Π³ΠΎΡΠΈΡΠΌ Breadth-first search (BFS) ΠΏΠ΅ΡΠ΅Π±ΠΈΡΠ°Π΅Ρ Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π²Π΅ΡΡΠΈΠ½Ρ Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ ΠΎΡ ΠΊΠΎΡΠ½Ρ, ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΌ ΠΈΠ΄Π΅Ρ Β«Π²Π³Π»ΡΠ±ΡΒ».
# https://codereview.stackexchange.com/questions/135156/bfs-implementation-in-python-3
import collections
def breadth_first_search(graph, root):
visited, queue = set(), collections.deque([root])
while queue:
vertex = queue.popleft()
for neighbour in graph[vertex]:
if neighbour not in visited:
visited.add(neighbour)
queue.append(neighbour)
if __name__ == '__main__':
graph = {0: [1, 2], 1: [2], 2: []}
breadth_first_search(graph, 0)
deque([])
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΠΠ΅ΠΉΠΊΡΡΡΡ
ΠΠ°Ρ ΠΎΠ΄ΠΈΡ ΠΊΡΠ°ΡΡΠ°ΠΉΡΠΈΠ΅ ΠΏΡΡΠΈ ΠΎΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π²Π΅ΡΡΠΈΠ½ Π³ΡΠ°ΡΠ° Π΄ΠΎ Π²ΡΠ΅Ρ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ . ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π³ΡΠ°ΡΠΎΠ² Π±Π΅Π· ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΡ ΡΡΠ±Π΅Ρ.
# https://stackoverflow.com/questions/22897209/dijkstras-algorithm-in-python
nodes = ('A', 'B', 'C', 'D', 'E', 'F', 'G')
distances = {
'B': {'A': 5, 'D': 1, 'G': 2},
'A': {'B': 5, 'D': 3, 'E': 12, 'F' :5},
'D': {'B': 1, 'G': 1, 'E': 1, 'A': 3},
'G': {'B': 2, 'D': 1, 'C': 2},
'C': {'G': 2, 'E': 1, 'F': 16},
'E': {'A': 12, 'D': 1, 'C': 1, 'F': 2},
'F': {'A': 5, 'E': 2, 'C': 16}}
unvisited = {node: None for node in nodes} #using None as +inf
visited = {}
current = 'B'
currentDistance = 0
unvisited[current] = currentDistance
while True:
for neighbour, distance in distances[current].items():
if neighbour not in unvisited: continue
newDistance = currentDistance + distance
if unvisited[neighbour] is None or unvisited[neighbour] > newDistance:
unvisited[neighbour] = newDistance
visited[current] = currentDistance
del unvisited[current]
if not unvisited: break
candidates = [node for node in unvisited.items() if node[1]]
current, currentDistance = sorted(candidates, key = lambda x: x[1])[0]
print(visited)
{'B': 0, 'D': 1, 'E': 2, 'G': 2, 'C': 3, 'A': 4, 'F': 4}
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΠΠ΅Π»Π»ΠΌΠ°Π½Π°-Π€ΠΎΡΠ΄Π°
ΠΠ°ΠΊ ΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΠ΅ΠΉΠΊΡΡΡΡ, Π½Π°Ρ ΠΎΠ΄ΠΈΡ ΠΊΡΠ°ΡΡΠ°ΠΉΡΠΈΠ΅ ΠΏΡΡΠΈ ΠΎΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π²Π΅ΡΡΠΈΠ½ Π³ΡΠ°ΡΠ° Π΄ΠΎ Π²ΡΠ΅Ρ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ , Π½ΠΎ, Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π³ΡΠ°ΡΠ°ΠΌΠΈ Ρ ΡΠ΅Π±ΡΠ°ΠΌΠΈ, ΠΈΠΌΠ΅ΡΡΠΈΠΌΠΈ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΉ Π²Π΅Ρ.
Π’Π°Π±Π»ΠΈΡΠ° ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΏΠΎΠΈΡΠΊΠ°
ΠΠΈΠ΄ ΠΏΠΎΠΈΡΠΊΠ° | Π‘ΡΡΡΠΊΡΡΡΠ° Π΄Π°Π½Π½ΡΡ | Avg | Worst | Mem |
---|---|---|---|---|
ΠΠΈΠ½Π΅ΠΉΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ | ΠΠ°ΡΡΠΈΠ² | n | n | 1 |
ΠΠΈΠ½Π°ΡΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ | ΠΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² | logn | n | 1 |
ΠΠΎΠΈΡΠΊ Π² Π³Π»ΡΠ±ΠΈΠ½Ρ (DFS) | ΠΡΠ°Ρ | V+E | V | |
ΠΠΎΠΈΡΠΊ Π² ΡΠΈΡΠΈΠ½Ρ (BFS) | ΠΡΠ°Ρ | V+E | V | |
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΠΠ΅ΠΉΠΊΡΡΡΡ | ΠΡΠ°Ρ | (V+E)logV | (V+E)logV | V |
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΠΠ΅Π»Π»ΠΌΠ°Π½Π°-Π€ΠΎΡΠ΄Π° | ΠΡΠ°Ρ | V*E | V*E | V |
ΠΠ°ΡΡΠΈΡΠ° ΡΠΌΠ΅ΠΆΠ½ΠΎΡΡΠΈ
ΠΠ²Π°Π΄ΡΠ°ΡΠ½Π°Ρ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½Π°Ρ ΠΌΠ°ΡΡΠΈΡΠ° ΡΠ°Π·ΠΌΠ΅ΡΠ° V*V, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° a{i, j} ΡΠ°Π²Π½ΠΎ ΡΠΈΡΠ»Ρ ΡΡΠ±Π΅Ρ ΠΈΠ· i-ΠΉ Π²Π΅ΡΡΠΈΠ½Ρ Π² j-Ρ Π²Π΅ΡΡΠΈΠ½Ρ.
ΠΠ°ΡΡΠΈΡΠ° ΡΠΌΠ΅ΠΆΠ½ΠΎΡΡΠΈ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ Π³ΡΠ°ΡΠ° (Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π³ΠΎ ΠΏΠ΅ΡΠ΅Π»Ρ ΠΈ ΠΊΡΠ°ΡΠ½ΡΡ
ΡΡΠ±Π΅Ρ) ΡΠ²Π»ΡΠ΅ΡΡΡ Π±ΠΈΠ½Π°ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΠ΅ΠΉ ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½ΡΠ»ΠΈ Π½Π° Π³Π»Π°Π²Π½ΠΎΠΉ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ.
ΠΠ°ΡΡΠΈΡΠ° ΠΈΠ½ΡΠΈΠ΄Π΅Π½ΡΠ½ΠΎΡΡΠΈ
Π‘ΠΏΠΎΡΠΎΠ± ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π³ΡΠ°ΡΠ°, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ ΡΠ²ΡΠ·ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΈΠ½ΡΠΈΠ΄Π΅Π½ΡΠ½ΡΠΌΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ Π³ΡΠ°ΡΠ° (ΡΠ΅Π±ΡΠ°ΠΌΠΈ ΠΈ Π²Π΅ΡΡΠΈΠ½Π°ΠΌΠΈ). Π‘ΡΠΎΠ»Π±ΡΡ ΠΌΠ°ΡΡΠΈΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ ΡΠ΅Π±ΡΠ°ΠΌ, ΡΡΡΠΎΠΊΠΈ β Π²Π΅ΡΡΠΈΠ½Π°ΠΌ. ΠΠ΅Π½ΡΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΡΡΠ΅ΠΉΠΊΠ΅ ΠΌΠ°ΡΡΠΈΡΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ²ΡΠ·Ρ ΠΌΠ΅ΠΆΠ΄Ρ Π²Π΅ΡΡΠΈΠ½ΠΎΠΉ ΠΈ ΡΠ΅Π±ΡΠΎΠΌ (ΠΈΡ
ΠΈΠ½ΡΠΈΠ΄Π΅Π½ΡΠ½ΠΎΡΡΡ). ΠΡΠ»ΠΈ ΡΠ²ΡΠ·ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π²Π΅ΡΡΠΈΠ½ΠΎΠΉ ΠΈ ΡΠ΅Π±ΡΠΎΠΌ Π½Π΅Ρ, ΡΠΎ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ ΡΡΠ΅ΠΉΠΊΡ ΡΡΠ°Π²ΠΈΡΡΡ Β«0Β».
Π ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π³ΡΠ°ΡΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΄ΡΠ³Π΅ ΡΡΠ°Π²ΠΈΡΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΌ ΡΡΠΎΠ»Π±ΡΠ΅: 1 Π² ΡΡΡΠΎΠΊΠ΅ Π²Π΅ΡΡΠΈΠ½Ρ x ΠΈ -1 Π² ΡΡΡΠΎΠΊΠ΅ Π²Π΅ΡΡΠΈΠ½Ρ y.
Π‘ΠΏΠΈΡΠΎΠΊ ΡΠΌΠ΅ΠΆΠ½ΠΎΡΡΠΈ
Π‘Π°ΠΌΡΠΉ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ Π³ΡΠ°ΡΠ°. Π‘ΠΏΠΎΡΠΎΠ± ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π³ΡΠ°ΡΠ° Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ ΡΠΏΠΈΡΠΊΠΎΠ² Π²Π΅ΡΡΠΈΠ½. ΠΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Π΅ Π³ΡΠ°ΡΠ° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΠΏΠΈΡΠΎΠΊ, ΡΠΎΡΡΠΎΡΡΠΈΠΉ ΠΈΠ· Β«ΡΠΎΡΠ΅Π΄Π΅ΠΉΒ» ΡΡΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Ρ.
ΠΠ°ΡΠΈΠ°Π½ΡΡ:
β’ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ
Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΡ Π΄Π»Ρ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Ρ ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ ΡΠΌΠ΅ΠΆΠ½ΡΡ
Π²Π΅ΡΡΠΈΠ½;
β’ Π²Π΅ΡΡΠΈΠ½Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ ΡΠΈΡΠ»ΠΎΠ²ΡΠΌ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠΌ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅, ΠΊΠ°ΠΆΠ΄Π°Ρ ΡΡΠ΅ΠΉΠΊΠ° ΠΌΠ°ΡΡΠΈΠ²Π° ΡΡΡΠ»Π°Π΅ΡΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΠΉ ΡΠ²ΡΠ·Π°Π½Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΡΠΎΡΠ΅Π΄Π½ΠΈΡ
Π²Π΅ΡΡΠΈΠ½;
β’ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ Π²Π΅ΡΡΠΈΠ½ ΠΈ ΡΡΠ±Π΅Ρ, ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π²Π΅ΡΡΠΈΠ½Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΡΡΠ»ΠΊΡ Π½Π° ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΡΡΠ±Π΅Ρ, ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ΅Π±ΡΠ° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΠΈΡΡ
ΠΎΠ΄ΡΡΡΡ ΠΈ Π²Ρ
ΠΎΠ΄ΡΡΡΡ Π²Π΅ΡΡΠΈΠ½Ρ.
Π‘ΠΏΠΈΡΠΎΠΊ ΠΈΠ½ΡΠΈΠ΄Π΅Π½ΡΠ½ΠΎΡΡΠΈ
Π‘ΠΏΠΈΡΠΎΠΊ ΠΈΠ½ΡΠΈΠ΄Π΅Π½ΡΠ½ΠΎΡΡΠΈ ΠΏΠΎΡ ΠΎΠΆ Π½Π° ΡΠΏΠΈΡΠΎΠΊ ΡΠΌΠ΅ΠΆΠ½ΠΎΡΡΠΈ, ΡΠΎΠ»ΡΠΊΠΎ Ρ ΡΠΎΠΉ ΡΠ°Π·Π½ΠΈΡΠ΅ΠΉ, ΡΡΠΎ Π² i-ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π½ΠΎΠΌΠ΅ΡΠ° ΡΠ΅Π±Π΅Ρ, ΠΈΠ½ΡΠΈΠ΄Π΅Π½ΡΠ½ΡΡ Π΄Π°Π½Π½ΠΎΠΉ i-ΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Π΅.
Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π³ΡΠ°ΡΠΎΠ²
ΠΠ΅ΡΠΎΠ΄ | Mem | Add V | Add E | Remove V | Remove E | ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΌΠ΅ΠΆΠ½. V |
---|---|---|---|---|---|---|
ΠΠ°ΡΡΠΈΡΠ° ΡΠΌΠ΅ΠΆΠ½ΠΎΡΡΠΈ (Adjacency matrix) |
V^2 | V^2 | 1 | V^2 | 1 | 1 |
ΠΠ°ΡΡΠΈΡΠ° ΠΈΠ½ΡΠΈΠ΄Π΅Π½ΡΠ½ΠΎΡΡΠΈ (Incidence matrix) |
V*E | V*E | V*E | V*E | V*E | E |
Π‘ΠΏΠΈΡΠΎΠΊ ΡΠΌΠ΅ΠΆΠ½ΠΎΡΡΠΈ (Adjacency list) |
V+E | 1 | 1 | V+E | E | V |
Π‘ΠΏΠΈΡΠΎΠΊ ΠΈΠ½ΡΠΈΠ΄Π΅Π½ΡΠ½ΠΎΡΡΠΈ (Incidence list) |
V+E | 1 | 1 | E | E | E |
P vs NP
ΠΠ°Π΄Π°ΡΠΈ ΠΊΠ»Π°ΡΡΠ° P β ΡΠ΅Π°Π»ΡΠ½ΠΎ Π²ΡΡΠΈΡΠ»ΠΈΠΌΡΠ΅ Π·Π°Π΄Π°ΡΠΈ (ΡΠ΅Π·ΠΈΡ ΠΠΎΠ±ΡΠΌΠ°), ΡΠ΅ΡΠ°ΡΡΡΡ Π·Π° ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠΈΠ°Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ.
NP-ΠΏΠΎΠ»Π½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ β Π½Π΅ ΡΠ°Π·ΡΠ΅ΡΠΈΠΌΡ Π·Π° ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠΈΠ°Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ, Π½ΠΎ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ²Π΅Π΄Π΅Π½Ρ ΠΊ Π·Π°Π΄Π°ΡΠ°ΠΌ ΡΠ°Π·ΡΠ΅ΡΠΈΠΌΠΎΡΡΠΈ (Π΄Π°/Π½Π΅Ρ), ΠΊΠΎΡΠΎΡΡΠ΅, Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΡΠ΅ΡΠ°ΡΡΡΡ Π·Π° ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠΈΠ°Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ.
Π Π°Π·Π΄Π΅Π»ΡΠΉ ΠΈ Π²Π»Π°ΡΡΠ²ΡΠΉ
Π Π°Π·Π΄Π΅Π»ΡΠΉ ΠΈ Π²Π»Π°ΡΡΠ²ΡΠΉ (divide and conquer) β ΡΠΏΠΎΡΠΎΠ± ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ»ΠΎΠΆΠ½ΡΡ Π·Π°Π΄Π°Ρ ΠΏΡΡΡΠΌ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΡ ΡΠ΅ΡΠ°Π΅ΠΌΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ Π½Π° Π΄Π²Π΅ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Π·Π°Π΄Π°ΡΠΈ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠΈΠΏΠ°, Π½ΠΎ ΠΌΠ΅Π½ΡΡΠ΅Π³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°, ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΎΡΠ²Π΅ΡΠ° ΠΊ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅; ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π²ΡΠ΅ ΠΏΠΎΠ΄Π·Π°Π΄Π°ΡΠΈ Π½Π΅ ΠΎΠΊΠ°ΠΆΡΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠ½ΡΠΌΠΈ.
ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ β ΡΠΏΠΎΡΠΎΠ± ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ»ΠΎΠΆΠ½ΡΡ Π·Π°Π΄Π°Ρ ΠΏΡΡΡΠΌ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΡ ΠΈΡ Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΡΠ΅ ΠΏΠΎΠ΄Π·Π°Π΄Π°ΡΠΈ. ΠΠ½ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΊ Π·Π°Π΄Π°ΡΠ°ΠΌ ΡΠΎ ΡΡΡΡΠΊΡΡΡΠΎΠΉ, Π²ΡΠ³Π»ΡΠ΄ΡΡΠ΅ΠΉ ΠΊΠ°ΠΊ Π½Π°Π±ΠΎΡ ΠΏΠ΅ΡΠ΅ΠΊΡΡΠ²Π°ΡΡΠΈΡ ΡΡ ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ, ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ ΠΊΠΎΡΠΎΡΡΡ ΠΌΠ΅Π½ΡΡΠ΅ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ. ΠΠ»ΡΡΠ΅Π²Π°Ρ ΠΈΠ΄Π΅Ρ: ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ΅ΡΠΈΡΡ ΠΏΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΡΡ Π·Π°Π΄Π°ΡΡ, ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ΅ΡΠΈΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠ°ΡΡΠΈ Π·Π°Π΄Π°ΡΠΈ (ΠΏΠΎΠ΄Π·Π°Π΄Π°ΡΠΈ), ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ Π² ΠΎΠ΄Π½ΠΎ ΠΎΠ±ΡΠ΅Π΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅. Π§Π°ΡΡΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· ΡΡΠΈΡ ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ. ΠΠΎΠ΄Ρ ΠΎΠ΄ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΡΠ΅ΡΠΈΡΡ ΠΊΠ°ΠΆΠ΄ΡΡ ΠΏΠΎΠ΄Π·Π°Π΄Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, ΡΠΎΠΊΡΠ°ΡΠΈΠ² ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ. ΠΡΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² ΡΠ»ΡΡΠ°ΡΡ , ΠΊΠΎΠ³Π΄Π° ΡΠΈΡΠ»ΠΎ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠΈΡ ΡΡ ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ ΡΠΊΡΠΏΠΎΠ½Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ Π²Π΅Π»ΠΈΠΊΠΎ.Ρ
ΠΠ°Π΄Π½ΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ
ΠΠ°Π΄Π½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ (greedy algorithm) β Π°Π»Π³ΠΎΡΠΈΡΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ°Π³Ρ Π΄Π΅Π»Π°Π΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ Π½Π°ΠΈΠ»ΡΡΡΠΈΠΉ Π²ΡΠ±ΠΎΡ Π² Π½Π°Π΄Π΅ΠΆΠ΄Π΅, ΡΡΠΎ ΠΈΡΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΌ.
ΠΠ°ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, Π΄Π°ΡΡ Π»ΠΈ ΠΆΠ°Π΄Π½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅? Π ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΡΠ΅ΠΎΡΠ΅ΠΌΠΎΠΉ Π Π°Π΄ΠΎ-ΠΠ΄ΠΌΠΎΠ½Π΄ΡΠ°, Π΅ΡΠ»ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠ°ΡΡΠΎΠΈΠ΄ΠΎΠΌ, ΡΠΎ Π΄Π»Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΉ Π²Π΅ΡΠΎΠ²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠ½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ Π²ΡΠ΅Π³Π΄Π° Π½Π°Ρ ΠΎΠ΄ΠΈΡ ΡΠΎΡΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ Π΄ΠΎΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠ°ΡΡΠΎΠΈΠ΄ΠΎΠΌ, ΡΠΎ ΠΆΠ°Π΄Π½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ Π±ΡΠ΄Π΅Ρ Π²ΡΠ΄Π°Π²Π°ΡΡ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ.
ΠΠ°Π΄Π½ΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ ΠΏΡΠΎΡΠ΅ ΠΈ Π±ΡΡΡΡΠ΅Π΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² Π½Π° Π±Π°Π·Π΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
Π Π°Π·Π»ΠΈΡΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Π΅ ΠΆΠ°Π΄Π½ΡΠΌΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°ΠΌΠΈ ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡΠ½ΠΈΡΡ ΡΠ°ΠΊ: Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ°Π³Π΅ ΠΆΠ°Π΄Π½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ Π±Π΅ΡΠ΅Ρ "ΡΠ°ΠΌΡΠΉ ΠΆΠΈΡΠ½ΡΠΉ ΠΊΡΡΠΎΠΊ", Π° ΠΏΠΎΡΠΎΠΌ ΡΠΆΠ΅ ΠΏΡΡΠ°Π΅ΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ Π½Π°ΠΈΠ»ΡΡΡΠΈΠΉ Π²ΡΠ±ΠΎΡ ΡΡΠ΅Π΄ΠΈ ΠΎΡΡΠ°Π²ΡΠΈΡ ΡΡ, ΠΊΠ°ΠΊΠΎΠ²Ρ Π±Ρ ΠΎΠ½ΠΈ Π½ΠΈ Π±ΡΠ»ΠΈ; Π°Π»Π³ΠΎΡΠΈΡΠΌ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΏΡΠΎΡΡΠΈΡΠ°Π² Π·Π°ΡΠ°Π½Π΅Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡ Π΄Π»Ρ Π²ΡΠ΅Ρ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ².
Π Π΅ΠΊΡΡΡΠΈΡ
Π Π΅ΠΊΡΡΡΠΈΡ β ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΅ΡΠ΅Π· ΡΠ°ΠΌΡ ΡΠ΅Π±Ρ. ΠΠΎΠ³ΠΈΠΊΠ° ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π΄Π²ΡΡ Π²Π΅ΡΠ²Π΅ΠΉ. ΠΠ»ΠΈΠ½Π½Π°Ρ Π²Π΅ΡΠ²Ρ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΡ ΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΡ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ, ΡΡΠΎΠ±Ρ Π½Π°ΠΊΠΎΠΏΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ. ΠΠΎΡΠΎΡΠΊΠ°Ρ Π²Π΅ΡΠ²Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΊΡΠΈΡΠ΅ΡΠΈΠΉ Π²ΡΡ ΠΎΠ΄Π° ΠΈΠ· ΡΠ΅ΠΊΡΡΡΠΈΠΈ.
Π Π΅ΠΊΡΡΡΠΈΡ ΡΠΏΡΠΎΡΠ°Π΅Ρ ΠΊΠΎΠ΄ ΠΈ Π΄Π΅Π»Π°Π΅Ρ Π΅Π³ΠΎ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΡΠΌ. Π Π΅ΠΊΡΡΡΠΈΡ ΠΏΠΎΠΎΡΡΡΠ΅Ρ ΠΌΡΡΠ»ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ ΠΈ ΠΈΠ·Π±Π΅Π³Π°ΡΡ ΠΏΠΎΠ±ΠΎΡΠ½ΡΡ ΡΡΡΠ΅ΠΊΡΠΎΠ².
ΠΠ΅ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΠ΅ΠΊΡΡΡΠΈΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π½Π°ΠΊΠ»Π°Π΄Π½ΡΠΌ ΡΠ°ΡΡ ΠΎΠ΄Π°ΠΌ ΡΠ΅ΡΡΡΡΠΎΠ². ΠΡΠΈ Π±ΠΎΠ»ΡΡΠΎΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π²ΡΡΠΈΡΡ Π»ΠΈΠΌΠΈΡ Π½Π° ΡΠΈΡΠ»ΠΎ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² (recursion depth limit reached).
Π₯Π²ΠΎΡΡΠΎΠ²Π°Ρ ΡΠ΅ΠΊΡΡΡΠΈΡ
ΠΡΠΎΠ±ΡΠΉ Π²ΠΈΠ΄ ΡΠ΅ΠΊΡΡΡΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° ΡΡΠ½ΠΊΡΠΈΡ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΡΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΡΠ°ΠΌΠΎΠΉ ΡΠ΅Π±Ρ Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ². ΠΠΎΠ³Π΄Π° ΡΡΠΎ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ, ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΡΠ΅ΠΊΡΡΡΠΈΡ Π² ΡΠΈΠΊΠ» Ρ ΠΎΠ΄Π½ΠΈΠΌ ΡΡΠ΅ΠΊ-ΡΡΠ΅ΠΉΠΌΠΎΠΌ, ΠΏΡΠΎΡΡΠΎ ΠΌΠ΅Π½ΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΡ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ ΠΊ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ.
Π’Π°ΠΊ, ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠ°ΠΊΡΠΎΡΠΈΠ°Π»Π° return N * fact(N - 1) Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Ρ Π²ΠΎΡΡΠΎΠ²ΡΡ ΡΠ΅ΠΊΡΡΡΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΡΠ΅ΠΊ-ΡΡΠ΅ΠΉΠΌΠ° ΠΏΡΠΈΠ΄Π΅ΡΡΡ Ρ ΡΠ°Π½ΠΈΡΡ ΡΠ΅ΠΊΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ N.
Π§ΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ΅ΠΊΡΡΡΠΈΠΈ Ρ Π²ΠΎΡΡΠΎΠ²ΠΎΠΉ, Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ-Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΡ. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π·Π½Π°Π΅Ρ ΠΎ ΡΠ²ΠΎΠ΅ΠΌ ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ. ΠΡΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ acc ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠ°Π²Π΅Π½ 1. Π’ΠΎΠ³Π΄Π° Π·Π°ΠΏΠΈΡΡ Ρ Ρ Π²ΠΎΡΡΠΎΠ²ΠΎΠΉ ΡΠ΅ΠΊΡΡΡΠΈΠ΅ΠΉ Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ°ΠΊ:
def fact(N, acc=1):
if N == 1:
return acc
else:
return fact(N - 1, acc * N)
Π‘Π°ΠΌΡΠ΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ Leetcode
- ΠΠ΅ΡΠΎΠ΄ ΡΠΊΠΎΠ»ΡΠ·ΡΡΠ΅Π³ΠΎ ΠΎΠΊΠ½Π° (Sliding Window)
- ΠΠ΅ΡΠΎΠ΄ Π΄Π²ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ (Two Pointers)
- ΠΠ°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΠΈΠΊΠ»Π° (Fast & Slow Pointers)
- ΠΠ½ΡΠ΅ΡΠ²Π°Π»ΡΠ½ΠΎΠ΅ ΡΠ»ΠΈΡΠ½ΠΈΠ΅ (Merge Intervals)
- Π¦ΠΈΠΊΠ»ΠΈΡΠ½Π°Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° (Cyclic Sort)
- In-place Reversal Π΄Π»Ρ LinkedList (In-place Reversal of a LinkedList)
- ΠΠΎΠΈΡΠΊ Π² ΡΠΈΡΠΈΠ½Ρ (Tree Breadth-First Search)
- ΠΠΎΠΈΡΠΊ Π² Π³Π»ΡΠ±ΠΈΠ½Ρ (Tree Depth First Search)
- ΠΠ²Π΅ ΠΊΡΡΠΈ (Two Heaps)
- ΠΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° (Subsets)
- ΠΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π±ΠΈΠ½Π°ΡΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ (Modified Binary Search)
- ΠΠΎΠ±ΠΈΡΠΎΠ²ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠ΅Π΅ ΠΠΠ (Bitwise XOR)
- ΠΠ°ΠΈΠ±ΠΎΠ»ΡΡΠΈΠ΅ K ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² (Top K Elements)
- K-ΠΎΠ±ΡΠ°Π·Π½ΠΎΠ΅ ΡΠ»ΠΈΡΠ½ΠΈΠ΅ (K-way Merge)
- ΠΠ°Π΄Π°ΡΠ° ΠΎ ΡΡΠΊΠ·Π°ΠΊΠ΅ 0-1 (0/1 Knapsack)
- ΠΠ°Π΄Π°ΡΠ° ΠΎ Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠΌ ΡΡΠΊΠ·Π°ΠΊΠ΅ (Unbounded Knapsack)
- Π§ΠΈΡΠ»Π° Π€ΠΈΠ±ΠΎΠ½Π°ΡΡΠΈ (Fibonacci Numbers)
- ΠΠ°ΠΈΠ±ΠΎΠ»ΡΡΠ°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ-ΠΏΠ°Π»ΠΈΠ½Π΄ΡΠΎΠΌ (Palindromic Subsequence)
- ΠΠ°ΠΈΠ±ΠΎΠ»ΡΡΠ°Ρ ΠΎΠ±ΡΠ°Ρ ΠΏΠΎΠ΄ΡΡΡΠΎΠΊΠ° (Longest Common Substring)
- Π’ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° (Topological Sort)
- Π§ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠ΅ΡΠΈΠΊΡΠ½ΠΎΠ³ΠΎ Π΄Π΅ΡΠ΅Π²Π° (Trie Traversal)
- ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΡΡΡΠΎΠ²ΠΎΠ² Π² ΠΌΠ°ΡΡΠΈΡΠ΅ (Number of Island)
- ΠΠ΅ΡΠΎΠ΄ ΠΏΡΠΎΠ± ΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ (Trial & Error)
- Π‘ΠΈΡΡΠ΅ΠΌΠ° Π½Π΅ΠΏΠ΅ΡΠ΅ΡΠ΅ΠΊΠ°ΡΡΠΈΡ ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ² (Union Find)
- ΠΠ°Π΄Π°ΡΠ°: Π½Π°ΠΉΡΠΈ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΌΠ°ΡΡΡΡΡΡ (Unique Paths)
9. ΠΠ°Π·Ρ Π΄Π°Π½Π½ΡΡ
Β«ΠΠ΄Π΅ΡΡ Π±ΡΠ» Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΡΠ°ΠΏΠ΅Π·Π½ΡΠΉ ΡΡΠΎΠ», Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΡΠΎΡΠ»ΠΈ Π·ΠΎΠ»ΠΎΡΡΠ΅ ΡΠΎΡΡΠ΄Ρ, Π²Π΅ΡΡΠΌΠ° Π΄ΠΎΡΠΎΠ³ΠΈΠ΅. Π ΡΠΎΡΡΠ΄Π°Ρ ΡΡΠΈΡ Π½Π°Ρ ΠΎΠ΄ΠΈΠ»ΠΈΡΡ ΠΎΠ²ΠΎΡΠΈ ΡΠ°Π·Π½ΡΡ ΡΠΎΡΡΠΎΠ², ΠΎΡ ΠΊΠΎΡΠΎΡΡΡ ΠΈΡΡ ΠΎΠ΄ΠΈΠ»ΠΈ ΡΡΠ΄Π½ΡΠ΅ Π±Π»Π°Π³ΠΎΡΡ Π°Π½ΠΈΡΒ».
Β«ΠΠΈΠ΄Π΅Π½ΠΈΠ΅ ΠΡΠΈΠ³ΠΎΡΠΈΡΒ».
Π Π΅Π»ΡΡΠΈΠΎΠ½Π½Π°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ Π΄Π°Π½Π½ΡΡ
Π Π΅Π»ΡΡΠΈΠΎΠ½Π½Π°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ Π΄Π°Π½Π½ΡΡ (Π ΠΠ) ΠΎΡΠ½ΠΎΠ²Π°Π½Π° Π½Π° ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌ ΠΏΠΎΠ½ΡΡΠΈΠΈ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ (relation), ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½Π΅ΡΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ»ΠΊΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ "ΡΠ°Π±Π»ΠΈΡΠ°". Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΡΠ΅Π»ΡΡΠΈΠΎΠ½Π½ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ Π΄Π°Π½Π½ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΏΡΠΎΡΠ΅Π½Π½ΠΎ Π²ΠΎΡΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΊΠ°ΠΊ "ΡΠ°Π±Π»ΠΈΡΠ½ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ Π΄Π°Π½Π½ΡΡ ", Ρ. Π΅. ΠΏΠΎΡΡΡΠΎΠ΅Π½Π½ΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π΄Π²ΡΠΌΠ΅ΡΠ½ΡΡ ΡΠ°Π±Π»ΠΈΡ, ΡΠΎΡΡΠΎΡΡΠΈΡ ΠΈΠ· ΡΡΡΠΎΠΊ ΠΈ ΡΡΠΎΠ»Π±ΡΠΎΠ².
Π Π°Π±ΠΎΡΠ°Ρ Ρ ΡΠ΅Π»ΡΡΠΈΠΎΠ½Π½ΠΎΠΉ ΠΠ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π·Π°Π±ΠΎΡΠΈΡΡΡΡ ΠΎ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΎΠΌ Π΄ΠΎΡΡΡΠΏΠ΅ ΠΊ Π΄Π°Π½Π½ΡΠΌ, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΎΠΏΠΈΡΠ°ΡΡ, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ, Π° ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ β ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ, ΡΡΡ ΡΠ°Π±ΠΎΡΡ Π±Π΅ΡΠ΅Ρ Π½Π° ΡΠ΅Π±Ρ ΠΠ.
ΠΡΡΡΡΡΡΠ²ΠΈΠ΅ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ° β ΡΠΈΠ»ΡΠ½ΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΡΠΎΠΆΠ΄Π°ΡΡΠ΅Π΅ ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΠ (ΠΎ ΠΏΠ»ΡΡΠ°Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ ΠΌΡ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΡΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅, Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Β«ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°Β»). ΠΠΎ ΡΡΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π±ΡΠΊΠ²Π°Π»ΡΠ½ΠΎ Β«Π»ΠΎΠΌΠ°Π΅Ρ ΠΌΠΎΠ·Π³Β» ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ, Π½Π΅ ΠΈΠΌΠ΅Π²ΡΠ΅ΠΌΡ Π΄ΠΎ ΡΡΠΎΠ³ΠΎ Π΄Π΅Π»Π° Ρ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΡΠΌΠΈ ΡΠ·ΡΠΊΠ°ΠΌΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
ΠΠΎΠ³Π΄Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΉ Π² ΠΈΠΌΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎΠΉ ΠΏΠ°ΡΠ°Π΄ΠΈΠ³ΠΌΠ΅, ΠΏΡΡΠ°Π΅ΡΡΡ ΡΠ΅ΡΠΈΡΡ SQL-Π·Π°Π΄Π°ΡΡ, ΡΡΠΊΠΈ ΡΠ°ΠΌΠΈ ΡΡΠ½ΡΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΏΡΠΈΠ²ΡΡΠ½ΡΠΉ Π½Π°Π±ΠΎΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ². Β«Π’Π°ΠΊ, ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΠΌΡΡ ΠΏΠΎ ΡΠ°Π±Π»ΠΈΡΠ΅ Π² ΡΠΈΠΊΠ»Π΅, ΠΎΡΡΠ΅ΡΠ½Π½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΊΠ»Π°Π΄ΡΠ²Π°Π΅ΠΌ Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ, ΠΏΠΎΡΠΎΠΌ ΡΠΎΡΠΌΠΈΡΡΠ΅ΠΌ ΠΎΡΠ²Π΅ΡΒ», Π½ΠΎ β SQL ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΡΠΎΠ²ΡΠ΅ΠΌ Π΄ΡΡΠ³ΠΎΠΉ, Π½Π΅ΠΏΡΠΈΠ²ΡΡΠ½ΡΠΉ Π½Π°Π±ΠΎΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ²: Β«Π‘ΠΊΠ°ΠΆΠΈ, ΡΡΠΎ ΡΡ Ρ ΠΎΡΠ΅ΡΡ, Π° ΠΎ Π΄Π΅ΡΠ°Π»ΡΡ Ρ ΠΏΠΎΠ·Π°Π±ΠΎΡΡΡΡ ΡΠ°ΠΌΒ».
ΠΡΠ»ΠΈ ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π΄Π»Ρ Π²Π°Ρ Π²Π½ΠΎΠ²Π΅, Π½Π΅ ΠΎΡΡΠ°ΠΈΠ²Π°ΠΉΡΠ΅ΡΡ; ΠΠΆΠΎ Π‘Π΅Π»ΠΊΠΎ Π² ΡΠ²ΠΎΠ΅ΠΉ ΠΊΠ½ΠΈΠ³Π΅ Β«Thinking in SetsΒ» ΡΡΠ°Π·Ρ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅Ρ Π³ΠΎΡΠΎΠ²ΠΈΡΡΡΡ ΠΊ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΡΡΡΠΎΠΉΠΊΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΌΡΡΠ»Π΅Π½ΠΈΡ: Β«Π― ΠΎΡΠΈΠ΅Π½ΡΠΈΡΡΡ ΡΡΡΠ΄Π΅Π½ΡΠΎΠ² Π½Π° ΡΡΠΎΠΊ ΠΎΠΊΠΎΠ»ΠΎ Π³ΠΎΠ΄Π°, ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΠΎΡΠ²ΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π° SQL, ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π΄Π° Π²Π°Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΠ΅ΡΠΈΡΡ ΠΏΡΠΎΠ·ΡΠ΅Π½ΠΈΠ΅ ΠΈ Π²Ρ Π½Π°ΡΠ½Π΅ΡΠ΅ Π΄ΡΠΌΠ°ΡΡ Π½Π° ΡΠ·ΡΠΊΠ΅ SQLΒ» (Β«I have been telling students that you need about one year of full-time SQL programming before you have an epiphany and start thinking in SQLΒ»).
Π’Π°ΠΊ ΡΡΠΎ ΠΏΠΎΡΠΈΡ ΠΎΠ½ΡΠΊΡ ΠΈΠ·Π±Π°Π²Π»ΡΠΉΡΠ΅ΡΡ ΠΎΡ ΡΠ²ΠΎΠ΅Π³ΠΎ (ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ ΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠ½ΠΈΠ³Ρ Π‘Π΅Π»ΠΊΠΎ) Β«procedural programming mindsetΒ», ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Β«overly complex and inefficient codeΒ», ΠΈ Β«change the way you think about the problems you solve with SQL programsΒ». ΠΠ»ΠΈ, ΠΏΠΎ ΠΏΡΠΎΡΡΠΎΠΌΡ, ΠΊΠ°ΠΊ ΡΠΎΠ²Π΅ΡΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ Stackoverflow Π² ΡΡΠΎΠΌ ΡΠΎΠΏΠΈΠΊΠ΅, Β«ΠΏΡΠ΅ΠΊΡΠ°ΡΠΈΡΠ΅ Π΄ΡΠΌΠ°ΡΡ ΠΎ ΠΏΠΎΡΡΡΠΎΡΠ½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅, ΠΏΠΎΠ΄ΡΠΌΠ°ΠΉΡΠ΅ Π½Π°Π΄ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π·Π°Π΄Π°ΡΠΈ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π½Π° ΡΠ°Π±ΠΎΡΠ΅ ΡΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°ΠΌΠΈΒ».
The key thing is you're manipulating SETS & elements of sets; and relating different sets (and corresponding elements) together. That's really the heart of it, imho. That's why every table should have a primary key; why you see set operators in the language; and why set operators like UNION won't (by defualt) return duplicate rows.
Of course in practice, the rules of sets are bent or broken but it's not that hard to see when this is necessary (otherwise, SQL would be TOO limited). Imho, just crack open your discrete math book and reacquaint yourself with some set exercises.
Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΡ
Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΡ β Π½Π΅Π΄Π΅Π»ΠΈΠΌΠ°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ (Π°ΡΠΎΠΌΠ°ΡΠ½Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ, Π³ΡΡΠΏΠΏΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠ΅ ΡΠ΅Π»ΠΎΠ΅), ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π»ΠΈΠ±ΠΎ Π²ΡΠ΅Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΠΈΠ· ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, Π»ΠΈΠ±ΠΎ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ. ΠΡΠ»ΠΈ Π² Ρ ΠΎΠ΄Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ΅Π» ΡΠ±ΠΎΠΉ, ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΎ ΠΊ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌΡ, ΡΠΆΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΎΡΠΌΠ΅Π½Π΅Π½Ρ.
ΠΠ°Π½ΠΎΠ½ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ β ΡΠΏΠΈΡΡΠ²Π°Π½ΠΈΠ΅ Π΄Π΅Π½Π΅Π³ Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΡΠ΅ΡΠ° ΠΈ Π·Π°ΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Π½Π° Π΄ΡΡΠ³ΠΎΠΉ, Π΄Π»Ρ ΡΠ΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡ Π΄Π²Π° ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡΡ ΠΈΠ»ΠΈ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡΡ Π²ΠΌΠ΅ΡΡΠ΅.
Π ΡΠ°ΡΡΠ½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π² Π³ΡΡΠΏΠΏΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΠ΄Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ.
Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ BEGIN ΠΈ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ COMMIT Π»ΠΈΠ±ΠΎ ΠΎΡΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ROLLBACK (Π·Π΄Π΅ΡΡ ΠΈ Π΄Π°Π»Π΅Π΅, Π΅ΡΠ»ΠΈ Π½Π΅ ΡΠΊΠ°Π·Π°Π½ΠΎ ΠΈΠ½ΠΎΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ PostgreSQL).
ACID
Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΠ±Π»Π°Π΄Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌΠΈ:
-
ΠΡΠΎΠΌΠ°ΡΠ½ΠΎΡΡΡ (atomicity). ΠΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π»ΠΈΠ±ΠΎ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π±ΡΠ΄Π΅Ρ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π° Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ, Ρ. Π΅. Π±ΡΠ΄ΡΡ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ Π΅Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, Π»ΠΈΠ±ΠΎ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π° Π½ΠΈ ΠΎΠ΄Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ.
-
Π‘ΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡ (consistency). ΠΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΏΡΠ΅Π΄ΠΏΠΈΡΡΠ²Π°Π΅Ρ, ΡΡΠΎΠ±Ρ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ Π±ΡΠ»Π° ΠΏΠ΅ΡΠ΅Π²Π΅Π΄Π΅Π½Π° ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠΈΡΡΠ΅Π½ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π² Π΄ΡΡΠ³ΠΎΠ΅ ΠΊΠΎΠ½ΡΠΈΡΡΠ΅Π½ΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅.
-
ΠΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡ (isolation). ΠΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΏΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π²Π»ΠΈΡΠ½ΠΈΠ΅ Π½Π° Π½Π΅Π΅.
-
ΠΠΎΠ»Π³ΠΎΠ²Π΅ΡΠ½ΠΎΡΡΡ (durability). ΠΠΎΡΠ»Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΉ ΡΠΈΠΊΡΠ°ΡΠΈΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ Π΄Π°Π½Π½ΡΠ΅ Π½Π°Π΄Π΅ΠΆΠ½ΠΎ ΡΠΎΡ ΡΠ°Π½Π΅Π½Ρ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ ΠΈ Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½Ρ ΠΈΠ· Π½Π΅Π΅, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΡΠ±ΠΎΠ΅Π² Π² ΡΠ°Π±ΠΎΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ.
ΠΠ»Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΡΡΠΈΡ ΡΠ΅ΡΡΡΠ΅Ρ ΡΠ²ΠΎΠΉΡΡΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π°Π±Π±ΡΠ΅Π²ΠΈΠ°ΡΡΡΠ° ACID.
ΠΡΠΎΠ±Π»Π΅ΠΌΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ
Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»Π½ΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈΠ»ΠΈ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ. Π Π΅ΡΠ»ΠΈ Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²ΡΠ΅ ΠΏΠΎΠ½ΡΡΠ½ΠΎ ΠΈ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠΎ, ΡΠΎ Π² ΡΠ»ΡΡΠ°Π΅ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ:
Π€Π°Π½ΡΠΎΠΌΠ½ΠΎΠ΅ ΡΡΠ΅Π½ΠΈΠ΅ (phantom reads) β ΠΎΠ΄Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π² Ρ ΠΎΠ΄Π΅ ΡΠ²ΠΎΠ΅Π³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· Π²ΡΠ±ΠΈΡΠ°Π΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΡΡΠΎΠΊ ΠΏΠΎ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ ΡΠ΅ΠΌ ΠΆΠ΅ ΠΊΡΠΈΡΠ΅ΡΠΈΡΠΌ. ΠΡΡΠ³Π°Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π² ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π°Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠΈΠΌΠΈ Π²ΡΠ±ΠΎΡΠΊΠ°ΠΌΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΡΡΠΎΠΊΠΈ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΡΡΠΎΠ»Π±ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΡΡΠΎΠΊ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π² ΠΊΡΠΈΡΠ΅ΡΠΈΡΡ Π²ΡΠ±ΠΎΡΠΊΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, ΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΡΡΡ. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ, ΡΡΠΎ ΠΎΠ΄Π½ΠΈ ΠΈ ΡΠ΅ ΠΆΠ΅ Π²ΡΠ±ΠΎΡΠΊΠΈ Π² ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π΄Π°ΡΡ ΡΠ°Π·Π½ΡΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΡΡΡΠΎΠΊ.
ΠΠ΅ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠ΅Π΅ΡΡ ΡΡΠ΅Π½ΠΈΠ΅ (non-repeatable read) β ΠΏΡΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΌ ΡΡΠ΅Π½ΠΈΠΈ Π² ΡΠ°ΠΌΠΊΠ°Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΡΠ°Π½Π΅Π΅ ΠΏΡΠΎΡΠΈΡΠ°Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΠ½Π½ΡΠΌΠΈ.
Β«ΠΡΡΠ·Π½ΠΎΠ΅Β» ΡΡΠ΅Π½ΠΈΠ΅ (dirty read) β ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ , Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΡ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΠ½Π½ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΈ Π½Π΅ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠ΄ΠΈΡΡΡ (ΠΎΡΠΊΠ°ΡΠΈΡΡΡ);
ΠΠΎΡΠ΅ΡΡΠ½Π½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ (lost update) β ΠΏΡΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° Π΄Π°Π½Π½ΡΡ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΠΌΠΈ ΡΠ΅ΡΡΡΡΡΡ Π²ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΠΊΡΠΎΠΌΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ.
ΠΠ½ΠΎΠΌΠ°Π»ΠΈΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ (serialization anomaly) β ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠΈΠΊΡΠ°ΡΠΈΠΈ Π³ΡΡΠΏΠΏΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΡ ΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ, Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½ΠΈΡ ΡΡΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ, Π΅ΡΠ»ΠΈ Π±Ρ ΠΎΠ½ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ.
- Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Π°Π½ΠΎΠΌΠ°Π»ΠΈΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ? ΠΠ»Ρ Π΄Π²ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ, ΡΠΊΠ°ΠΆΠ΅ΠΌ, A ΠΈ B, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π²Π° Π²Π°ΡΠΈΠ°Π½ΡΠ° ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½ΠΈΡ ΠΏΡΠΈ ΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ:
1οΈ. ΡΠ½Π°ΡΠ°Π»Π° A, Π·Π°ΡΠ΅ΠΌ B.
2οΈ. ΡΠ½Π°ΡΠ°Π»Π° B, Π·Π°ΡΠ΅ΠΌ A.
ΠΡΠΈΡΠ΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄Π²ΡΡ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΠΌΠΎΠ³ΡΡ Π² ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π΄Π²ΡΡ Π±Π°Π½ΠΊΠΎΠ²ΡΠΊΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ β Π²Π½Π΅ΡΠ΅Π½ΠΈΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΡΠΌΠΌΡ Π΄Π΅Π½Π΅Π³ Π½Π° ΡΡΠ΅Ρ ΠΈ Π½Π°ΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅Π½ΡΠΎΠ² ΠΏΠΎ ΡΡΠΎΠΌΡ ΡΡΠ΅ΡΡ β Π²Π°ΠΆΠ΅Π½ ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ.
ΠΡΠ»ΠΈ ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Π½Π° ΡΡΠ΅ΡΠ΅ Π±ΡΠ»ΠΎ $1000 ΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ Π±ΡΠ΄Π΅Ρ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΡΠΌΠΌΡ Π½Π° $1000, Π° Π²ΡΠΎΡΠΎΠΉ β Π½Π°ΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅Π½ΡΠΎΠ² (10%), ΡΠΎ ΡΠΎΠ³Π΄Π° ΠΈΡΠΎΠ³ΠΎΠ²Π°Ρ ΡΡΠΌΠΌΠ° Π±ΡΠ΄Π΅Ρ Π±ΠΎΠ»ΡΡΠ΅ ($2200), ΡΠ΅ΠΌ ΠΏΡΠΈ ΠΏΡΠΎΡΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ($2100).
ΠΡΠ»ΠΈ ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π² ΡΠ°ΠΌΠΊΠ°Ρ Π΄Π²ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ, ΡΠΎ ΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΈΡΠΎΠ³ΠΎΠ²ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ, Π·Π°Π²ΠΈΡΡΡΠΈΠ΅ ΠΎΡ ΠΏΠΎΡΡΠ΄ΠΊΠ° ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
Π‘Π΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄Π²ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ΠΏΡΠΈ ΠΈΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΈΠ· Π΄Π²ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½ΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ΠΏΡΠΈ ΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ. Π’ΠΎ Π΅ΡΡΡ ΠΌΡ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π»ΠΈΠ±ΠΎ $2100 Π»ΠΈΠ±ΠΎ $2200 - ΠΈ Π½ΠΈΠΊΠ°ΠΊ ΠΈΠ½Π°ΡΠ΅. Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, Π°Π½ΠΎΠΌΠ°Π»ΠΈΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ β ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ².
ΠΡΠΈ ΡΡΠΎΠΌ Π½Π΅Π»ΡΠ·Ρ ΡΠΊΠ°Π·Π°ΡΡ ΡΠΎΡΠ½ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² Π±ΡΠ΄Π΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½.
ΠΡΠ»ΠΈ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΠΈΡΡ ΡΡΠΈ ΡΠ°ΡΡΡΠΆΠ΄Π΅Π½ΠΈΡ Π½Π° ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ, ΡΠΎΠ³Π΄Π° ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΈΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠ°ΠΊΠΈΠΌ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ½ Π±ΡΠ» Π±Ρ Π² ΡΠ»ΡΡΠ°Π΅ Π²ΡΠ±ΠΎΡΠ° Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠ° ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½ΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ, Π΅ΡΠ»ΠΈ Π±Ρ ΠΎΠ½ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΎΠ΄Π½Π° Π·Π° Π΄ΡΡΠ³ΠΎΠΉ.
ΠΠΎΠ½Π΅ΡΠ½ΠΎ, ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ, ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΠΈΡ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½ΠΈΡ. ΠΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π΅ ΠΏΡΠ΅Π΄ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π²ΡΠ±ΠΎΡΠ° ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠ°. Π Π΅ΡΡ ΠΈΠ΄ΡΡ Π»ΠΈΡΡ ΠΎΠ± ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Π½ΠΈΡ .
Π£ΡΠΎΠ²Π½ΠΈ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ
ΠΠ»Ρ Π±ΠΎΡΡΠ±Ρ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ, ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅ΠΌΡΠΌΠΈ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠΌ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ β ΡΡΠΎΠ²Π½ΠΈ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ - ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ, Π²ΡΠ±ΠΎΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΊΠΎΡΠΎΡΡΡΡ ΡΠ°Π±ΠΎΡΡ ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΠΈ Π΄Π°Π½Π½ΡΡ , Ρ. ΠΊ. ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π² Π‘Π£ΠΠ Π²ΡΠ΅Π³Π΄Π° Π΄ΠΎΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π΅ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ , ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°ΠΉΡΠΈ Π±Π°Π»Π°Π½Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ΠΈ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡΡ Π΄Π°Π½Π½ΡΡ .
Π‘ΡΠ°Π½Π΄Π°ΡΡ SQL-92 ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠΊΠ°Π»Ρ ΠΈΠ· ΡΠ΅ΡΡΡΡΡ ΡΡΠΎΠ²Π½Π΅ΠΉ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ: Read uncommitted, Read committed, Repeatable read, Serializable. ΠΠ΅ΡΠ²ΡΠΉ ΠΈΠ· Π½ΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΠΌΡΠΌ ΡΠ»Π°Π±ΡΠΌ, ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ β ΡΠ°ΠΌΡΠΌ ΡΠΈΠ»ΡΠ½ΡΠΌ, ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ Π²ΡΠ΅ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅.
Read uncommitted (ΡΡΠ΅Π½ΠΈΠ΅ Π½Π΅Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ )
ΠΠΈΠ·ΡΠΈΠΉ (ΠΏΠ΅ΡΠ²ΡΠΉ) ΡΡΠΎΠ²Π΅Π½Ρ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ. ΠΡΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ ΠΏΡΡΠ°ΡΡΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ ΡΡΡΠΎΠΊΡ ΡΠ°Π±Π»ΠΈΡΡ, ΡΠΎ Π² ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅ ΡΡΡΠΎΠΊΠ° Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌ Π½Π°Π±ΠΎΡΠΎΠΌ ΡΡΠΏΠ΅ΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π½ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ. ΠΡΠΈ ΡΡΠΎΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ , Π½ΠΎ ΠΈ Π΄Π°Π½Π½ΡΡ , ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΊΠΎΡΠΎΡΡΡ Π΅ΡΡ Π½Π΅ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Ρ, Ρ. ΠΊ. ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΠ΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ΅Π½ΠΈΠ΅, ΠΏΡΠΈ Π΄Π°Π½Π½ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΡΡΡΡΡ. ΠΠ°Π½Π½ΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΡΡΡΡΡ Π½Π° Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π·Π°ΠΏΠΈΡΠΈ, ΡΡΠΎ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΈΡ ΠΈ ΡΠ΅Ρ ΠΆΠ΅ ΡΡΡΠΎΠΊ, Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΠ΅ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ, ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΈ Π½ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π½Π΅ ΠΏΠΎΡΠ΅ΡΡΠ΅ΡΡΡ.
Read committed (ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ )
ΠΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ Π‘Π£ΠΠ, Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, Microsoft SQL Server, PostgreSQL ΠΈ Oracle, ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠΎΡ ΡΡΠΎΠ²Π΅Π½Ρ. ΠΠ° ΡΡΠΎΠΌ ΡΡΠΎΠ²Π½Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΡΡ Π·Π°ΡΠΈΡΠ° ΠΎΡ ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΡ
Π΄Π°Π½Π½ΡΡ
, ΡΠ΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ°Π±ΠΎΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π΄ΡΡΠ³Π°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½Π° ΠΈ ΡΠ΄Π΅Π»Π°Π½Π½ΡΠ΅ Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Ρ. Π ΠΈΡΠΎΠ³Π΅ ΠΏΠ΅ΡΠ²Π°Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π΄ΡΡΠ³ΠΈΠΌ Π½Π°Π±ΠΎΡΠΎΠΌ Π΄Π°Π½Π½ΡΡ
.
ΠΠ΅ΡΠΎΠ΄ read committed ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ Π»ΠΈΠ±ΠΎ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π΄Π°Π½Π½ΡΡ
Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π·Π°ΠΏΠΈΡΠΈ (ΡΠ΅ΡΡΠ΅ΠΌ Π²ΡΠ΅ΠΌΡ), Π»ΠΈΠ±ΠΎ Π½Π° Ρ
ΡΠ°Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠΏΠΈΠΈ Π΄Π°Π½Π½ΡΡ
, ΡΠ½ΡΡΠΎΠΉ Π΄ΠΎ Π½Π°ΡΠ°Π»Π° Π·Π°ΠΏΠΈΡΠΈ (ΡΠ΅ΡΡΠ΅ΠΌ ΠΠΠ£).
Repeatable read (ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠ΅Π΅ΡΡ ΡΡΠ΅Π½ΠΈΠ΅)
Π£ΡΠΎΠ²Π΅Π½Ρ, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠΈΡΠ°ΡΡΠ°Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ , ΠΏΡΠΎΡΠΈΡΠ°Π½Π½ΡΡ Π΅Ρ ΡΠ°Π½Π΅Π΅. ΠΡΠΈ ΡΡΠΎΠΌ Π½ΠΈΠΊΠ°ΠΊΠ°Ρ Π΄ΡΡΠ³Π°Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ Π΄Π°Π½Π½ΡΠ΅, ΡΠΈΡΠ°Π΅ΠΌΡΠ΅ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠ΅ΠΉ, ΠΏΠΎΠΊΠ° ΡΠ° Π½Π΅ ΠΎΠΊΠΎΠ½ΡΠ΅Π½Π°.
Serializable (ΡΠΏΠΎΡΡΠ΄ΠΎΡΠΈΠ²Π°Π½ΠΈΠ΅)
Π‘Π°ΠΌΡΠΉ Π²ΡΡΠΎΠΊΠΈΠΉ ΡΡΠΎΠ²Π΅Π½Ρ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΡΡΠΈ; ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΈΠ·ΠΎΠ»ΠΈΡΡΡΡΡΡ Π΄ΡΡΠ³ ΠΎΡ Π΄ΡΡΠ³Π°, ΠΊΠ°ΠΆΠ΄Π°Ρ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ Π±ΡΠ΄ΡΠΎ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ. Π’ΠΎΠ»ΡΠΊΠΎ Π½Π° ΡΡΠΎΠΌ ΡΡΠΎΠ²Π½Π΅ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π½Π΅ ΠΏΠΎΠ΄Π²Π΅ΡΠΆΠ΅Π½Ρ ΡΡΡΠ΅ΠΊΡΡ Β«ΡΠ°Π½ΡΠΎΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠ΅Π½ΠΈΡΒ».
<style> table th:first-of-type { width: 20%; } table th:nth-of-type(2) { width: 20%; } table th:nth-of-type(3) { width: 20%; } table th:nth-of-type(4) { width: 20%; } table th:nth-of-type(5) { width: 20%; } </style>Π£ΡΠΎΠ²Π΅Π½Ρ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ | Π€Π°Π½ΡΠΎΠΌΠ½ΠΎΠ΅ ΡΡΠ΅Π½ΠΈΠ΅ | ΠΠ΅ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠ΅Π΅ΡΡ ΡΡΠ΅Π½ΠΈΠ΅ | Β«ΠΡΡΠ·Π½ΠΎΠ΅Β» ΡΡΠ΅Π½ΠΈΠ΅ | ΠΠΎΡΠ΅ΡΡΠ½Π½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ |
---|---|---|---|---|
ΠΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ | + | + | + | + |
Read uncommitted | + | + | + | - |
Read committed | + | + | - | - |
Repeatable read | + | - | - | - |
Serializable | - | - | - | - |
- ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΡΠΎΠΌΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΡΡΠΎΠ²Π½Π΅ΠΉ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π‘Π£ΠΠ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π΄Π°Π½Π½ΡΡ ΠΊΠ°ΠΊ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΡΡΠΎΠΊ, ΡΠ°ΠΊ ΠΈ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΠ΅Π»ΡΡ ΡΠ°Π±Π»ΠΈΡ.
ΠΠΎΠΌΠ°Π½Π΄Π° SELECT ΠΈΠΌΠ΅Π΅Ρ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ FOR UPDATE, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ ΡΠ°Π±Π»ΠΈΡΡ Ρ ΡΠ΅Π»ΡΡ ΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ.
ΠΡΠ»ΠΈ ΠΎΠ΄Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π»Π° ΡΡΡΠΎΠΊΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, ΡΠΎΠ³Π΄Π° ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π½Π΅ ΡΠΌΠΎΠ³ΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΈ ΠΆΠ΅ ΡΡΡΠΎΠΊΠΈ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΏΠ΅ΡΠ²Π°Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π½Π΅ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ, ΠΈ ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ½ΡΡΠ°.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π΅ΡΠ»ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π΄Π°Π½Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
SELECT * FROM table_tame WHERE column_name ~ 'some text' FOR UPDATE; Π½Π° Π΄Π²ΡΡ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π°Ρ β ΡΠ½Π°ΡΠ°Π»Π° Π½Π° ΠΎΠ΄Π½ΠΎΠΌ β Π° Π·Π°ΡΠ΅ΠΌ Π½Π° Π²ΡΠΎΡΠΎΠΌ (Ρ ΡΡΠ΅ΡΠΎΠΌ Π½Π°ΡΠ°Π»Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ BEGIN)
Π’ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π²ΡΠΎΡΠΎΠΌ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π΅ ΠΏΡΠΈΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π°
ΠΡΠΈ ΡΡΠΎΠΌ Π΅ΡΠ»ΠΈ Π½Π° ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΊΠ°ΠΊΡΡ-Π½ΠΈΠ±ΡΠ΄Ρ Π΄ΡΡΠ³ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
UPDATE table_name SET column_name = 'kek' WHERE column_value = 404; Π’ΠΎ, ΠΏΠ΅ΡΠ΅ΠΉΠ΄Ρ Π½Π° Π²ΡΠΎΡΠΎΠΉ ΡΠ΅ΡΠΌΠΈΠ½Π°Π» ΡΡΠ°Π½Π΅Ρ Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΡΠ°ΠΌ Π±ΡΠ»Π°, Π½Π°ΠΊΠΎΠ½Π΅Ρ, Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π° Π²ΡΠ±ΠΎΡΠΊΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ ΡΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Ρ ΡΡΠ΅ΡΠΎΠΌ Π΄Π°Π½Π½ΠΎΠΉ UPDATE-ΠΊΠΎΠΌΠ°Π½Π΄Ρ.
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° N + 1
SQL-ΠΈΠ½ΡΠ΅ΠΊΡΠΈΠΈ
NoSQL
Π‘Π°ΠΌΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅ Π½Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ - ΡΠ°ΡΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅. ΠΡΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ NoSQL ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅Π»ΡΡΠΈΠΎΠ½Π½ΡΠΌΠΈ DB.
Π¨Π°ΡΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ, ΡΡΠΎ Π²Π°ΡΠΈ Π΄Π°Π½Π½ΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ³ΡΡΠΏΠΏΠΈΡΠΎΠ²Π°ΡΡ Π² Π½Π΅ΠΏΠ΅ΡΠ΅ΡΠ΅ΠΊΠ°ΡΡΠΈΠ΅ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±ΠΎΠΉ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°, ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°ΡΠ΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π·Π»ΠΎΠΆΠΈΡΡ ΠΏΠΎ ΡΠ°Π·Π½ΡΠΌ ΡΠ·Π»Π°ΠΌ, Π΅ΡΠ»ΠΈ Π½Π°Π΄ΠΎ. ΠΠ»Ρ NoSQL ΡΡΠΎ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ - ΡΠ°ΠΌ ΡΠ²ΡΠ·Π΅ΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π±Π»ΠΈΡΠ°ΠΌΠΈ Π½Π΅Ρ, ΠΊΠ°ΠΆΠ΄ΡΡ ΡΠ°Π±Π»ΠΈΡΡ ΡΡΠ»ΠΎΠ²Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π·Π΄Π΅ΡΠΈΠ±Π°Π½ΠΈΡΡ Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΠΎ ΠΏΠΎ Π»ΡΠ±ΠΎΠΌΡ Π½Π°Π±ΠΎΡΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ Π²Π°ΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ, ΠΈ ΡΠ°Π·Π±ΡΠΎΡΠ°ΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΏΠΎ Π½ΡΠΆΠ½ΠΎΠΌΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΡ ΡΠ·Π»ΠΎΠ². Π£ ΡΠ΅Π»ΡΡΠΈΠΎΠ½ΠΎΠΊ ΠΆΠ΅ ΡΠ°Π±Π»ΠΈΡΡ ΡΠ²ΡΠ·Π°Π½Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±ΠΎΠΉ, ΠΈ Π΅ΡΠ»ΠΈ Π²Ρ ΠΊΠ°ΠΊΡΡ-ΡΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΠ°Π±Π»ΠΈΡΡ Π΄Π°Π½Π½ΡΡ ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ, ΡΠΎ Π²ΡΠ΅ Π΅Ρ "ΡΠ°ΡΠ΄Ρ" Π²ΡΡ ΡΠ°Π²Π½ΠΎ Π±ΡΠ΄ΡΡ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° ΠΎΠ΄Π½ΠΈ ΠΈ ΡΠ΅ ΠΆΠ΅ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ. ΠΠΎΡΡΠΎΠΌΡ ΠΏΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΠΌ Π½ΠΎΠ΄Π°ΠΌ ΡΠ°ΠΊΡΡ ΡΡΡΡΠΊΡΡΡΡ ΡΠ°ΡΠΊΠΈΠ΄Π°ΡΡ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ... Π½Ρ Π° ΡΠ°Π· ΡΠ°ΠΊ, Π½Π°Π·ΡΠ²Π°ΡΡ ΠΌΡ ΡΡΠΎ Π±ΡΠ΄Π΅ΠΌ Π½Π΅ ΡΠ°ΡΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, Π° ΠΏΠ°ΡΡΠΈΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ.
Π―Π·ΡΠΊ SQL
SQL - Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΡΠΉ (ΠΎΠΏΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΉ, Π½Π΅ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ½ΡΠΉ) ΡΠ·ΡΠΊ, ΡΡΠ°Π½Π΄Π°ΡΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ Π²ΠΎ Π²ΡΠ΅Ρ
ΡΠ΅Π»ΡΡΠΈΠΎΠ½Π½ΡΡ
Π‘Π£ΠΠ.
ΠΠΏΠ΅ΡΠ°ΡΠΎΡΡ SQL ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎ Π΄Π΅Π»ΡΡ Π½Π°:
ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ
(data definition language, DDL),
ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½ΡΠΌΠΈ (data manipulation language, DML),
ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡΠΌΠΈ Π΄ΠΎΡΡΡΠΏΠ° (data control language, DCL) ΠΈ
ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΠΌΠΈ (transaction control language, TCL).
DDL
CREATE, ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ
Constraints (ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ)
Constraints ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΠ°Π±Π»ΠΈΡΡ. ΠΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Ρ ΡΠ°Π½ΠΈΡΡΡΡ Π² ΡΠ°Π±Π»ΠΈΡΠ΅. ΠΡΠΈ Π½Π°ΡΡΡΠ΅Π½ΠΈΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Ρ Π½Π΅ Π±ΡΠ΄ΡΡ.
UNIQUE β Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π² ΡΡΠΎΠ»Π±ΡΠ΅;
NOT NULL β Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ NULL;
INDEX β ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΡ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ Π΄Π»Ρ Π±ΡΡΡΡΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ°/Π·Π°ΠΏΡΠΎΡΠΎΠ²;
CHECK β Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠ»Π±ΡΠ° Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ Π·Π°Π΄Π°Π½Π½ΡΠΌ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌ;
DEFAULT β Π½Π°Π·Π½Π°ΡΠ°Π΅Ρ ΡΡΠΎΠ»Π±ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ.
ALTER, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ ΡΠ°Π±Π»ΠΈΡΡ
RENAME
DROP, ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡΡ
PRIMARY KEY, ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΡΠΉ ΠΊΠ»ΡΡ
ΠΠ΅ΡΠ²ΠΈΡΠ½ΡΠΉ ΠΊΠ»ΡΡ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΡΠΎΠ³ΠΎ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΌ, Π΄Π²Π΅ Π·Π°ΠΏΠΈΡΠΈ ΡΠ°Π±Π»ΠΈΡΡ Π½Π΅ ΠΌΠΎΠ³ΡΡ ΠΈΠΌΠ΅ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ°. ΠΡΠ»Π΅Π²ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ (NULL) Π² PRIMARY KEY Π½Π΅ Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡΡΡ. ΠΡΠ»ΠΈ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ PRIMARY KEY ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ»Π΅ΠΉ, ΠΈΡ Π½Π°Π·ΡΠ²Π°ΡΡ ΡΠΎΡΡΠ°Π²Π½ΡΠΌ ΠΊΠ»ΡΡΠΎΠΌ.
CREATE TABLE USERS (
id INT NOT NULL,
name VARCHAR (40) NOT NULL,
PRIMARY KEY (id)
);
FOREIGN KEY, Π²Π½Π΅ΡΠ½ΠΈΠΉ ΠΊΠ»ΡΡ
TRUNCATE
DML
WHERE ΠΈ HAVING ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ Π·Π°ΠΏΡΠΎΡΠ΅, ΠΏΡΠΈ ΡΡΠΎΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ SQL Π·Π°ΠΏΡΠΎΡΠ°:
- FROM
- ON
- JOIN
- WHERE
- GROUP BY
- WITH CUBE / WITH ROLLUP
- HAVING
- ΠΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
- SELECT
- DISTINCT
- UNION / UNION ALL / INTERSECT / EXCEPT
- ORDER BY
- TOP / LIMIT / OFFSET
Π‘Π½Π°ΡΠ°Π»Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠ°Π±Π»ΠΈΡΠ°, ΠΈΠ· ΠΊΠΎΡΠΎΡΠΎΠΉ Π²ΡΠ±ΠΈΡΠ°ΡΡΡΡ Π΄Π°Π½Π½ΡΠ΅ (FROM); Π·Π°ΡΠ΅ΠΌ ΠΈΠ· ΡΡΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ ΠΎΡΠ±ΠΈΡΠ°ΡΡΡΡ Π·Π°ΠΏΠΈΡΠΈ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ΠΌ WHERE; Π²ΡΠ±ΡΠ°Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π°Π³ΡΠ΅Π³ΠΈΡΡΡΡΡΡ (GROUP BY); ΠΈΠ· Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π²ΡΠ±ΠΈΡΠ°ΡΡΡΡ ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡ ΡΡΠ»ΠΎΠ²ΠΈΡ ΠΏΠΎΡΠ»Π΅ HAVING. Π’ΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΌ ΡΠΎΡΠΌΠΈΡΡΡΡΡΡ Π΄Π°Π½Π½ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠ΅ΠΉ Π²ΡΠ±ΠΎΡΠΊΠΈ, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠΊΠ°Π·Π°Π½ΠΎ ΠΏΠΎΡΠ»Π΅ SELECT (Π²ΡΡΠΈΡΠ»ΡΡΡΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°ΡΡΡΡ ΠΈΠΌΠ΅Π½Π° ΠΈ ΠΏΡ.). Π Π΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠ°Ρ Π²ΡΠ±ΠΎΡΠΊΠ° ΡΠΎΡΡΠΈΡΡΠ΅ΡΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ΠΌ, ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌ ΠΏΠΎΡΠ»Π΅ ORDER BY.
ΠΠ½Π°Π½ΠΈΠ΅ ΠΏΠΎΡΡΠ΄ΠΊΠ° ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ SQL Π·Π°ΠΏΡΠΎΡΠ° Π²Π°ΠΆΠ½ΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π²Π½ΡΡΡΠΈ WHERE Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠΌΠ΅Π½Π° Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ· SELECT; ΠΏΡΠΎΡΡΠΎ SELECT Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠΌ ΠΏΠΎΠ·ΠΆΠ΅, ΡΠ΅ΠΌ WHERE, ΠΏΠΎΡΡΠΎΠΌΡ Π΅ΠΌΡ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΠΊΠ°ΠΊΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΎ.
SELECT, FROM, WHERE
ΠΠΎΠΌΠ°Π½Π΄Π° SELECT ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π·Π°ΠΏΠΈΡΠΈ ΠΈΠ· Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ ΠΏΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡ ΡΡΠ»ΠΎΠ²ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π·Π°Π΄Π°Π΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ WHERE.
Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ:
SELECT * FROM ΠΈΠΌΡ_ΡΠ°Π±Π»ΠΈΡΡ;
SELECT * FROM ΠΈΠΌΡ_ΡΠ°Π±Π»ΠΈΡΡ WHERE ΡΡΠ»ΠΎΠ²ΠΈΠ΅;
SELECT ΠΏΠΎΠ»Π΅1, ΠΏΠΎΠ»Π΅2... FROM ΠΈΠΌΡ_ΡΠ°Π±Π»ΠΈΡΡ WHERE ΡΡΠ»ΠΎΠ²ΠΈΠ΅;
ΠΠΎΠ»Π½ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ SELECT:
SELECT
[STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] [HIGH_PRIORITY]
[DISTINCT | DISTINCTROW | ALL]
select_expression,...
[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
[FROM table_references
[WHERE where_definition]
[GROUP BY {unsigned_integer | col_name | formula} [ASC | DESC], ...]
[HAVING where_definition]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC], ...]
[LIMIT [offset,] rows | rows OFFSET offset]
[PROCEDURE procedure_name(argument_list)]
[FOR UPDATE | LOCK IN SHARE MODE]]
LIKE
ORDER BY
Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° Π΄Π°Π½Π½ΡΡ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ Π²ΠΎΠ·ΡΠ°ΡΡΠ°Π½ΠΈΡ (ASC) ΠΈΠ»ΠΈ ΡΠ±ΡΠ²Π°Π½ΠΈΡ (DESC).
SELECT * FROM user ORDER BY name DESC;
COUNT, SUM, AVG, MAX, MIN, Π°Π³ΡΠ΅Π³ΠΈΡΡΡΡΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
GROUP BY, HAVING, Π³ΡΡΠΏΠΏΠΈΡΠΎΠ²ΠΊΠ° ΠΈ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ
JOIN, ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ°Π±Π»ΠΈΡ
INNER JOIN
ΠΡΠ»ΠΈ ΡΠΎΠ²ΡΠ΅ΠΌ ΠΊΡΠ°ΡΠΊΠΎ, ΡΠΎ INNER JOIN Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ², ΠΊΠ°ΠΊ Π½Π°ΡΠΈΡΠΎΠ²Π°Π½ΠΎ, Π°, ΡΠΊΠΎΡΠ΅Π΅, ΠΏΠ΅ΡΠ΅ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ΠΌ.
FULL OUTER JOIN
LEFT JOIN
RIGHT JOIN
CROSS JOIN, ΠΏΠ΅ΡΠ΅ΠΊΡΠ΅ΡΡΠ½ΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅
Π‘ΠΎΠ·Π΄Π°Π΅Ρ Π½Π°Π±ΠΎΡ ΡΡΡΠΎΠΊ, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Π°Ρ ΡΡΡΠΎΠΊΠ° ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅ΡΡΡ Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠΎΠΉ ΠΈΠ· Π²ΡΠΎΡΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ.
Self join
Π’Π°ΠΊΠΎΠΉ Π²ΠΎΠΏΡΠΎΡ ΡΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠ·Π²ΡΡΠ°ΡΡ Π½Π° ΡΠΎΠ±Π΅ΡΠ΅Π΄ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠΎ SQL. ΠΡΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ°Π±Π»ΠΈΡΠ° ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΠ»Π°ΡΡ ΡΠ°ΠΌΠ° Ρ ΡΠΎΠ±ΠΎΠΉ, ΡΠ»ΠΎΠ²Π½ΠΎ ΡΡΠΎ Π΄Π²Π΅ ΡΠ°Π·Π½ΡΠ΅ ΡΠ°Π±Π»ΠΈΡΡ. Π§ΡΠΎΠ±Ρ ΡΠ°ΠΊΠΎΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ, ΠΎΠ΄Π½Π° ΠΈΠ· ΡΠ°ΠΊΠΈΡ Β«ΡΠ°Π±Π»ΠΈΡΒ» Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²ΡΠ²Π°Π΅ΡΡΡ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ SQL-Π·Π°ΠΏΡΠΎΡ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π³ΠΎΡΠΎΠ΄Π°:
SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City
FROM Customers A, Customers B
WHERE A.CustomerID <> B.CustomerID
AND A.City = B.City
ORDER BY A.City;
INSERT, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΡΡ ΡΡΡΠΎΠΊ
UPDATE, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΡΡΡΠΎΠΊ
DELETE, ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΡΡΠΎΠΊ
ΠΠΏΠ΅ΡΠ°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ΄Π°Π»ΡΠ΅Ρ Π·Π°ΠΏΠΈΡΠΈ ΠΈΠ· ΡΠ°Π±Π»ΠΈΡΡ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡ ΡΡΠ»ΠΎΠ²ΠΈΡ. ΠΡΠΈ ΡΡΠΎΠΌ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π»ΠΎΠ³ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ, ΡΠΎ Π΅ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΌΠ΅Π½ΠΈΡΡ.
DELETE FROM table_name WHERE condition;
FROM
SET
ΠΠ»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ
SQL ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ. ΠΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΉ Π·Π°ΠΏΡΠΎΡ β ΡΡΠΎ Π·Π°ΠΏΡΠΎΡ, ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Π½ΡΠΉ Π²Π½ΡΡΡΠΈ Π΄ΡΡΠ³ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° SQL.
ΠΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΉ Π·Π°ΠΏΡΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π²ΡΠ±ΠΎΡΠΊΠΈ Π΄Π°Π½Π½ΡΡ
, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π² ΡΡΠ»ΠΎΠ²ΠΈΠΈ ΠΎΡΠ±ΠΎΡΠ° Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ°. ΠΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π΄Π»Ρ:
ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ°;
ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΎΠ³ΠΎ, Π²ΠΊΠ»ΡΡΠ΅Π½ΠΎ Π»ΠΈ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ°;
ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΎΠ³ΠΎ, Π²ΡΠ±ΠΈΡΠ°Π΅Ρ Π»ΠΈ Π·Π°ΠΏΡΠΎΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ.
ΠΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΉ Π·Π°ΠΏΡΠΎΡ ΠΈΠΌΠ΅Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ:
ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ SELECT, ΠΏΠΎΡΠ»Π΅ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ ΠΈΠΌΠ΅Π½Π° ΡΡΠΎΠ»Π±ΡΠΎΠ² ΠΈΠ»ΠΈ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ (ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠΏΠΈΡΠΎΠΊ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΎΠ΄ΠΈΠ½ ΡΠ»Π΅ΠΌΠ΅Π½Ρ),
ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ FROM ΠΈ ΠΈΠΌΡ ΡΠ°Π±Π»ΠΈΡΡ, ΠΈΠ· ΠΊΠΎΡΠΎΡΠΎΠΉ Π²ΡΠ±ΠΈΡΠ°ΡΡΡΡ Π΄Π°Π½Π½ΡΠ΅,
Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ WHERE,
Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ GROUP BY,
Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ HAVING.
Π Π°Π±ΠΎΡΠ° Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΠΌΠΈ ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΠΌΠΈ
ΠΠ½Π΄Π΅ΠΊΡΡ ΠΠ½Π΄Π΅ΠΊΡ β ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½Π°Ρ ΡΡΡΡΠΊΡΡΡΠ° Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ²ΡΠ·Π°Π½Π° Ρ ΡΠ°Π±Π»ΠΈΡΠ΅ΠΉ ΠΈ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π΅Ρ Π΄Π°Π½Π½ΡΡ . ΠΠ½Π΄Π΅ΠΊΡΡ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ .
ΠΠ°ΠΊΠΈΠ΅ Π±ΡΠ²Π°ΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΡ?
Π-Π΄Π΅ΡΠ΅Π²ΠΎ
Ρ Π΅Ρ
GiST
SP-GiST
GIN
BRIN
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° CREATE INDEX ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΡ ΡΠΈΠΏΠ° Π-Π΄Π΅ΡΠ΅Π²ΠΎ (ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Ρ Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ»ΡΡΠ°Π΅Π²)
ΠΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΡ?
πΉ ΠΠ½Π΄Π΅ΠΊΡ ΠΏΠΎ ΡΡΠΎΠ»Π±ΡΡ (ΡΡΠΎ ΡΠΈΡΡΠ°Ρ ΠΊΠ»Π°ΡΡΠΈΠΊΠ°)
πΉ ΠΠ½Π΄Π΅ΠΊΡ ΠΏΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ ΡΡΠΎΠ»Π±ΡΠ°ΠΌ
πΉ Π£Π½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ½Π΄Π΅ΠΊΡ
πΉ ΠΠ½Π΄Π΅ΠΊΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ
πΉ Π§Π°ΡΡΠΈΡΠ½ΡΠΉ ΠΈΠ½Π΄Π΅ΠΊΡ
ΠΠ»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊΠΎΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ:
CREATE [UNIQUE] INDEX <index_name> ON <table_name> ( <column_name>, ... ) [STATEMENT] ; ΠΡΠΈ ΡΡΠΎΠΌ:
Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠ»ΠΎΠ²ΠΎ UNIQUE
Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Π΅Π³ΠΎ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π² ΡΠΊΠΎΠ±ΠΊΠ°Ρ , Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠ° Π½Π° Π½ΠΈΠΆΠ½ΠΈΠΉ ΡΠ΅Π³ΠΈΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ°ΠΊ:
. . . ( lower( <column_name> ) ) ; Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ°ΡΡΠΈΡΠ½ΠΎΠ³ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΏΠΎΡΠ»Π΅ ΡΠΊΠΎΠ±ΠΎΠΊ Π·Π°ΠΏΠΈΡΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π° Π²Π΅Π»ΠΈΡΠΈΠ½Ρ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ°ΠΊ:
. . . ( . . . ) WHERE <column_name> > 1000 ;
ΠΎΠΏΡΠΎΡΡ Π½Π° ΡΠΎΠ±Π΅ΡΠ΅Π΄ΠΎΠ²Π°Π½ΠΈΡΡ ΠΎΡΠ΅Π½Ρ ΡΠ°ΡΡΠΎ Π±Π΅ΡΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΡΠΎΡΡΠΎ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π²ΠΎΠΏΡΠΎΡΠ°ΡΡΠ΅ΠΌΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ ΡΠ΅ΠΉΡΠ°Ρ ΠΏΡΠΈΡΠ»ΠΎ Π² Π³ΠΎΠ»ΠΎΠ²Ρ, ΠΈ ΠΎΠ½ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ ΡΠ°ΠΊΡ, ΡΡΠΎ ΡΠ°ΠΌ ΡΠΌΠ΅Π΅Ρ ΡΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ ΠΎ Π³Π»Π°Π²Π½ΠΎΠΌ, Π° Π½Π΅ Π²ΡΠΎΡΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎΠΌ. ΠΡΠΈΠ²Π΅Π΄Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΈΠΌΠ΅Ρ Ρ Π²Π°Ρ - ΠΏΡΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡ. ΠΠ°Ρ, Π²ΠΈΠ΄ΠΈΠΌΠΎ, ΡΠΏΡΠ°ΡΠΈΠ²Π°Π»ΠΈ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ½ΠΈ Π±ΡΠ²Π°ΡΡ ΠΈ ΠΊΠ°ΠΊΠΈΠΌ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠΎΠΌ ΡΠΎΠ·Π΄Π°ΡΡΡΡ. ΠΠΎ ΠΏΠΎΠ²Π΅ΡΡΡΠ΅, ΡΡΠΎ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ ΡΠ°ΠΌΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΈΠ· ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΡΡΠΎΠΈΡ Π·Π½Π°ΡΡ ΠΏΡΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΡ. ΠΠΎΡΠ°Π·Π΄ΠΎ Π²Π°ΠΆΠ½Π΅Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ ΠΈΡ ΡΡΡΡ, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΈΠ· ΡΠ΅Π±Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ Π²Π½ΡΡΡΠΈ - ΡΡΠΎΠ±Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Π·Π°ΠΏΡΠΎΡ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠΌ ΡΡΠΊΠΎΡΡΠ΅ΡΡΡ, Π° ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Π½Π΅Ρ.
ΠΠ·ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ² Π΄Π»Ρ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΡ ΠΏΠΎΠΈΡΠΊΠ° Π΄Π°Π½Π½ΡΡ
Π² ΡΠ°Π±Π»ΠΈΡΠ΅
ΠΠ·ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ Π΄Π»Ρ Π·Π°ΡΠΈΡΡ Π΄Π°Π½Π½ΡΡ
ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΠΈ ΡΠ°Π±Π»ΠΈΡΡ
Π Π°Π±ΠΎΡΠ° Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡΠΌΠΈ ΠΈ Ρ
ΡΠ°Π½ΠΈΠΌΡΠΌΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ°ΠΌΠΈ
ΠΠ·ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ
ΡΠ°Π±Π»ΠΈΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π·Π°ΠΏΡΠΎΡΠΎΠ²
ΠΠ·ΡΡΠ΅Π½ΠΈΠ΅ Ρ
ΡΠ°Π½ΠΈΠΌΡΡ
ΠΏΡΠΎΡΠ΅Π΄ΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ
ΡΡΠ½ΠΊΡΠΈΠΉ ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²
ΠΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΠ΅ SQL ΡΠΊΠΈΠ»Π»Ρ:
MVCC
ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² - Π·Π½Π°Π½ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ ΡΠ°Π±Π»ΠΈΡ ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ², Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π·Π°ΠΏΡΠΎΡΡ Π΄Π»Ρ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ.
Π Π°Π±ΠΎΡΠ° Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΌΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ
- ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΡΡΠΈΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, ΠΊΠ»Π°ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Π±ΠΎΠ»ΡΡΠΈΡ
ΠΎΠ±ΡΠ΅ΠΌΠΎΠ² Π΄Π°Π½Π½ΡΡ
.
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π°Π½Π°Π»ΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΡΠ½ΠΊΡΠΈΠΉ - ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ, ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ RANK, ROW_NUMBER, LAG ΠΈ LEAD, Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ»ΠΎΠΆΠ½ΡΡ
Π°Π½Π°Π»ΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ
Π·Π°ΠΏΡΠΎΡΠΎΠ².
Π Π°Π±ΠΎΡΠ° Ρ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ ΡΡΠ΄Π°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ
- ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
ΡΡΠ΄ΠΎΠ², ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ DATE_TRUNC, DATE_PART ΠΈ WINDOW ΡΡΠ½ΠΊΡΠΈΠΉ, Π΄Π»Ρ Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ ΡΡΠ΄Π°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ
.
Π Π°Π±ΠΎΡΠ° Ρ Π³Π΅ΠΎΠ³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ - ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ
ΡΡΠ½ΠΊΡΠΈΠΉ, ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ ST_Distance, ST_Within ΠΈ ST_Intersection, Π΄Π»Ρ Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π³Π΅ΠΎΠ³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ.
Π Π°Π±ΠΎΡΠ° Ρ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ
- ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ ETL (Extract, Transform, Load) Π΄Π»Ρ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ, ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π΄Π°Π½Π½ΡΡ
Π² Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π΄Π°Π½Π½ΡΡ
.
Π Π°Π±ΠΎΡΠ° Ρ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ°ΠΌΠΈ ΠΈ ΡΡΠΈΠ³Π³Π΅ΡΠ°ΠΌΠΈ - ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ°ΠΌΠΈ ΠΈ ΡΡΠΈΠ³Π³Π΅ΡΠ°ΠΌΠΈ Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ Π·Π°Π΄Π°Ρ ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΠΈ Π΄Π°Π½Π½ΡΡ
.
Π Π°Π±ΠΎΡΠ° Ρ ΡΠ΅Π»ΡΡΠΈΠΎΠ½Π½ΠΎΠΉ Π°Π»Π³Π΅Π±ΡΠΎΠΉ - ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ², ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ JOIN, UNION, INTERSECT ΠΈ EXCEPT, Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ»ΠΎΠΆΠ½ΡΡ
Π·Π°ΠΏΡΠΎΡΠΎΠ².
Π Π°Π±ΠΎΡΠ° Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΠΌΠΈ - ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΠΌΠΈ Π΄Π»Ρ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π·Π°ΠΏΡΠΎΡΠΎΠ².
Π Π°Π±ΠΎΡΠ° Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡΡ Π΄Π°Π½Π½ΡΡ
- ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΠΊ Π΄Π°Π½Π½ΡΠΌ ΠΈ Π·Π°ΡΠΈΡΡ Π΄Π°Π½Π½ΡΡ
ΠΎΡ Π½Π΅ΡΠ°Π½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ°.
ΠΠΊΠΎΠ½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
SQLite
Small. Fast. Reliable. Choose any three.
https://sqlite.org/index.html
https://github.com/sqlite/sqlite
https://habr.com/ru/post/149356/
https://github.com/sqlitebrowser/sqlitebrowser
Syntax Diagrams https://www.sqlite.org/syntaxdiagrams.html
Server-less database engine that stores each database into a separate file.
### Connect
**Opens a connection to the database file. Creates a new file if path doesn't exist.**
import sqlite3
<conn> = sqlite3.connect(<path>) # Also ':memory:'.
<conn>.close() # Closes the connection.
### Read
**Returned values can be of type str, int, float, bytes or None.**
<cursor> = <conn>.execute('<query>') # Can raise a subclass of sqlite3.Error.
<tuple> = <cursor>.fetchone() # Returns next row. Also next(<cursor>).
<list> = <cursor>.fetchall() # Returns remaining rows. Also list(<cursor>).
### Write
<conn>.execute('<query>') # Can raise a subclass of sqlite3.Error.
<conn>.commit() # Saves all changes since the last commit.
<conn>.rollback() # Discards all changes since the last commit.
#### Or:
with <conn>: # Exits the block with commit() or rollback(),
<conn>.execute('<query>') # depending on whether any exception occurred.
### Placeholders
* **Passed values can be of type str, int, float, bytes, None, bool, datetime.date or datetime.datetime.**
* **Bools will be stored and returned as ints and dates as [ISO formatted strings](#encode).**
<conn>.execute('<query>', <list/tuple>) # Replaces '?'s in query with values.
<conn>.execute('<query>', <dict/namedtuple>) # Replaces ':<key>'s with values.
<conn>.executemany('<query>', <coll_of_above>) # Runs execute() multiple times.
### Example
**Values are not actually saved in this example because `'conn.commit()'` is omitted!**
>>> conn = sqlite3.connect('test.db')
>>> conn.execute('CREATE TABLE person (person_id INTEGER PRIMARY KEY, name, height)')
>>> conn.execute('INSERT INTO person VALUES (NULL, ?, ?)', ('Jean-Luc', 187)).lastrowid
1
>>> conn.execute('SELECT * FROM person').fetchall()
[(1, 'Jean-Luc', 187)]
MySQL
Has a very similar interface, with differences listed below.
# $ pip3 install mysql-connector
from mysql import connector
<conn> = connector.connect(host=<str>, β¦) # `user=<str>, password=<str>, database=<str>`.
<cursor> = <conn>.cursor() # Only cursor has execute() method.
<cursor>.execute('<query>') # Can raise a subclass of connector.Error.
<cursor>.execute('<query>', <list/tuple>) # Replaces '%s's in query with values.
<cursor>.execute('<query>', <dict/namedtuple>) # Replaces '%(<key>)s's with values.
Memory View
-----------
* **A sequence object that points to the memory of another object.**
* **Each element can reference a single or multiple consecutive bytes, depending on format.**
* **Order and number of elements can be changed with slicing.**
* **Casting only works between char and other types and uses system's sizes and byte order.**
<mview> = memoryview(<bytes/bytearray/array>) # Immutable if bytes, else mutable.
<real> = <mview>[<index>] # Returns an int or a float.
<mview> = <mview>[<slice>] # Mview with rearranged elements.
<mview> = <mview>.cast('<typecode>') # Casts memoryview to the new format.
<mview>.release() # Releases the object's memory buffer.
PostgreSQL
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ PostgreSQL, ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠΈΠ΅ Π² Π΄ΡΡΠ³ΠΈΡ ΠΠ
ΠΠ°ΡΠΊΠ°Π΄Π½ΡΠ΅ ΡΡΠΈΠ³Π³Π΅ΡΡ. ΠΡΠ»ΠΈ ΡΡΠΈΠ³Π³Π΅ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ SQL, ΡΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΌΠΎΠ³ΡΡ Π·Π°Π½ΠΎΠ²ΠΎ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΡΡΠΈΠ³Π³Π΅ΡΡ.
hstore. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΈ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠΌΠΈ Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡΡ ΡΠ»ΠΎΠ²Π°ΡΡ (dictionary).
JSONB. ΠΠ°ΡΡΠΈΠ½Π³ JSON ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ΄Π½ΠΎΠΊΡΠ°ΡΠ½ΠΎ, Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π·Π°ΠΏΠΈΡΠΈ. ΠΠΎΠ»Π΅Π΅ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π°Ρ ΠΎΠ΄Π½ΠΎΠΊΡΠ°ΡΠ½Π°Ρ Π·Π°ΠΏΠΈΡΡ, Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ Π±ΡΡΡΡΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΡΠ΅ ΡΡΠ΅Π½ΠΈΡ. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ JSONB, Π° Π½Π΅ JSON.
Range Types. ΠΠΈΠΊΠ°ΠΊΠΈΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ planned_worktime_start ΠΈ planned_worktime_end ΠΈ ΠΏΠ»ΡΡΠΊΠΈ Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°ΠΌΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Π΄Π»Ρ Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π΄ΡΡΠ³ΠΈΡ ΡΡΡΠΎΠΊ, Ρ ΠΊΠΎΡΠΎΡΡΡ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π», Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡΠΉ ΡΡΠΈΠΌΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°ΠΌΠΈ ΠΏΠ΅ΡΠ΅ΡΠ΅ΠΊΠ°Π΅ΡΡΡ Ρ ΡΡΠΎΠΉ ΡΡΡΠΎΠΊΠΎΠΉ.
ΠΡΠΎΡΠΈΠ΅ Π½Π°ΡΠΈΠ²Π½ΡΠ΅ ΡΠΈΠΏΡ: interval, cidr ΠΈ Π΄ΡΡΠ³ΠΈΠ΅, ΡΠΎ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΌΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ ΡΠ°Π±ΠΎΡΡ Ρ Π½ΠΈΠΌΠΈ.
ΠΠ°ΡΡΠΈΠ²Ρ β Π½Π°ΡΡΡΠ΅Π½ΠΈΠ΅ 1-ΠΉ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΡΠΎΡΠΌΡ, Π½ΠΎ ΠΊΠΎΠ³Π΄Π° Π²ΡΡ, ΡΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ β ΡΡΠΎ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΠΎΡΠ΅ΠΊ, ΡΠΎ Π³ΠΎΡΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ Ρ ΠΏΠ΅ΡΡΠΏΠ΅ΠΊΡΠΈΠ²ΠΎΠΉ JOIN'Π° Ρ Π½Π΅ΠΉ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ΠΏΡΠΈΠ²Π»Π΅ΠΊΠ°ΡΠ΅Π»ΡΠ½ΠΎ.
Π£ PostgreSQL ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΎΠ½Π½ΡΠΉ DDL, Ρ.Π΅. ΠΌΠΎΠΆΠ½ΠΎ Π² ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡ ΠΌΠ΅Π½ΡΡΡ ΡΡ Π΅ΠΌΡ Π΄Π°Π½Π½ΡΡ , ΠΈ ΡΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π±ΡΠ΄Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΎΠ½Π½ΡΠΌΠΈ. Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ Π±Π΅Π· ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π·Π°ΠΏΠΈΡΠΈ.
PostGIS. ΠΠ΅ΡΠΏΠ»Π°ΡΠ½ΠΎΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ PostgreSQL Ρ ΠΎΡΠΊΡΡΡΡΠΌ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π³Π΅ΠΎΠ³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ, Π΄ΠΎΠΏΠΎΠ»Π½ΡΡΡΠ΅Π΅ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΠ (point, gist). Π Π°Π±ΠΎΡΠ°Π΅Ρ Ρ ΡΠΎΡΠΊΠ°ΠΌΠΈ, Π»ΠΎΠΌΠ°Π½ΡΠΌΠΈ Π»ΠΈΠ½ΠΈΡΠΌΠΈ, ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½Π°ΠΌΠΈ, ΡΠ°ΡΡΡΠ°ΠΌΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΈΡ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΠΈΡΠΊΠ°.
PL/pgSQL. ΠΡΠΎΡΠ΅Π΄ΡΡΠ½ΡΠΉ ΡΠ·ΡΠΊ Π΄Π»Ρ PostgreSQL. Π€ΡΠ½ΠΊΡΠΈΠΈ PL/pgSQL ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΎ ΡΠ»ΠΎΠΆΠ½ΡΠΌΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡΠΌΠΈ ΠΈ ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ, Π° Π·Π°ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΡ ΠΏΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² ΠΈΠ»ΠΈ Π² ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡΡ .
ΠΠΎΠ»Π½Π°Ρ SQL-ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ.
ΠΠ»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ
ΠΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ΡΠ²Π½ΠΎ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°Π½ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠΎΡΠ΅ΠΊ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈ ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ.
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΊΡΡΡΠΎΡ ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΎΠ½ Π½ΡΠΆΠ΅Π½?
Π§ΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ JOIN, ΠΊΠ°ΠΊΠΈΠ΅ Π²ΠΈΠ΄Ρ Π±ΡΠ²Π°ΡΡ?
Π§ΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ HAVING, ΠΏΡΠΈΠΌΠ΅ΡΡ?
Π ΠΊΠ°ΠΊΠΈΡ
ΡΠ»ΡΡΠ°ΡΡ
Π²Ρ Π±Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠ»ΠΈ Π½Π΅ΡΠ΅Π»ΡΡΠΈΠΎΠ½Π½ΡΡ ΠΠ?
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΠΈΠ½Π΄Π΅ΠΊΡ?
VACUUM
ΠΠΎΠΌΠ°Π½Π΄Π° VACUUM Π²ΡΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ΅ Β«ΠΌΠ΅ΡΡΠ²ΡΠΌΠΈΒ» ΠΊΠΎΡΡΠ΅ΠΆΠ°ΠΌΠΈ, ΡΡΠΎ Π°ΠΊΡΡΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΠ°Π±Π»ΠΈΡ. ΠΡΠΈ ΠΎΠ±ΡΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡ Π² Postgres ΠΊΠΎΡΡΠ΅ΠΆΠΈ, ΡΠ΄Π°Π»Π΅Π½Π½ΡΠ΅ ΠΈΠ»ΠΈ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠ΅ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ, ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ ΡΠ΄Π°Π»ΡΡΡΡΡ, Π° ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ Π΄ΠΎ ΠΎΡΠΈΡΡΠΊΠΈ.
EXPLAIN, EXPLAIN ANALYZE
EXPLAIN ANALYZE β Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΏΡΠΎΡΡΠΎ EXPLAIN Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΏΠ»Π°Π½ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ°, Π½ΠΎ ΠΈ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡ ΠΈ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
Server side cursor
Π‘ΠΏΠΎΡΠΎΠ± ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ Π·Π°ΠΏΡΠΎΡΠ° Π² Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π΅ Π·Π°Π³ΡΡΠΆΠ°ΡΡ Π²Π΅ΡΡ ΠΎΠ±ΡΠ΅ΠΌ Π΄Π°Π½Π½ΡΡ Π² ΠΏΠ°ΠΌΡΡΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΌΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ . ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ³Π»ΡΠ±Π»Π΅Π½Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΡΡ ΠΏΡΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ ΡΠ°Π±ΠΎΡΡ Π² ΡΠ²ΡΠ·ΠΊΠ΅ Ρ pgbouncer.
ΠΡΠΎ Π»ΡΠ±ΠΈΡΠ΅Π»ΠΈ mysql ΠΏΡΠΈΠ½Π΅ΡΠ»ΠΈ 8 Π³Π»Π°Π²Ρ ΡΠ²ΠΎΠ΅ΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, Π³Π΄Π΅ ΡΡΠ° ΡΡΡΠΊΠ° Ρ Π½ΠΈΡ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ optimizer ΠΈ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ°ΡΡΠ΅ΠΉ (query planner, ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ query optimizer ΠΈ Ρ.Π΄.)
Π postgresql (ΠΈ Π΄ΡΡΠ³ΠΈΡ Π±Π°Π·Π°Ρ ) ΡΡΠΎ Π½Π°Π·ΡΠ²Π°ΡΡ planner ΠΈ Π² ΡΡΡΡΠΊΠΎΡΠ·ΡΡΠ½ΠΎΠΌ IT Π² Π°ΡΠΏΠ΅ΠΊΡΠ΅ ΠΠ (Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ postgres) ΠΏΡΠΈΠ½ΡΡΠΎ ΡΠ»ΠΎΠ²ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠΎ "ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊ". ΠΡ Π° ΡΠΎ, ΡΡΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π»ΡΠ±ΠΈΡΠ΅Π»ΠΈ mysql ΡΠ»ΠΎΠ²ΠΎΠΌ "ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊ" Ρ Π΄Π°Π²Π½ΠΈΡ ΠΏΠΎΡ Π½Π°Π·ΡΠ²Π°ΡΡ ΠΏΠΎΡΠ΅ΠΌΡ-ΡΠΎ event/job scheduler, Π²Π°Ρ Π² ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π²ΠΎΠ»Π½ΠΎΠ²Π°ΡΡ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ, ΡΡΠΎ Ρ Π½ΠΈΡ ΡΠ°ΠΌ ΡΠ²ΠΎΡ Π°ΡΠΌΠΎΡΡΠ΅ΡΠ°.
ΠΠ΅Ρ, ΡΡΠΎ Π²ΡΡ ΠΈΠ·Π΄Π΅ΡΠΆΠΊΠΈ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠ° Π°Π½Π³Π»ΠΎΡΠ·ΡΡΠ½ΠΎΠΉ ΡΠ΅ΡΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π½Π° ΡΡΡΡΠΊΠΈΠΉ ΡΠ·ΡΠΊ. ΠΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΠ°ΠΊ ΡΠ»ΡΡΠΈΠ»ΠΎΡΡ, ΡΡΠΎ Π² ΡΡΡΡΠΊΠΎΠΌ scheduler ΡΡΠ°Π» ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΠΎΠΌ, Ρ Π²Π½ΡΡΠ½ΠΎ ΠΎΠ±ΡΡΡΠ½ΠΈΡΡ Π½Π΅ ΠΌΠΎΠ³Ρ.
Schedule β ΡΡΠΎ Π²ΠΎΠΎΠ±ΡΠ΅-ΡΠΎ Π³ΡΠ°ΡΠΈΠΊ (Π΄Π΅ΠΆΡΡΡΡΠ²), ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΠ΅ (Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ). ΠΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ°ΠΊ ΡΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π½Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ, Π·Π΄Π΅ΡΡ ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ, ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΠ΅ β ΠΏΡΠΎΠ΄ΡΠΊΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π° Π½Π΅ ΠΏΡΠΎΡΠ΅ΡΡ. Π scheduler Π² ΡΡΠΎΠΌ ΡΠΌΡΡΠ»Π΅ β ΡΡΠΎ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Ρ ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΡ, Π° Π½Π΅ Π΅Π³ΠΎ ΡΠΎΡΡΠ°Π²ΠΈΡΠ΅Π»Ρ.
Plan β ΡΡΠΎ Π² Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠΌΡΡΠ»Π΅ Π°Π»Π³ΠΎΡΠΈΡΠΌ, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠ°Π³ΠΎΠ² ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ (ΠΈΠ·, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΡ).
Optimize β Π² ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ»ΡΡΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΡΠ°ΠΌΠΎΠ³ΠΎ Plan.
ΠΠΎΠ΄ΡΡΠΎΠΆΠΈΠΌ:
scheduler β Ρ ΡΠ°Π½ΠΈΡ ΡΠ°Π±Π»ΠΈΡΡ, ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ, ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΈΡ Π·Π°ΠΏΡΡΠΊ ΠΏΠΎ ΡΡΠΎΠΌΡ ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΡ;
planner β ΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΠ»Π°Π½ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° (Π° EXPLAIN Π΅Π³ΠΎ, ΡΡΠΎΡ ΠΏΠ»Π°Π½, ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ);
optimizer β ΡΠ°ΡΡΡ planner'Π° (ΠΌΠΎΠΆΠ΅Ρ ΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΎΠ²Π°ΡΡ). ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠ΅ΡΠ΅ΡΠΏΠΎΡΡΠ΄ΠΎΡΠΈΠ²Π°Π΅Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΠΈΡΠΊΠ»ΡΡΠ°Π΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΠΈ Ρ.ΠΏ.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ, ΡΡΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² PostgreSQL Π²ΡΡ ΠΊΠ°ΠΊ ΡΠ°Π· ΡΠ°ΠΊΠΈ ΠΈ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ:
ΠΡΡΠΎΡΠ½ΠΈΠΊΠΈ
Π. Π. ΠΠΎΡΠ³ΡΠ½ΠΎΠ². PostgreSQL. ΠΡΠ½ΠΎΠ²Ρ ΡΠ·ΡΠΊΠ° SQL.
10. Π‘Π΅ΡΠ΅Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ
Β«ΠΠ· Π²ΡΠ°Ρ ΡΡΠΎΠ³ΠΎ Π³ΠΎΡΠΎΠ΄Π° ΠΈΡΡ ΠΎΠ΄ΠΈΠ» ΠΈΠ·ΡΠΌΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Π°ΡΠΎΠΌΠ°Ρ, ΠΈ ΡΠΎΡ, ΠΊΡΠΎ Π΅Π³ΠΎ Π²Π΄ΡΡ Π°Π», ΠΈΠ·Π±Π°Π²Π»ΡΠ»ΡΡ ΠΎΡ Π³ΠΎΡΠ΅ΡΡΠΈ ΠΈ ΡΡΡΠ°Π»ΠΎΡΡΠΈΒ».
Π―ΠΊΠΎΠ² ΠΠΎΡΠ°Π³ΠΈΠ½ΡΠΊΠΈΠΉ, Β«ΠΠΎΠ»ΠΎΡΠ°Ρ Π»Π΅Π³Π΅Π½Π΄Π°Β».
REST, Restfull
HTTP. ΠΠ°ΠΊΠΈΠ΅ Ρ Π½Π΅Π³ΠΎ Π΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ? ΠΠ°ΠΊΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ Π² HTTP ΠΈΠ΄Π΅ΠΌΠΏΠΎΡΠ΅Π½ΡΠ½ΡΠ΅, Π° ΠΊΠ°ΠΊΠΈΠ΅ β Π½Π΅Ρ?
HTTP ΠΈ HTTPS
CSRF-token
44 ΠΠ²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ ΠΈ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ
ΠΡΠ½ΠΎΠ²Ρ ΡΠ°Π±ΠΎΡΡ ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ°. ΠΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ², ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ OSI/TCP IP. Π§Π°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°ΡΡ Β«ΠΏΡΠΎΡΡΠΎΠΉΒ» Π²ΠΎΠΏΡΠΎΡ β ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Β«Π·Π° ΡΠΈΡΠΌΠΎΠΉΒ», ΠΊΠΎΠ³Π΄Π° Π² ΠΏΠΎΠΈΡΠΊΠ΅ Π²Π±ΠΈΠ²Π°Π΅ΡΡ Google.com.
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ REST?
REST (Representational state transfer) β ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ Π²ΡΡΡΡΠ°ΠΈΠ²Π°ΡΡ ΡΠ΅ΡΠ²ΠΈΡΡ. ΠΠΎΠ΄ REST ΡΠ°ΡΡΠΎ ΠΈΠΌΠ΅ΡΡ Π² Π²ΠΈΠ΄Ρ Ρ.Π½ HTTP REST API. ΠΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΡΡΠΎ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ Π½Π°Π±ΠΎΡΠΎΠΌ ΡΡΠ»ΠΎΠ² β ΠΊΠΎΠ½Π΅ΡΠ½ΡΡ ΡΠΎΡΠ΅ΠΊ. Π£ΡΠ»Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ JSON. Π’ΠΈΠΏ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π°Π΄Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ HTTP-Π·Π°ΠΏΡΠΎΡΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
GET β ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΠ»ΠΈ ΡΠΏΠΈΡΠΎΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² POST β ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ PUT β ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ DELETE β ΡΠ΄Π°Π»ΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ HEAD β ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° REST-Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° HTTP, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Ρ.Π½. βΠ²Π΅Π»ΠΎΡΠΈΠΏΠ΅Π΄ΠΎΠ²β β ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ Cache, If-Modified-Since, ETag. ΠΠ²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡΠΈΡ β Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ Authentication.
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ CSRF?
Cross Site Request Forgery (ΠΌΠ΅ΠΆΡΠ°ΠΉΡΠΎΠ²Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Π»ΠΊΠ° Π·Π°ΠΏΡΠΎΡΠ°). ΠΠΈΠ΄ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ, ΠΊΠΎΠ³Π΄Π° ΡΠ°ΠΉΡ Π Π²ΡΠ½ΡΠΆΠ΄Π°Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π·Π°ΠΏΡΠΎΡ Π½Π° ΡΠ°ΠΉΡ Π. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΅Π³ img ΠΈΠ»ΠΈ script Π΄Π»Ρ GET-Π·Π°ΠΏΡΠΎΡΠ°, ΠΈΠ»ΠΈ ΡΠΎΡΠΌΠ° ΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΌ Π°ΡΡΠΈΠ±ΡΡΠΎΠΌ target.
Π§ΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΡ, ΡΠ°ΠΉΡ Π Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ Π·Π°ΠΏΡΠΎΡ ΠΏΡΠΈΡΠ΅Π» ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ Π΅Π³ΠΎ ΡΡΡΠ°Π½ΠΈΡΡ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠΎΡΠΌΡ. Π Π½Π΅Π΅ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡ ΡΠΊΡΡΡΠΎΠ΅ ΠΏΠΎΠ»Π΅ token β ΠΎΠ΄Π½ΠΎΡΠ°Π·ΠΎΠ²ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ². ΠΡΠΎΡ ΠΆΠ΅ ΡΠΎΠΊΠ΅Π½ ΡΠΎΡ ΡΠ°Π½ΡΡΡ Π² ΠΊΡΠΊΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. ΠΡΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ ΡΠΎΡΠΌΡ ΠΏΠΎΠ»Π΅ ΠΈ ΠΊΡΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΠ²ΠΏΠ°ΡΡΡ. Π‘ΠΏΠΎΡΠΎΠ± Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π°Π΄Π΅ΠΆΠ½ΡΠΌ ΠΈ ΠΎΠ±Ρ ΠΎΠ΄ΠΈΡΡΡ ΡΠΊΡΠΈΠΏΡΠΎΠΌ.
HTTP ΠΠ°ΠΊ ΡΡΡΡΠΎΠ΅Π½ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» HTTP?
HTTP β ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΉ ΠΏΡΠΎΡΠΎΠΊΠΎΠ», ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΉ ΠΏΠΎΠ²Π΅ΡΡ TCP/IP. HTTP ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π·Π°ΠΏΡΠΎΡΠ° ΠΈ ΠΎΡΠ²Π΅ΡΠ°. ΠΡ ΡΡΡΡΠΊΡΡΡΡ ΠΏΠΎΡ ΠΎΠΆΠΈ: ΡΡΠ°ΡΡΠΎΠ²Π°Ρ ΡΡΡΠΎΠΊΠ°, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ, ΡΠ΅Π»ΠΎ ΠΎΡΠ²Π΅ΡΠ°.
Π‘ΡΠ°ΡΡΠΎΠ²Π°Ρ ΡΡΡΠΎΠΊΠ° Π·Π°ΠΏΡΠΎΡΠ° ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΠΌΠ΅ΡΠΎΠ΄Π°, ΠΏΡΡΠΈ ΠΈ Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°:
GET /index.html HTTP/1.1 Π‘ΡΠ°ΡΡΠΎΠ²Π°Ρ ΡΡΡΠΎΠΊΠ° ΠΎΡΠ²Π΅ΡΠ° ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°, ΠΊΠΎΠ΄Π° ΠΎΡΠ²Π΅ΡΠ° ΠΈ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΉ ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΠΊΠ΅ ΠΎΡΠ²Π΅ΡΠ°.
HTTP/1.1 200 OK ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ β ΡΡΠΎ Π½Π°Π±ΠΎΡ ΠΏΠ°Ρ ΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, User-Agent, Content-Type. Π Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΠ°: ΡΠ·ΡΠΊ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ, ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅. ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Host Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π² Π·Π°ΠΏΡΠΎΡΠ΅ Π²ΡΠ΅Π³Π΄Π°.
Π’Π΅Π»ΠΎ ΠΎΡΠ²Π΅ΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΡΡΡΠΌ, Π»ΠΈΠ±ΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΏΠ°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ , ΡΠ°ΠΉΠ»Ρ, Π±ΠΈΠ½Π°ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅. Π’Π΅Π»ΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ ΠΎΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² ΠΏΡΡΡΠΎΠΉ ΡΡΡΠΎΠΊΠΎΠΉ.
ΠΠ°ΠΏΠΈΡΠ°ΡΡ raw Π·Π°ΠΏΡΠΎΡ Π³Π»Π°Π²Π½ΠΎΠΉ Π―Π½Π΄Π΅ΠΊΡΠ°
GET / HTTP/1.1 Host: ya.ru
ΠΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΏΠΎΠ½ΡΡΡ, ΡΠ΄Π°Π»ΡΡ Π·Π°ΠΏΡΠΎΡ ΠΈΠ»ΠΈ Π½Π΅Ρ?
ΠΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΡΠ°ΡΡΡ ΠΎΡΠ²Π΅ΡΠ°. ΠΡΠ²Π΅ΡΡ ΡΠ°Π·Π΄Π΅Π»Π΅Π½Ρ ΠΏΠΎ ΡΡΠ°ΡΡΠ΅ΠΌΡ ΡΠ°Π·ΡΡΠ΄Ρ. ΠΠΌΠ΅Π΅ΠΌ ΠΏΡΡΡ Π³ΡΡΠΏΠΏ ΡΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠΎΠΉ:
1xx: ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΡΠ°ΠΉΠ½Π΅ ΡΠ΅Π΄ΠΊΠΎ. Π ΡΡΠΎΠΉ Π³ΡΡΠΏΠΏΠ΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΡΠ°ΡΡΡ 100 Continue. 2xx: Π·Π°ΠΏΡΠΎΡ ΠΏΡΠΎΡΠ΅Π» ΡΡΠΏΠ΅ΡΠ½ΠΎ (Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Ρ ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π½Ρ) 3xx: ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π΄ΡΡΠ³ΠΎΠΉ ΡΠ΅ΡΡΡΡ 4xx: ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΠΎ Π²ΠΈΠ½Π΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ (Π½Π΅Ρ ΡΠ°ΠΊΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΡ, Π½Π΅Ρ ΠΏΡΠ°Π² Π½Π° Π΄ΠΎΡΡΡΠΏ) 5xx: ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΠΎ Π²ΠΈΠ½Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ° (ΠΎΡΠΈΠ±ΠΊΠ° Π² ΠΊΠΎΠ΄Π΅, ΡΠ΅ΡΠΈ, ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ) Π§ΡΠΎ Π½ΡΠΆΠ½ΠΎ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π±ΡΠ°ΡΠ·Π΅ΡΡ, ΡΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²ΠΈΡΡ Π½Π° Π΄ΡΡΠ³ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ?
ΠΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΎΡΠ²Π΅Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ ΡΡΠ°ΡΡΡ 301 ΠΈΠ»ΠΈ 302. ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Location ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π°Π΄ΡΠ΅Ρ ΡΠ΅ΡΡΡΡΠ°, Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ.
Π ΡΠ΅Π»Π΅ ΠΎΡΠ²Π΅ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΡΠΈΡΡ HTML ΡΠΎ ΡΡΡΠ»ΠΊΠΎΠΉ Π½Π° Π½ΠΎΠ²ΡΠΉ ΡΠ΅ΡΡΡΡ. Π’ΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΡΡΠ°ΡΡΡ Π±ΡΠ°ΡΠ·Π΅ΡΠΎΠ² ΡΠΌΠΎΠ³ΡΡ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π²ΡΡΡΠ½ΡΡ.
ΠΠ°ΠΊ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π² HTTP?
Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°.
ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ Cache ΠΈ Cache-Control ΡΠ΅Π³ΡΠ»ΠΈΡΡΡΡ ΡΡΠ°Π·Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΡΠΈΡΠ΅ΡΠΈΠ΅Π² ΠΊΠ΅ΡΠ°: Π²ΡΠ΅ΠΌΡ ΠΆΠΈΠ·Π½ΠΈ, ΠΏΠΎΠ»ΠΈΡΠΈΠΊΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ, ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΊΡΠΈ-ΡΠ΅ΡΠ²Π΅ΡΠ°, ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ (ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠ΅, ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠ΅). ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ Last-Modified ΠΈ If-Modified-Since Π·Π°Π΄Π°ΡΡ ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π΄Π°ΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°. ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Etag ΠΊΠ΅ΡΠΈΡΡΠ΅Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ ΠΏΠΎ Π΅Π³ΠΎ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠΌΡ Ρ Π΅ΡΡ. ΠΠ°ΠΊ ΠΊΡΡΠΈΡΡΡΡΡΡ ΡΠ°ΠΉΠ»Ρ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°?
ΠΠΎΠ³Π΄Π° Nginx ΠΎΡΠ΄Π°Π΅Ρ ΡΡΠ°ΡΠΈΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», ΠΎΠ½ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Etag β MD5-Ρ Π΅Ρ ΡΠ°ΠΉΠ»Π°. ΠΠ»ΠΈΠ΅Π½Ρ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ ΡΡΠΎΡ Ρ Π΅Ρ. Π ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°Π· ΠΏΡΠΈ Π·Π°ΠΏΡΠΎΡΠ΅ ΡΠ°ΠΉΠ»Π° ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΠΎΡΡΠ»Π°Π΅Ρ Ρ Π΅Ρ. Π‘Π΅ΡΠ²Π΅Ρ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ Ρ Π΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°. ΠΡΠ»ΠΈ Ρ Π΅Ρ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ (ΡΠ°ΠΉΠ» ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»ΠΈ), ΡΠ΅ΡΠ²Π΅Ρ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Ρ ΠΊΠΎΠ΄ΠΎΠΌ 200 ΠΈ Π²ΡΠ³ΡΡΠΆΠ°Π΅Ρ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» Ρ Π½ΠΎΠ²ΡΠΌ Ρ Π΅ΡΠ΅ΠΌ. ΠΡΠ»ΠΈ Ρ Π΅ΡΠΈ ΡΠ°Π²Π½Ρ, ΡΠ΅ΡΠ²Π΅Ρ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Ρ ΠΊΠΎΠ΄ΠΎΠΌ 304 Not Modified Ρ ΠΏΡΡΡΡΠΌ ΡΠ΅Π»ΠΎΠΌ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π±ΡΠ°ΡΠ·Π΅Ρ ΠΏΠΎΠ΄ΡΡΠ°Π²Π»ΡΠ΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΊΠΎΠΏΠΈΡ ΡΠ°ΠΉΠ»Π°.
nginx vs Apache
ΠΡΡ ΠΏΡΠΎΡΡΠΎ β Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ nginx Π²ΡΠ΅Π³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ. Apache β Π΄Π»Ρ ΡΠ°ΡΠ΅Π΄ Ρ ΠΎΡΡΠΈΠ½Π³ΠΎΠ², Π½ΠΎ Π΄Π°ΠΆΠ΅ Π½Π° ΡΠ°ΡΠ΅Π΄ Ρ ΠΎΡΡΠΈΠ½Π³Π°Ρ ΡΠ°ΡΡΠΎ ΡΡΠΎΠ½ΡΠ΅Π½Π΄ΠΎΠΌ ΡΡΠΎΠΈΡ nginx (Π±Π΅Π· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ), Π° ΡΠΆΠ΅ Π·Π° Π½ΠΈΠΌ β Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΠΉ Apache ΠΈ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΠΉ PHP.
ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°: Apache ΡΠ»Π·Π΄Π°Π΅Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ, nginx ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΠΎ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΊΠΎΠ½ΡΠ΅Π½Ρ: nginx Π² 2 ΡΠ°Π·Π° Π±ΡΡΡΡΠ΅Π΅ Apache. ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΊΠΎΠ½ΡΠ΅Π½Ρ: Π½ΠΈΡΡΡ. Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»: Apache ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠ°ΠΊ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅Ρ, nginx ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΈ ΠΊΠ°ΠΊ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅Ρ, ΡΠ°ΠΊ ΠΈ ΠΊΠ°ΠΊ ΠΏΡΠΎΠΊΡΠΈ-ΡΠ΅ΡΠ²Π΅Ρ. ΠΠ°ΡΡΡΠΎΠΉΠΊΠ°: nginx ΠΏΡΠΎΡΠ΅ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅.
11. ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ
Β«Π Π·Π°Π»Π΅ ΠΊΠ»ΡΠ±ΠΈΠ»ΠΈΡΡ ΠΌΠ½ΠΎΠ³ΠΎΡΠ²Π΅ΡΠ½ΡΠ΅ ΠΎΠ±Π»Π°ΠΊΠ° β ΡΠΈΠΌΠ²ΠΎΠ»Ρ ΡΡΠ°ΡΡΡΡ, Π²ΠΎΠ·Π΄ΡΡ Π±ΡΠ» Π½Π°ΠΏΠΎΠ΅Π½ Π½Π΅ΠΆΠ½Π΅ΠΉΡΠΈΠΌ Π°ΡΠΎΠΌΠ°ΡΠΎΠΌ. ΠΠ»ΡΠ»ΠΈ ΡΠΈΡ ΠΈΠ΅ Π·Π²ΡΠΊΠΈ, ΠΈ Π² ΡΠΎ ΠΆΠ΅ Π²ΡΠ΅ΠΌΡ Π²ΠΎΠΊΡΡΠ³ ΡΠ°ΡΠΈΠ»ΠΎ Π±Π΅Π·ΠΌΠΎΠ»Π²ΠΈΠ΅Β».
ΠΠΈΠ½ ΠΡΠ½Π³Ρ, Β«ΠΡΡΡ ΠΊ Π·Π°ΠΎΠ±Π»Π°ΡΠ½ΡΠΌ Π²ΡΠ°ΡΠ°ΠΌΒ».
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°
SOLID
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΎΠ² SOLID ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ°ΡΡΠΈΡΡΠ΅ΠΌΡΠ΅ ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΡΠΈΠ½ΡΠΈΠΏΡ SOLID ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ² Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³Π° ΠΊΠΎΠ΄Π°.
SRP
Single-responsibility principle, ΠΏΡΠΈΠ½ΡΠΈΠΏ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΠΈ. ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠΎΠ², ΠΈΠΌΠ΅ΡΡΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Ρ ΠΏΡΠΈΡΠΈΠ½Ρ Π΄Π»Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²Π΅ΡΡΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π² Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ, ΠΏΡΠΎΡΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Β«ΠΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²Β». ΠΠ»Π°ΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π·Π° ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΉ Π³ΡΡΠΏΠΏΡ Π»ΠΈΡ.
OCP
Openβclosed principle, ΠΏΡΠΈΠ½ΡΠΈΠΏ ΠΎΡΠΊΡΡΡΠΎΡΡΠΈ/Π·Π°ΠΊΡΡΡΠΎΡΡΠΈ. ΠΠ»Π°ΡΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π·Π°ΠΊΡΡΡΡ ΠΎΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ (ΡΡΠΎΠ±Ρ ΠΊΠΎΠ΄, ΠΎΠΏΠΈΡΠ°ΡΡΠΈΠΉΡΡ Π½Π° ΡΡΠΈ ΠΊΠ»Π°ΡΡΡ, Π½Π΅ Π½ΡΠΆΠ΄Π°Π»ΡΡ Π² ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ), Π½ΠΎ ΠΎΡΠΊΡΡΡΡ Π΄Π»Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ (ΠΊΠ»Π°ΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅). ΠΠΊΡΠ°ΡΡΠ΅ β Ρ ΠΎΡΠ΅ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ° β ΠΎΡΡΠ°Π²Ρ Π² Π½Π΅ΠΏΡΠΈΠΊΠΎΡΠ½ΠΎΠ²Π΅Π½Π½ΠΎΡΡΠΈ ΡΡΠ°ΡΡΠΉ ΠΊΠΎΠ΄ (Π½Π΅ ΡΡΠΈΡΠ°Ρ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³Π°, Ρ. Π΅. ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ), Π΄ΠΎΠ±Π°Π²Ρ Π½ΠΎΠ²ΡΠΉ. ΠΡΠ»ΠΈ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ Π²Π΅Π΄Π΅Ρ ΠΊ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΠΌ Π² ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΌ ΠΊΠΎΠ΄Π΅, Π·Π½Π°ΡΠΈΡ, Π±ΡΠ»ΠΈ Π΄ΠΎΠΏΡΡΠ΅Π½Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ½ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ.
LSP
Liskov substitution principle, ΠΏΡΠΈΠ½ΡΠΈΠΏ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΠ°ΡΠ±Π°ΡΡ ΠΠΈΡΠΊΠΎΠ²: ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π°ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΠΌ Π΄Π»Ρ ΠΊΠΎΠ΄Π°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ΅Π³ΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°. ΠΠ»ΠΈ, Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡΠ΅Π±ΠΎΠ²Π°ΡΡ ΠΎΡ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π° Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ, ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΌΡ ΠΊΠΎΠ΄Ρ ΠΌΠ΅Π½ΡΡΠ΅, ΡΠ΅ΠΌ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ.
ISP
Interface segregation principle, ΠΏΡΠΈΠ½ΡΠΈΠΏ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. ΠΠ»ΠΈΠ΅Π½Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π²ΠΈΡΠ΅ΡΡ ΠΎΡ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ². Π ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΎΠΌ ISP ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡΠΈΡΠ½ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠ΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ². ΠΡΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π½Π΅ ΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, ΡΠΎ Π»ΡΡΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, Π±Π΅Π· ΡΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π°.
DIP
Dependency inversion principle, ΠΏΡΠΈΠ½ΡΠΈΠΏ ΠΈΠ½Π²Π΅ΡΡΠΈΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ. ΠΠΎΠ΄ΡΠ»ΠΈ Π²Π΅ΡΡ Π½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ ΠΌΠΎΠ΄ΡΠ»ΡΠΌ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ Π½Π°ΠΏΡΡΠΌΡΡ, ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Β«ΠΏΡΠΎΠΊΠ»Π°Π΄ΠΊΠ°Β» ΠΈΠ· Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΉ (Ρ. Π΅. ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ²). ΠΡΠΈΡΠ΅ΠΌ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π°Π²ΠΈΡΠ΅ΡΡ ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΉ, ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π°Π²ΠΈΡΠ΅ΡΡ ΠΎΡ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΉ.
KISS
Keep it simple, stupid β ΠΏΡΠΈΠ½ΡΠΈΠΏ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΠ, Π² ΡΠΎΠΎΡΠ²ΡΡΡΠ²ΠΈΠΈ Ρ ΠΊΠΎΡΠΎΡΡΠΌ ΠΏΡΠΎΡΡΠΎΡΠ° ΡΠΈΡΡΠ΅ΠΌΡ Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΎΡΠ½ΠΎΠ²ΠΎΠΏΠΎΠ»Π°Π³Π°ΡΡΠΈΡ ΡΠ΅Π½Π½ΠΎΡΡΠ΅ΠΉ (ΠΈΠ½ΠΎΠ³Π΄Π° Π΄Π°ΠΆΠ΅ ΠΏΡΠΎΡΡΠΎΡΠ° ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΠΎΠΉ, ΡΠ΅ΠΌ Π»ΡΠ±ΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΡΠΈΡΡΠ΅ΠΌΡ, ΡΠΌ. Worse is Better Π ΠΈΡΠ°ΡΠ΄Π° ΠΡΠ±ΡΠΈΠ΅Π»Π°), ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Β«ΠΡΠΈΡΠ²Ρ ΠΠΊΠΊΠ°ΠΌΠ°Β» β Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°ΠΉ Π½ΠΎΠ²ΡΡ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ Π±Π΅Π· ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ.
DRY
Donβt repeat yourself (Π½Π΅ ΠΏΠΎΠ²ΡΠΎΡΡΠΉΡΡ) β ΠΏΡΠΈΠ½ΡΠΈΠΏ, Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΠΊΠΎΡΠΎΡΡΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΡΠΈΡΡΠ΅ΠΌΡ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΡΠ΅Π±ΠΎΠ²Π°ΡΡ Π²Π½Π΅ΡΠ΅Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Π΄ΡΡΠ³ΠΈΠ΅, Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ. ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ ΠΆΠ΅ ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡΡ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠΎ ΠΈ Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±ΡΠ°Π·Π½ΠΎ.
YAGNI
You aren't gonna need it (Π²Π°ΠΌ ΡΡΠΎ Π½Π΅ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ) β Π΅ΡΠ»ΠΈ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π΅ Π½Π΅Ρ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΠΈ ΠΏΡΡΠΌΠΎ Π·Π΄Π΅ΡΡ ΠΈ ΠΏΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ β Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΠΉ Π΅Π³ΠΎ. ΠΡΠΈΠΌ ΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡΠ½ΠΈΠΌΠ΅ΡΡ Π²ΡΠ΅ΠΌΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ ΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π°, Π½ΠΎ ΠΈ ΠΌΠΎΠΆΠ΅ΡΡ ΠΏΠΎΠ΄Π»ΠΎΠΆΠΈΡΡ ΡΠ΅Π±Π΅ ΠΌΠΈΠ½Ρ Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π½Π° Π±ΡΠ΄ΡΡΠ΅Π΅, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ½ΡΡΡΡ ΡΠ°Π·Π²ΠΈΡΠΈΡ ΡΠΈΡΡΠ΅ΠΌΡ ΡΡΠ°Π½ΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΡΠΊΠΈΠΌΠΈ.
Π‘Π²ΡΠ·Π½ΠΎΡΡΡ ΠΊΠΎΠ΄Π° ΠΈ code coupling
Π‘Π²ΡΠ·Π½ΠΎΡΡΡ ΠΊΠΎΠ΄Π° (cohesion) Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΠ·ΡΠ΅Ρ ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΡ ΠΈΠ»ΠΈ Β«ΡΠΎΠΊΡΡΠΈΡΠΎΠ²ΠΊΡΒ» ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ, Ρ.Π΅. ΡΠΎ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ ΡΠ²ΡΠ·Π°Π½Π½Ρ Π΄ΡΡΠ³ Ρ Π΄ΡΡΠ³ΠΎΠΌ.
Π‘ΡΠ΅ΠΏΠ»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ (coupling) β ΡΡΠ΅ΠΏΠ΅Π½Ρ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠΉ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΡΠ°Π·Π½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ. Π‘ΠΈΠ»ΡΠ½ΠΎΠ΅ Π·Π°ΡΠ΅ΠΏΠ»Π΅Π½ΠΈΠ΅ β ΡΠ΅ΡΡΡΠ·Π½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, Ρ. ΠΊ. Π·Π°ΡΡΡΠ΄Π½ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅, Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΠΎΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΡΠΎΡΡΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ. Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ, Π² ΡΡΠ»ΠΎΠ²ΠΈΡΡ ΡΠΈΠ»ΡΠ½ΠΎΠ³ΠΎ Π·Π°ΡΠ΅ΠΏΠ»Π΅Π½ΠΈΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ Π²ΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΡΠ΅ΠΌΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠ΄ΡΠ»Ρ, ΡΡΠΎ, Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ Π²Π΅Π΄Π΅Ρ ΠΊ ΡΠΎΡΡΡ ΠΊΠΎΠ³Π½ΠΈΡΠΈΠ²Π½ΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΈ, ΠΏΠ°Π΄Π΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈ ΡΠΎΡΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΎΡΠΈΠ±ΠΎΠΊ.
Π₯ΠΎΡΠΎΡΠΎ ΡΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΠ·ΡΠ΅ΡΡΡ Π²ΡΡΠΎΠΊΠΎΠΉ ΡΠ²ΡΠ·Π½ΠΎΡΡΡΡ ΠΈ Π½ΠΈΠ·ΠΊΠΈΠΌ ΡΡΠ΅ΠΏΠ»Π΅Π½ΠΈΠ΅ΠΌ.
ΠΠ°ΡΠ°Π΄ΠΈΠ³ΠΌΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ
https://en.wikipedia.org/wiki/Programming_paradigm
ΠΡΠΎΡΠ΅Π΄ΡΡΠ½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΠ΅ΡΠΎΠ΄ΠΈΠΊΠ°, Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΡΠΎΠ±ΠΈΡΠ°ΡΡ Π² ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠΎ Π΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΊΡΡΠΏΠ½ΡΠ΅ ΡΠ΅Π»ΠΎΡΡΠ½ΡΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡΡ ΠΊΠΎΠ΄Π°
Π‘ΡΡΡΠΊΡΡΡΠ½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΊΠ»ΡΡΠΈΡΡ ΠΎΠΏΡΠ΅Π°ΡΠΎΡ goto ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² Π²ΠΈΠ΄Π΅ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ Π±Π»ΠΎΠΊΠΎΠ² (ΠΈΠ· ΡΡΡΡ Π±Π°Π·ΠΎΠ²ΡΡ ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΉ: ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ, Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΠ΅, ΡΠΈΠΊΠ»).
ΠΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ ΡΡΡΡΠΊΡΡΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠ»Π° ΡΠΈΡΠΎΠΊΠΎΠ΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π² 1970-Ρ , ΠΊΠΎΠ³Π΄Π° Π±ΡΠ»ΠΎ ΡΡΡΠΎΠ³ΠΎ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π΄ΠΎΠΊΠ°Π·Π°Π°Π½ΠΎ, ΡΡΠΎ Π½Π° Π±Π°Π·Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΡ ΠΈ ΡΠΈΠΊΠ»Π° ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π»ΡΠ±ΡΡ, ΡΠΊΠΎΠ»Ρ ΡΠ³ΠΎΠ΄Π½ΠΎ ΡΠ»ΠΎΠΆΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π° ΠΠ΄ΡΠ³Π΅Ρ ΠΠ΅ΠΉΠΊΡΡΡΠ° Π΄Π°ΠΆΠ΅ Π½Π°ΠΏΠΈΡΠ°Π» Π² 1968 ΡΡΠ°ΡΡΡ Β«Π Π²ΡΠ΅Π΄Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° gotoΒ» (Β«A Case against the GO TO StatementΒ»).
ΠΠ° Π²ΡΡΠΊΠΈΠΉ ΡΠ»ΡΡΠ°ΠΉ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΡΠ·ΡΠΊΠ΅ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ° ΠΈ ΡΠΈΡΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΡΡΠ»ΠΎΠ²Π½ΡΠ΅ ΠΈ Π±Π΅Π·ΡΡΠ»ΠΎΠ²Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄Ρ, ΡΡΠΎ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ. Goto ΠΈ jmp ΡΠΎΠΎΡΠ½ΠΎΡΡΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π½ΠΈΠΊΠ°ΠΊ.
jmp β Π±Π»Π°Π³ΠΎΡΠΎΠ΄Π½Π°Ρ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ½Π°Ρ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ, Π²Π΅ΡΠ²ΡΡΠ°Ρ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
goto β ΠΊΠΎΡΡΡΠ»Ρ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ Π½Π°ΡΠΈΠ½Π°ΡΡΠ΅ΠΌΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ ΡΠ΅Π»Π΅ΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Π² Π΄ΡΡΠ³ΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ ΠΊΠΎΠ΄Π°.
ΠΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ ΠΈΡ
ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎ, ΡΡΠΎ goto ΠΏΠΎΡΠ»Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π² jmp, Π½Ρ ΡΠ°ΠΊ ΠΈ for, ΠΈ if ΡΠΎΠΆΠ΅ ΠΏΡΠ΅Π²ΡΠ°ΡΠ°ΡΡΡΡ Π² jmp.
ΠΠ±ΡΠ΅ΠΊΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΠ΅ΡΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½Π°Ρ Π½Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² Π²ΠΈΠ΄Π΅ ΡΠΎΠ²ΠΎΠΊΡΠΏΠ½ΠΎΡΡΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΡΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°, Π° ΠΊΠ»Π°ΡΡΡ ΠΎΠ±ΡΠ°Π·ΡΡΡ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ.
Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Π±Π°Π·Π΅ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ ΡΠ²Π»ΡΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΌ ΡΠΌΡΡΠ»Π΅, ΠΈΡ
Π»ΡΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΠΊΠ°Π½Π°Π» (pipe), ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΡΡΠΈΠΉ Π»ΡΠ±ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ, Π² Π΄ΡΡΠ³ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΠΏΠΎΡΠ»Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅ΠΈΡ Π΄Π²ΡΡ
ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ:
- ΠΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΡΡΠ»ΠΎΡΠ½ΠΎ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΡΠΌ (referentially transparent). Π‘ΡΡΠ»ΠΎΡΠ½ΠΎ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΠ΅Π³Π΄Π° Π΄Π°Π΅Ρ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΠ΅ Π΅ΠΉ ΠΎΠ΄Π½ΠΈ ΠΈ ΡΠ΅ ΠΆΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ; ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΡΠ°ΠΊΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ, ΠΎΠ½Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΡΡΠ»Π°ΡΡΡΡ Π½ΠΈ Π½Π° ΠΊΠ°ΠΊΠΈΠ΅ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΡΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ.
- Π‘ΠΈΠ³Π½Π°ΡΡΡΠ° ΠΌΠ΅ΡΠΎΠ΄Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π²ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡΡ Π²Ρ ΠΎΠ΄Π½ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡΡ , ΠΈ ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ½ Π²ΡΠ΄Π°Π΅Ρ.
ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ β ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΏΡΠΎΡΡΠΎΡΠ°, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΠΉ Π΄Π²Π° ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ, ΡΠΊΠ°Π·Π°Π½Π½ΡΡ Π²ΡΡΠ΅, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΈ ΠΎΡΠ»Π°ΠΆΠΈΠ²Π°ΡΡ Π² ΡΡΠ»ΠΎΠ²ΠΈΡΡ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ ΠΎΡ ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Ρ. ΠΠ»ΡΡ, ΠΈΠΌΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΠΎΡΡΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π±ΠΎΠ»Π΅Π΅ Π°Π³ΡΠ΅ΡΡΠΈΠ²Π½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ.
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ ΠΠΠ
Π‘ΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π±Π°Π·ΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½Π° Π΄ΡΡΠ³ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅. ΠΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠ±ΡΠΈΠΉ ΠΊΠ»Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΡΠ²ΠΎΠΉΡΡΠ²Π΅Π½Π½ΡΠ΅ Π½Π°Π±ΠΎΡΡ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ².
Π‘ΠΎΠΊΡΡΡΠΈΠ΅ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΠΈ Π΄Π΅ΡΠ°Π»Π΅ΠΉ Π΅Π³ΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΡ Π΄ΡΡΠ³ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π°Π±ΠΎΡΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ Π½ΠΈΠΌ (API).
Π‘ΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π²ΡΠ±ΠΈΡΠ°ΡΡ Π²Π½ΡΡΡΠ΅Π½Π½ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ (ΠΌΠ΅ΡΠΎΠ΄) ΠΈΡΡ ΠΎΠ΄Ρ ΠΈΠ· ΡΠΈΠΏΠ° Π΄Π°Π½Π½ΡΡ , ΠΏΡΠΈΠ½ΡΡΡΡ Π² ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΈ.
ΠΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΌ Π½Π°Π±ΠΎΡΠΎΠΌ Π΄Π°Π½Π½ΡΡ ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Ρ ΡΠΎΡΠ½ΠΎΡΡΡΡ, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎΠΉ Π΄Π»Ρ ΡΠ΅ΡΠ°Π΅ΠΌΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ.
ΠΡΠ°ΠΊΡΠΈΠΊΠΈ
Agile
Scrum
Kanban
ΠΠ°ΠΊΠΈΠ΅ Π΅ΡΡΡ ΡΠ΅ΠΌΡ ΡΡΠ°ΠΏΠΎΠ² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΡΠΎΠ΄ΡΠΊΡΠ° Π² Software Development lifecycle
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΠΎΠ½ΡΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ (ΡΠ°ΠΊΠΆΠ΅ Β«ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΒ» Π»ΠΈΠ±ΠΎ Β«ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅Β») ΠΠΎΠΏΠ»ΠΎΡΠ΅Π½ΠΈΠ΅ Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠ° (ΡΠ°ΠΊΠΆΠ΅ Β«Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΒ») ΠΠ½ΡΡΠ°Π»Π»ΡΡΠΈΡ ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ°
ΠΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΡ
https://habr.com/ru/post/249183/
Messaging
RabbitMQ Apache Kafka NATS
https://habr.com/ru/company/innotech/blog/698838/
Π¦ΠΈΡΠ°ΡΠ° ΠΈΠ· ΡΡΠ°ΡΡΠΈ:
ΠΡΠ±ΠΈΡΠ°Ρ ΠΌΠ΅ΠΆΠ΄Ρ Kafka ΠΈ RabbitMQ ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡΠ½ΠΎ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡ Π±ΡΠΎΠΊΠ΅ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΎΡΠ΅Π½Ρ ΡΠ»ΠΎΠΆΠ½ΠΎ. Π£ Π²ΡΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΠ²ΠΎΠΈ Π·Π°Π΄Π°ΡΠΈ ΠΈ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ. Π ΡΠ»ΡΡΠ°Π΅ Ρ Apache Kafka ΠΈ RabbitMQ ΡΡΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π·Π½ΡΠΉ ΡΡΠΎΠ²Π΅Π½Ρ, Π³Π΄Π΅ Π»ΡΡΡΠ΅Π³ΠΎ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ.
Kafka ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π±ΠΎΠ»ΡΡΠΈΡ ΠΎΠ±ΡΡΠΌΠΎΠ² Π΄Π°Π½Π½ΡΡ , ΡΠΎΡΠ΅Π½ ΡΡΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ΄ΠΎΠ»Π³Ρ Ρ ΡΠ°Π½ΡΡΡΡ Π½Π° Π΄ΠΈΡΠΊΠ΅ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π· ΡΠΈΡΠ°ΡΡΡΡ ΡΠΎΡΠ½ΡΠΌΠΈ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΡΡΡΡΡΠ°ΠΌΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠΎΠ². Kafka β ΡΡΠΎ Π»Π΅Π³ΠΊΠΎ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠ°Ρ ΡΠΈΡΡΠ΅ΠΌΠ°, ΠΎΠ±Π»Π°Π΄Π°ΡΡΠ°Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½Π½ΠΎΠΉ ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΡΡ, ΡΡΠΎ ΠΎΡΠ΅Π½Ρ Π²Π°ΠΆΠ½ΠΎ Π² ΠΊΡΡΠΏΠ½ΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ .
RabbitMQ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠΉ Π² ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅, ΡΡΠΏΠ΅ΡΠ½ΠΎ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Ρ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΌ ΠΎΠ±ΠΌΠ΅Π½ΠΎΠΌ Π΄Π°Π½Π½ΡΠΌΠΈ Π² ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠΉ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ΅. ΠΠ΅ ΡΡΠ΅Π±ΡΠ΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΠΈ Π·Π°ΡΡΠ°Ρ Π½Π° Π΄ΠΈΡΠΊΠΎΠ²ΡΠ΅ ΡΠ΅ΡΡΡΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π²ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠ»Π΅ ΡΡΠ΅Π½ΠΈΡ ΠΈΠ· ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠ΄Π°Π»ΡΡΡΡΡ. ΠΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ Kafka ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌΠΈ ΠΏΠΎ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΠΎΠ±ΠΌΠ΅Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ. ΠΡΠ»ΠΈΡΠ½ΡΠΉ Π²ΡΠ±ΠΎΡ, Π΅ΡΠ»ΠΈ Π½Π΅Ρ Π·Π°Π²ΡΡΠ΅Π½Π½ΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΠΈ ΠΈ ΠΏΡΠΎΠΏΡΡΠΊΠ½ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ.
12. ΠΠ΄ΠΌΠΈΠ½ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅/DevOps
Β«Π Π£Π½Π½Π΅ΡΠ΅Ρ, Π΄Π°ΠΉ ΡΡΠΎΠΌΡ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΡ Π² ΡΠ²ΠΎΠ΅ΠΌ Π¦Π°ΡΡΡΠ²Π΅ ΡΡΡΡΡΡ Ρ Π»Π΅Π±ΠΎΠ², ΡΡΡΡΡΡ Π±ΡΠΊΠΎΠ², ΡΡΡΡΡΡ ΡΠΎΡΡΠ΄ΠΎΠ² ΠΏΠΈΠ²Π°Β».
ΠΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΡΠΈΡΠΈΡΡ, ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ Π. Π. ΠΠ°ΡΡΠ΅.
Π Π°Π±ΠΎΡΠ° Ρ git
git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"
Π‘ΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠ°ΡΠΈΠΉ: git init
ΠΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ°ΠΉΠ»Ρ: git add --all
git commit
ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π² ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΎΠΉ Π°Π½Π³Π»ΠΎΡΠ·ΡΡΠ½ΡΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΊΠΎΠΌΠΌΠΈΡΠ°, Π²ΡΠΎΡΠΎΠΉ ΠΈ Π΄Π°Π»Π΅Π΅ ΡΡΡΠΎΠΊΠ°ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΡΡΡΠΊΠΎΡΠ·ΡΡΠ½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅. Π‘ΠΎΡ
ΡΠ°Π½ΡΠ΅ΠΌ, Π·Π°ΠΊΡΡΠ²Π°Π΅ΠΌ.
Π‘ΠΏΠΈΡΠΎΠΊ Π²Π΅ΡΠΎΠΊ: git branch --list
Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΡΡ Π²Π΅ΡΠΊΡ, ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° Π²Π΅ΡΠΊΡ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ: git branch small-update
ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° Π²Π½ΠΎΠ²Ρ ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ Π²Π΅ΡΠΊΡ: git checkout small-update
ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° Π²Π΅ΡΠΊΡ master: git checkout master
Π‘Π»ΠΈΡΠ½ΠΈΠ΅ Π²Π΅ΡΠΎΠΊ: git merge small-update
git log --graph --full-history --all --color --pretty=format:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s"
Π‘Π»ΠΈΡΠ½ΠΈΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²:
git rebase
squash
ΠΠΎΠΏΡΡΠΊΠ° ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΌΠΈΡ ΠΈΠ· Π²Π΅ΡΠΊΠΈ Π² Π²Π΅ΡΠΊΡ: cherry pick
ΠΡΠ°Π²ΠΊΠ° ΠΈΡΡΠΎΡΠΈΠΈ git Ρ ΡΠΈΡΠΊΠΎΠΌ Π·Π°ΡΠ΅ΡΠ΅ΡΡ ΡΡΠΆΠΈΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΡ: git push origin master --force-with-lease (ΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ push)
Precommit check
Π₯ΡΠΊΠΈ (ΡΠΊΡΠΈΠΏΡΡ Π½Π° shell'Π°Ρ ΠΈΠ»ΠΈ Python), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠ΅: Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΠΎΠ³ΠΎ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΠΊΠΎΠ΄Π° Π½Π° Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡΡ (PEP8, Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΈ Ρ. Π΄.); Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ½ΠΎΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°; ΠΏΡΠ΅ΡΡΠ²Π°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ commit'Π° Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΠΉ ΠΆΡΡΠ½Π°Π» ΠΎΡΠΈΠ±ΠΎΠΊ.
ΠΠ°Π·ΠΎΠ²ΡΠ΅ Π·Π½Π°Π½ΠΈΡ Linux ΠΈ ΡΠ°Π±ΠΎΡΠ° Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ
Π Π°Π·ΡΠΌΠ΅Π΅ΡΡΡ, Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ ΡΠ°Π±ΠΎΡΡ Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ. ΠΠΈΡΠ΅Π³ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΠ³ΠΎ Π² ΡΡΠΎΠΌ Π½Π΅Ρ, Π² ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ², ΠΠ½Π΄ΠΆΠ΅Π»ΠΈΠ½Π° ΠΠΆΠΎΠ»ΠΈ Π² Β«Π₯Π°ΠΊΠ΅ΡΠ°Ρ Β» ΠΈ ΠΡΡΡΠΈ-ΠΠ½Π½ ΠΠΎΡΡ Π² Β«ΠΠ°ΡΡΠΈΡΠ΅Β» ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ ΡΠΏΡΠ°Π²ΠΈΠ»ΠΈΡΡ!
CI/CD
Continuous testing GitHub Actions Jenkins
Containers
Docker Kubernetes
Git-flow
Π ΡΠ΅Π»ΠΎΠΌ, Π² Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ ΠΌΠΎΠ΄Π΅Π»Ρ git-flow ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ°Π²Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΅Π΄ΠΊΠΎ. ΠΡΠ° ΠΌΠΎΠ΄Π΅Π»Ρ Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΡ ΠΎΡΠ½ΠΎΠ²Π°Π½Π° Π½Π° ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠΎΠΌ, Π΄ΠΎΠ»Π³ΠΎΡΡΠΎΡΠ½ΠΎΠΌ ΡΠΈΠΊΠ»Π΅ ΡΠ΅Π»ΠΈΠ·Π° Π½ΠΎΠ²ΡΡ
Π²Π΅ΡΡΠΈΠΉ, Π° Π½Π΅ Π½Π° Π²ΡΠΏΡΡΠΊΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΊΠ°ΠΆΠ΄ΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΠΎΠ². Git-flow ΡΠΈΠ»ΡΠ½ΠΎ ΡΡΠ»ΠΎΠΆΠ½ΡΠ΅Ρ continuous delivery, ΠΊΠΎΠ³Π΄Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π²ΡΠΏΡΡΠΊΠ°ΡΡ ΡΠ°ΡΡΡΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΏΡΡΠ΅ΠΌ ΡΠ»ΠΈΡΠ½ΠΈΡ Ρ ΠΌΠ°ΡΡΠ΅ΡΠΎΠΌ (ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ, Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² production) ΠΈ ΠΏΠ»ΠΎΡ
ΠΎ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ², ΡΠ°Π·Π±ΠΈΡΡΡ
Π½Π° ΡΠ΅ΡΠ²ΠΈΡΡ.
ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ, Π½Π΅ΠΏΠ»ΠΎΡ
ΠΎ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠΈΠΉ ΠΏΠΎΠ΄ git-flow β Π±ΠΎΠ»ΡΡΠ°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° (20+ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ), ΠΏΠ»Π°Π½ΠΎΠΌΠ΅ΡΠ½ΠΎ Π²ΡΠΏΡΡΠΊΠ°ΡΡΠ°Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ
ΡΠ΅Π»ΠΈΠ·ΠΎΠ² ΠΈΠ»ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡΡΠ°ΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
Π²Π΅ΡΡΠΈΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ. Π ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ git-flow Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠΎΡΡ Π½Π°Π²Π΅ΡΡΠΈ ΠΏΠΎΡΡΠ΄ΠΎΠΊ.
ΠΠ°Π³ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°
ΠΠ°Π³ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° (trunk-based development) ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΎΠΉ CI/CD ΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠ΅ ΡΠ°ΡΡΡΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π³Π»Π°Π²Π½ΠΎΠΉ Π²Π΅ΡΠΊΠΈ. ΠΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΡΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΡ, ΠΌΠ½ΠΎΠ³ΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΎΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π±ΡΡΡΡΡΡ ΠΊΠ΅ΡΠΈΡΡΡΡΡΡ ΡΠ±ΠΎΡΠΊΡ.
ΠΡΡΠΎΡΠ½ΠΈΠΊΠΈ
Python
ΠΡΠΈΡΠΈΠ°Π»ΡΠ½Π°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Python docs.python.org, Π²ΠΊΠ»ΡΡΠ°ΡΡΠ°Ρ The Python Standard Library.
ΠΠ΅ΡΡΠΌΠ° ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ (ΡΠΎΠ²ΡΠ΅ΠΌ ΡΠΆ Π±Π°Π·ΠΎΠ²ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π½Π΅ Π²ΠΊΠ»ΡΡΠ΅Π½): Comprehensive Python Cheatsheet.
Π ΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ Ρ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ°: Python Cheatsheet. ΠΠΊΠ»ΡΡΠ°Π΅Ρ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Jupiter Notebooks.
Π‘ΠΈΠΏΡΠΎΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ ΠΈ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΎΠ²: Awesome Python.
ΠΠΊΠΎΠ»ΠΎ-ΠΏΠΈΡΠΎΠ½ΠΎΠ²ΡΠΊΠΈΠ΅ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠΎΠ²Π΅ΡΡ (pip, virtualenv, pyInstaller ΠΈ Ρ. Π΄.): "The Hitchhikerβs Guide to Python".
ΠΠ°Π½ΡΠ°Π» Π΄Π»Ρ Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΡ
Π΄Π°ΡΠ°-ΡΠ°ΠΉΠ΅Π½ΡΠΈΡΡΠΎΠ²: Joel Grus, "Data Science from Scratch".
Π ΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ Π΄Π»Ρ Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΡ
: "Python Notes for Professionals".
Π ΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ Π΄Π»Ρ ΠΎΠΏΡΡΠ½ΡΡ
ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΎΠ²: "Python 3 Patterns, Recipes and Idioms".
ΠΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ½ΡΠ΅ ΠΏΠ°ΡΡΠ΅ΡΠ½Ρ: Harry Percival & Bob Gregory, "Architecture Patterns with Python".
Git
Π‘ΡΠ°ΡΡΡ 2010 Π³ΠΎΠ΄Π°, ΠΏΠΎΠ»ΠΎΠΆΠΈΠ²ΡΠ°Ρ Π½Π°ΡΠ°Π»ΠΎ ΡΠ°ΡΠΏΡΠΎΡΡΠ°Π½Π΅Π½ΠΈΡ git-flow. Π‘Π°ΠΌ Π°Π²ΡΠΎΡ ΡΠ΄Π΅Π»Π°Π» Π² 2020 Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ ΡΡΠ°ΡΡΠ΅, Π³Π΄Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ, ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠΈΡ
ΡΡ continuous delivery, ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΡΡ Π½Π° GitHub flow: A successful Git branching model.
git-flow (ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ Atlassian ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»Π° ΡΠ΅ΠΊΡΡ ΡΡΡΠ°Π½ΠΈΡΡ, ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ°ΠΌ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Ρ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄Π° Π½Π° ΠΌΠ°Π³ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ): git-flow.
ΠΡΠΈΡΠΈΠΊΠ° git-flow.
GitHub flow.
ΠΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΡ ΡΡΠΎ ΠΆ, Π΄ΠΎΡΠΎΠ³ΠΈΠ΅ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈ, ΡΠ΅ΠΏΠ΅ΡΡ, ΠΏΠΎΡΠ»Π΅ ΠΏΡΠΎΡΡΠ΅Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΠΊΡΠ°ΡΠΊΠΎΠ³ΠΎ ΠΏΡΡΠ΅Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΏΠΎ ΡΠ·ΡΠΊΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Python ΠΈ ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠΉ Ρ Π½ΠΈΠΌ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ΅, Π½Π°Π΄Π΅ΡΡΡ, ΡΡΠΎ Π²Ρ Π·Π°ΠΊΡΡΠ»ΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π»Π°ΠΊΡΠ½Ρ Π² ΡΠ²ΠΎΠΈΡ Π·Π½Π°Π½ΠΈΡΡ , Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π΄ΠΎ ΡΡΠΎΠ³ΠΎ ΠΎΠ±Π»Π°Π΄Π°Π»ΠΈ ΠΎΠΊΠΎΠ»ΠΎΠ½ΡΠ»Π΅Π²ΡΠΌ ΠΎΠΏΡΡΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΡΠ΅ Π±ΠΎΠ»ΡΡΠ΅ Π½Π°Π΄Π΅ΡΡΡ, ΡΡΠΎ Ρ Π²Π°Ρ ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ ΠΌΠ°ΡΡΠ° Π΄ΡΡΠ³ΠΈΡ Π²ΠΎΠΏΡΠΎΡΠΎΠ², ΡΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΡΠΎΡΠΌΠΈΠ²ΡΠΈΡ ΡΡ ΠΈ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ , Π° ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΡΠ΅ΡΡΡ ΠΈ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠ΄Π°ΠΊΠΎΠ΅ Π·Π°ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²ΠΎΠ·ΡΠΎΡΠ»ΠΎ.
Π Π°Π·ΡΠΌΠ΅Π΅ΡΡΡ, ΠΈΠ·ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΡΠ°ΡΠΊΠΈΡ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΉ ΡΡΡΠΎΠΈΡΠ΅Π»ΡΠ½ΡΡ Π±Π»ΠΎΠΊΠΎΠ² ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ²ΡΠΌ ΡΡΠ°ΠΏΠΎΠΌ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΡΠΎΠ·ΠΈΠ΄Π°Π½ΠΈΡ, Π½ΠΎ Π·Π° Π³ΠΎΠ΄-ΠΏΠΎΠ»ΡΠΎΡΠ° ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ Π²Ρ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°Π»ΠΎΠΆΠΈΡΡ Π½Π΅ ΠΏΡΠΎΡΡΠΎ ΡΡΠ½Π΄Π°ΠΌΠ΅Π½Ρ, Π° Π΄ΠΎΠΉΡΠΈ, ΡΠΊΠ°ΠΆΠ΅ΠΌ ΡΠ°ΠΊ, Π΄ΠΎ ΡΡΠΎΠ²Π½Ρ ΠΏΠΎΠ»Π°. Π ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ ΠΏΠΎ ΡΠ°Π±ΠΎΡΠ΅ΠΉ Π½Π°Π΄ΠΎΠ±Π½ΠΎΡΡΠΈ ΠΈΠ»ΠΈ ΠΏΡΠΎΡΡΠΎ Π² ΡΠ΅ΠΊΡΡΠ΅ Π²Π°ΠΊΠ°Π½ΡΠΈΠΈ Π±ΡΠ΄Π΅Ρ Π²ΡΡΡΠ΅ΡΠ°ΡΡΡΡ ΠΊΠ°ΠΊΠ°Ρ-ΡΠΎ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½Π°Ρ Π°Π±Π±ΡΠ΅Π²ΠΈΠ°ΡΡΡΠ°, Π²ΡΠΎΠ΄Π΅ RabbitMQ, ELK Stack ΠΈΠ»ΠΈ Kubernetes, Π²Ρ, ΠΏΠΎΠ»ΡΠ·ΡΡΡΡ Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½ΡΠΌ Π±Π°Π³Π°ΠΆΠΎΠΌ, Π±ΡΠ΄Π΅ΡΠ΅ Π² ΡΠΈΠ»Π°Ρ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Π² ΠΈΡ ΠΏΠ»ΡΡΠ°Ρ , ΠΌΠΈΠ½ΡΡΠ°Ρ ΠΈ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΠΈΠ»ΠΈ, Π³ΠΎΠ²ΠΎΡΡ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ ΠΊΠ»Π°ΡΡΠΈΠΊΠ°, Β«ΠΠ°ΠΊΠΎΠΉ Ρ ΠΎΡΠ±ΠΈΡΡΠΌ ΡΠ³Π»ΠΎΠΌ, Ρ ΠΏΠΎΠΌΡΡΡΠΌ ΡΠ΅Π±ΡΠΎΠΌ ΠΈΠ»ΠΈ Ρ ΠΏΡΠΈΠ»ΠΈΠ²ΠΎΠΌ β ΡΡΠ°Π·Ρ Π¨ΡΡ ΠΎΠ² ΡΡΠΎ Π²ΠΈΠ΄ΠΈΡ, ΠΈ Π²ΠΈΠ΄ΠΈΡ, ΠΊΠ°ΠΊΠΎΠΉ ΡΡΠΎΡΠΎΠ½ΠΎΠΉ ΡΡΠΎΡ ΡΠ»Π°ΠΊΠΎΠ±Π»ΠΎΠΊ Π»Π΅ΡΡ Ρ ΠΎΡΠ΅Ρ, ΠΈ Π²ΠΈΠ΄ΠΈΡ ΡΠΎ ΠΌΠ΅ΡΡΠΎ Π½Π° ΡΡΠ΅Π½Π΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΡΠΎΠ³ΠΎ ΡΠ»Π°ΠΊΠΎΠ±Π»ΠΎΠΊΠ° ΠΆΠ΄Π΅ΡΒ», ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΡΡΠ½ΡΠ΅ Π±Π°Π·Π·Π²ΠΎΡΠ΄Ρ ΠΏΡΠ΅Π²ΡΠ°ΡΡΡΡΡ Π΄Π»Ρ Π²Π°Ρ Π²ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΠΊΡΠ½ΡΠ΅, ΠΆΠΈΠ²ΡΠ΅ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ.
Π§ΡΠΎ ΠΆ, ΡΠ°ΠΌΠΎΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΠ΅Π³Π΄Π° Π΄Π°ΡΡΡΡ Π½Π΅ΠΏΡΠΎΡΡΠΎ, Π½ΠΎ, Π·Π°ΠΏΠ»Π°ΡΠΈΠ² ΡΡΡΠ΄ΠΎΠΌ ΠΈ Π»ΠΈΡΠ½ΡΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΡΠ΅Π³ΠΎΠ΄Π½Ρ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΡΠΎΡΠ΅Π½ΡΡ Π² Π²ΠΈΠ΄Π΅ Π»ΠΈΡΠ½ΠΎΡΡΠ½ΠΎΠ³ΠΎ ΡΠΎΡΡΠ°, ΡΠ²ΠΎΠ±ΠΎΠ΄Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Ρ ΠΌΠ΅ΡΡ ΠΈ ΡΠΈΠΈΠ½Π°Π½ΡΠΎΠ²ΠΎΠΉ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π·Π°Π²ΡΡΠ°, ΡΠ°ΠΊ ΡΡΠΎ ΡΠ΅ΠΉΡΠ°Ρ ΡΠ°ΠΌΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΏΠ΅ΡΠ΅ΡΡΠ°ΡΡ ΡΠΈΠ΄Π΅ΡΡ Π½Π° ΠΏΠΎΠΏΠ΅ ΡΠΎΠ²Π½ΠΎ, ΠΎΡΡΡΠ°Ρ, ΠΊΠ°ΠΊ Π»ΠΈΡΠΎΡΡΠ΅ΡΠ½ΡΠ΅ ΠΏΠ»ΠΈΡΡ ΡΠ²ΠΎΠΈΠΌ Π½Π΅ΡΠΎΡΠΎΠΏΠ»ΠΈΠ²ΡΠΌ Π΄ΡΠ΅ΠΉΡΠΎΠΌ Π΄Π΅Π»Π°ΡΡ Π²Π°ΠΌ Π½Π΅Π½Π°Π²ΡΠ·ΡΠΈΠ²ΡΠΉ ΠΌΠ°ΡΡΠ°ΠΆ.
ΠΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ²ΠΎΡ ΡΡΠ΄ΡΠ±Ρ, ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ ΡΠΌΠΎΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΌΠΈ ΠΏΠΎΡΡΡΠΏΠΊΠ°ΠΌΠΈ ΠΈ Π²ΡΡΠΊΠΈΠΌΠΈ ΡΠ΅Π·ΠΊΠΈΠΌΠΈ ΡΠ΅Π»ΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΡΠΌΠΈ, Π½ΠΎ, Π½Π°ΠΏΡΠΎΡΠΈΠ², Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎΠΉ ΠΊΡΠΎΠΏΠΎΡΠ»ΠΈΠ²ΠΎΠΉ ΡΠ°Π±ΠΎΡΠΎΠΉ, ΠΏΠΎΠ·Π½Π°Π½ΠΈΠ΅ΠΌ Π½ΠΎΠ²ΠΎΠ³ΠΎ, ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ Π³ΡΠ°Π½ΠΈΡ ΡΠ²ΠΎΠΈΡ Π·Π½Π°Π½ΠΈΠΉ. ΠΡΠΈΠ²ΡΠΊΠ°ΠΉΡΠ΅ ΡΡΠ½ΡΡΡ ΡΡΡ ΡΡΠΆΠ΅Π»ΡΡ ΡΠ΅ΡΡ, Ρ ΠΎΡΡ Π±Ρ ΠΈ Π² ΡΡΠ΅Π±Π½ΡΡ ΡΠ΅Π»ΡΡ , ΠΈ ΡΠ°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ Π² Π½Π΅ΠΉ Π·Π°Π±ΡΠ΅ΡΡΡ ΠΆΠΈΠ²Π°Ρ ΡΡΠ±Π°. οΏ½