uz
Feedback

Firibgarlarga uchmang! Telemetrio bunday kanallarni topadi va belgilaydi πŸ‘‰ Belgini koβ€˜rmoqchi boβ€˜lsangiz, obuna boβ€˜ling

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Python Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° | Книги ΠΏΠΎ ΠΏΠΈΡ‚ΠΎΠ½Ρƒ

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Python Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° | Книги ΠΏΠΎ ΠΏΠΈΡ‚ΠΎΠ½Ρƒ

Kanalga Telegram’da oβ€˜tish

ΠŸΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π² CPython ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ. Π Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ (GIL, Memory), Best Practices (SOLID, DDD) ΠΈ тонкости Django/FastAPI. РСшаСм Π·Π°Π΄Π°Ρ‡ΠΈ с ΠΏΠΎΠ΄Π²ΠΎΡ…ΠΎΠΌ ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹. 🐍 По всСм вопросам @evgenycarter РКН clck.ru/3Ko7Hq

Ko'proq ko'rsatish

πŸ“ˆ Telegram kanali Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Python Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° | Книги ΠΏΠΎ ΠΏΠΈΡ‚ΠΎΠ½Ρƒ analitikasi

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Python Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° | Книги ΠΏΠΎ ΠΏΠΈΡ‚ΠΎΠ½Ρƒ (@bookpython) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 17 973 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 7 274-o'rinni va Rossiya mintaqasida 36 654-o'rinni egallagan.

πŸ“Š Auditoriya koβ€˜rsatkichlari va dinamika

Π½Π΅Π²Ρ–Π΄ΠΎΠΌΠΎ sanasidan buyon loyiha tez oβ€˜sib, 17 973 obunachiga ega boβ€˜ldi.

28 Oktabr, 2026 dagi oxirgi ma’lumotlarga koβ€˜ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -96 ga, soβ€˜nggi 24 soatda esa -2 ga oβ€˜zgardi va umumiy qamrov yuqori darajada qolmoqda.

  • Tasdiqlash holati: Tasdiqlanmagan
  • Jalb etish (ER): Auditoriya oβ€˜rtacha 5.41% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 2.64% ini tashkil etuvchi reaksiyalarni toβ€˜playdi.
  • Post qamrovi: Har bir post oβ€˜rtacha 973 marta koβ€˜riladi; birinchi sutkada odatda 475 ta koβ€˜rish yigβ€˜iladi.
  • Reaksiyalar va oβ€˜zaro ta’sir: Auditoriya faol: har bir postga oβ€˜rtacha 4 ta reaksiya keladi.
  • Tematik yoβ€˜nalishlar: Kontent numbers, yield, ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, none, Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ kabi asosiy mavzularga jamlangan.

πŸ“ Tavsif va kontent siyosati

Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
β€œΠŸΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π² CPython ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ. Π Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ (GIL, Memory), Best Practices (SOLID, DDD) ΠΈ тонкости Django/FastAPI. РСшаСм Π·Π°Π΄Π°Ρ‡ΠΈ с ΠΏΠΎΠ΄Π²ΠΎΡ…ΠΎΠΌ ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹. 🐍 По всСм вопросам @evgenycarter РКН clck.ru/3Ko7Hq”

Yuqori yangilanish chastotasi (oxirgi ma’lumot 29 Oktabr, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli boβ€˜lib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim ta’sir nuqtasiga aylantirishini koβ€˜rsatadi.

17 973
Obunachilar
-224 soatlar
-287 kun
-9630 kun
Postlar arxiv
Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈ IndexError, ΠΈ KeyError, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ LookupError β€” ΠΈΡ… ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄ΠΊΠ°. Π­Ρ‚ΠΎ оказываСтся ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ со слоТными Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ:

try:
    db_host = config['databases'][0]['hosts'][0]
except LookupError:
    db_host = 'localhost'
πŸ“² ΠœΡ‹ Π² MAX πŸ‘‰@BookPython

Π’ Python ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ хранят свои Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π² словарях, доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· магичСский Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ dict:

class A: pass
a = A()
a.x = 1
a.__dict__
# {'x': 1}
ΠŸΡ€ΠΈ прямом доступС ΠΊ этому ΡΠ»ΠΎΠ²Π°Ρ€ΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°ΠΆΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ допустимыми ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ Python (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… Ρ‡Π΅Ρ€Π΅Π· стандартный синтаксис obj.attr Π½Π΅ получится):

a.__dict__[' '] = ' '
getattr(a, ' ')
# ' '
МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Python Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ нСпосрСдствСнно Π² памяти (ΠΊΠ°ΠΊ Ρƒ простых структур C) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ slots. Π­Ρ‚ΠΎ экономит ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ускоряСт доступ ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ происходит поиска Π² словарС.

class Point:
    __slots__ = ['x', 'y']
Π•ΡΡ‚ΡŒ нСсколько ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ использовании slots. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, нСльзя Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² slots. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Ссли класс наслСдуСтся ΠΎΡ‚ класса с slots, Π΅Π³ΠΎ slots Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅, Π° Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΊ Π½ΠΈΠΌ:

class Parent: __slots__ = ['x']
class Child(Parent): __slots__ = ['y']
c = Child()
c.x = 1
c.y = 2
Π’-Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ…, нСльзя Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ сразу ΠΎΡ‚ Π΄Π²ΡƒΡ… Ρ€Π°Π·Π½Ρ‹Ρ… классов с нСпустыми slots, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚. Помни, Ρ‡Ρ‚ΠΎ slots ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, Π° Π½Π΅ для ограничСния Π½Π°Π±ΠΎΡ€Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². πŸ“² ΠœΡ‹ Π² MAX πŸ‘‰@BookPython

πŸš€ ΠŸΠΎΠ΄Π±ΠΎΡ€ΠΊΠ° ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… IT ΠΊΠ°Π½Π°Π»ΠΎΠ² Π² Max БистСмноС администрированиС, DevOps πŸ“Œ https://max.ru/i_odmin ВсС для систСмного администратора https://max.ru/bash_srv Bash Π‘ΠΎΠ²Π΅Ρ‚Ρ‹ https://max.ru/sysadminof Книги для Π°Π΄ΠΌΠΈΠ½ΠΎΠ², ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ https://max.ru/i_odmin_book Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° БистСмного Администратора https://max.ru/i_devops DevOps: ПишСм ΠΎ Docker, Kubernetes ΠΈ Π΄Ρ€. 1C Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° πŸ“Œ https://max.ru/odin1c_rus CΡ‚Π°Ρ‚ΡŒΠΈ, курсы, совСты, ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΊΠΎΠ΄Π° 1Π‘ ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ C++πŸ“Œ https://max.ru/cpp_lib Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° C/C++ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GoπŸ“Œ https://max.ru/golang_lib Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Go (Golang) Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ReactπŸ“Œ https://max.ru/react_lib React ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Python πŸ“Œ https://max.ru/python_of Python акадСмия. https://max.ru/BookPython Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Python Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Java Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° πŸ“Œ https://max.ru/bookjava Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Java Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° GitHub БообщСство πŸ“Œ https://max.ru/githublib Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎΠ΅ ΠΈΠ· GitHub Π‘Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… (Data Base) πŸ“Œ https://max.ru/database_info ВсС ΠΏΡ€ΠΎ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π€Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° πŸ“Œ https://max.ru/frontend_1 ΠŸΠΎΠ΄Π±ΠΎΡ€ΠΊΠΈ для frontend Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ πŸ“Œ https://max.ru/programmist_of Книги ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ https://max.ru/proglb Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста https://max.ru/bfbook Книги для программистов ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ πŸ“Œ https://max.ru/bookflow Π›Π΅ΠΊΡ†ΠΈΠΈ, Π²ΠΈΠ΄Π΅ΠΎΡƒΡ€ΠΎΠΊΠΈ, Π΄ΠΎΠΊΠ»Π°Π΄Ρ‹ с IT ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΉ https://max.ru/itmozg ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρ‹, Π΄ΠΈΠ·Π°ΠΉΠ½Π΅Ρ€Ρ‹, новости ΠΈΠ· ΠΌΠΈΡ€Π° IT https://max.ru/php_lib Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° PHP программиста πŸ‘¨πŸΌβ€πŸ’»πŸ‘©β€πŸ’» Π¨ΡƒΡ‚ΠΊΠΈ программистов πŸ“Œ https://max.ru/itumor Π¨ΡƒΡ‚ΠΊΠΈ программистов Π—Π°Ρ‰ΠΈΡ‚Π°, Π²Π·Π»ΠΎΠΌ, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ πŸ“Œ https://max.ru/thehaking Канал ΠΎ кибСрбСзопасности https://max.ru/xakkep_1 Π₯Π°ΠΊΠ΅Ρ€ Free Книги, ΡΡ‚Π°Ρ‚ΡŒΠΈ для Π΄ΠΈΠ·Π°ΠΉΠ½Π΅Ρ€ΠΎΠ² πŸ“Œ https://max.ru/odesigners Π‘Ρ‚Π°Ρ‚ΡŒΠΈ, ΠΊΠ½ΠΈΠ³ΠΈ для Π΄ΠΈΠ·Π°ΠΉΠ½Π΅Ρ€ΠΎΠ² ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ° πŸ“Œ https://max.ru/Pomatematike Канал ΠΏΠΎ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅ https://max.ru/phismat_1 ΠžΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠ΅ Π²ΠΈΠ΄Π΅ΠΎ, ΠΊΠ½ΠΈΠ³ΠΈ ΠΏΠΎ Π€ΠΈΠ·ΠΈΠΊΠ΅ ΠΈ ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅ Вакансии πŸ“Œ https://max.ru/progjob Вакансии Π² IT ΠœΠΈΡ€ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ πŸ“Œ https://max.ru/mir_teh Канал для Π»ΡŽΠ±ΠΎΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Бонус πŸ“Œ https://max.ru/piterspb_78 Π‘Π²Π΅ΠΆΠΈΠ΅ новости Π‘Π°Π½ΠΊΡ‚-ΠŸΠ΅Ρ‚Π΅Ρ€Π±ΡƒΡ€Π³Π° https://max.ru/mockva_life Π‘Π²Π΅ΠΆΠΈΠ΅ новости ΠœΠΎΡΠΊΠ²Ρ‹

Python позволяСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с путями Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы Ρ‡Π΅Ρ€Π΅Π· ΠΌΠΎΠ΄ΡƒΠ»ΡŒ os.path. ΠœΠΎΠ΄ΡƒΠ»ΡŒ содСрТит мноТСство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ строки ΠΊΠ°ΠΊ ΠΏΡƒΡ‚ΠΈ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ объСдинСниС ΠΏΡƒΡ‚Π΅ΠΉ ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π΅:

>>> import os.path
>>> os.path.join('/usr', 'local')
'/usr/local'
>>> os.path.dirname('/var/log')
'/var'
Однако, начиная с Python 3.4, доступСн Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ pathlib, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄:

>>> from pathlib import Path
>>> Path('/usr') / Path('local')
PosixPath('/usr/local')
>>> Path('/usr') / 'local'
PosixPath('/usr/local')
>>> Path('/var/log').parent
PosixPath('/var')
>>> Path('/var/log').parent.name
'var'
πŸ“² ΠœΡ‹ Π² MAX πŸ‘‰@BookPython

НСкоторым Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ всС элСмСнты Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°:

>>> def enclose(gen, before='{', after='}'):
...     yield before
...     for x in gen:
...         yield x
...     yield after
...
>>> list(enclose(range(5)))
['{', 0, 1, 2, 3, 4, '}']
Однако ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ yield from:

>>> def enclose(gen, before='{', after='}'):
...     yield before
...     yield from gen
...     yield after
yield from Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ быстрСС, Π½ΠΎ ΠΈ автоматичСски ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ· Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ Π΄Π°ΠΆΠ΅ выброс ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°. πŸ“² ΠœΡ‹ Π² MAX πŸ‘‰@BookPython

ΠœΠΎΠ΄ΡƒΠ»ΡŒ collections прСдоставляСт класс ChainMap, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ (словарСй) ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Ρ‘Π½Π½ΠΎΠ΅:

from collections import ChainMap

d = ChainMap(dict(a=1), dict(a=2, b=2))
d['a']  # 1
d['b']  # 2
d['c']  # ...
# KeyError: 'c'
ChainMap ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ просматриваСт всС Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ отобраТСния ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Однако всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ измСнСния Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

d = ChainMap(dict(a=1), dict(a=2, b=2))
d['c'] = 3
d
# ChainMap({'a': 1, 'c': 3}, {'a': 2, 'b': 2})
πŸ“² ΠœΡ‹ Π² MAX πŸ‘‰@BookPython

Π’ Python сортировка ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ являСтся ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΉ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ сохраняСт порядок Ρ€Π°Π²Π½Ρ‹Ρ… элСмСнтов:

a = [2, -1, 0, 1, -2]
sorted(a, key=lambda x: x**2)
# [0, -1, 1, 2, -2]
Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ max ΠΈ min Ρ‚ΠΎΠΆΠ΅ ΡΡ‚Π°Ρ€Π°ΡŽΡ‚ΡΡ Π±Ρ‹Ρ‚ΡŒ согласованными с ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ sorted. max Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ sorted(a, reverse=True)[0], Π° min β€” ΠΊΠ°ΠΊ sorted(a)[0]. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ самый Π»Π΅Π²Ρ‹ΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

max([2, -2], key=lambda x: x**2)
# 2

max([-2, 2], key=lambda x: x**2)
# -2

min([2, -2], key=lambda x: x**2)
# 2

min([-2, 2], key=lambda x: x**2)
# -2
πŸ“² ΠœΡ‹ Π² MAX πŸ‘‰@BookPython

Π•ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ ситуации, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ нСльзя Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠΌ: распаковка ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ, Ρ†ΠΈΠΊΠ»Ρ‹ for ΠΈ инструкции with. ВсС эти ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹:

name: str, age: int = student

for x: int in numbers: 
    ...

with connection() as conn: Connection:
    ...
ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ способ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Ρ‚Π°ΠΊΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… β€” ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΈΡ… Π·Π°Ρ€Π°Π½Π΅Π΅, Π±Π΅Π· ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

conn: Connection
with connection() as conn:
    ...
πŸ“² ΠœΡ‹ Π² MAX πŸ‘‰@BookPython

Π’ Python имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ символа подчёркивания: _. Π₯отя Ρ‚Π°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ нСдостаточно ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ ΠΈ ΠΈΡ… Π½Π΅ стоит ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, сущСствуСт ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Ρ‚Ρ€ΠΈ случая, ΠΊΠΎΠ³Π΄Π° _ ΠΈΠΌΠ΅Π΅Ρ‚ общСпринятоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°Ρ… Python _ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для хранСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° послСднСго Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠ³ΠΎ выраТСния:

>>> 2 + 2  
4  
>>> _  
4
Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ модуля gettext рСкомСндуСтся ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ псСвдоним для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gettext() Π² Π²ΠΈΠ΄Π΅ _(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π·Π°Π³Ρ€ΠΎΠΌΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΊΠΎΠ΄. Π’-Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ…, _ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ имя для значСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ прСдставляСт интСрСса:

>>> log_entry = '10:50:24 14234 GET /api/v1/test'  
>>> time, _, method, location = log_entry.split()
πŸ“² ΠœΡ‹ Π² MAX πŸ‘‰@BookPython

Иногда Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ участок ΠΊΠΎΠ΄Π° ΠΈ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Π­Ρ‚ΠΎ ΠΎΠΏΡ€Π°Π²Π΄Π°Π½ΠΎ Π² случаС с ΠΏΠ»Π°Π³ΠΈΠ½Π°ΠΌΠΈ, сторонними модулями ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ, устройство ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Π°ΠΌ нСизвСстно ΠΈΠ»ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π²Ρ‹ Π½Π΅ довСряСтС. ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ способ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ try с except Exception, Π° Π½Π΅ Π³ΠΎΠ»Ρ‹ΠΉ except:

try:
    foreign()
except Exception:
    logging.warn('fail', exc_info=True)
Π“ΠΎΠ»Ρ‹ΠΉ except эквивалСнтСн except BaseException. А Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ BaseException ΠΈ Exception Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ BaseException Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π»ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π΅ слСдуСт, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, KeyboardInterrupt. πŸ“² ΠœΡ‹ Π² MAX πŸ‘‰@BookPython

Π’ Python ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобок [] ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π² магичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ __getitem__. Π­Ρ‚ΠΎ позволяСт, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ содСрТит бСсконСчноС количСство ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ элСмСнтов:

class Cycle:
    def __init__(self, lst):
        self._lst = lst

    def __getitem__(self, index):
        return self._lst[index % len(self._lst)]

print(Cycle(['a', 'b', 'c'])[100])  # 'b'
ΠΠ΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° [] Π² Python Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ особый синтаксис. Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π°ΠΊ: [2], Π½ΠΎ ΠΈ Ρ‚Π°ΠΊ: [2:10], [2:10:2], [2::2] ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ [:]. Бмысл Ρ‚Π°ΠΊΠΎΠΉ записи β€” [start:stop:step], Π½ΠΎ Π² Π²Π°ΡˆΠΈΡ… собствСнных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот синтаксис ΠΊΠ°ΠΊ ΡƒΠ³ΠΎΠ΄Π½ΠΎ. Π§Ρ‚ΠΎ ΠΆΠ΅ пСрСдаётся Π² __getitem__ Π² Ρ‚Π°ΠΊΠΈΡ… случаях? ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ slice созданы ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для этого. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

class Inspector:
    def __getitem__(self, index):
        print(index)

Inspector()[1]
# 1

Inspector()[1:2]
# slice(1, 2, None)

Inspector()[1:2:3]
# slice(1, 2, 3)

Inspector()[:]
# slice(None, None, None)

Inspector()[:, 0, :]
# (slice(None, None, None), 0, slice(None, None, None))
ΠžΠ±ΡŠΠ΅ΠΊΡ‚ slice сам ΠΏΠΎ сСбС Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ β€” ΠΎΠ½ просто Ρ…Ρ€Π°Π½ΠΈΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ start, stop ΠΈ step:

s = slice(1, 2, 3)
print(s.start)  # 1
print(s.stop)   # 2
print(s.step)   # 3
πŸ“² ΠœΡ‹ Π² MAX πŸ‘‰@BookPython

πŸš€ ΠŸΠΎΠ΄Π±ΠΎΡ€ΠΊΠ° ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… IT ΠΊΠ°Π½Π°Π»ΠΎΠ² Π² Max БистСмноС администрированиС, DevOps πŸ“Œ https://max.ru/i_odmin ВсС для систСмного администратора https://max.ru/bash_srv Bash Π‘ΠΎΠ²Π΅Ρ‚Ρ‹ https://max.ru/sysadminof Книги для Π°Π΄ΠΌΠΈΠ½ΠΎΠ², ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ https://max.ru/i_odmin_book Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° БистСмного Администратора https://max.ru/i_devops DevOps: ПишСм ΠΎ Docker, Kubernetes ΠΈ Π΄Ρ€. 1C Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° πŸ“Œ https://max.ru/odin1c_rus CΡ‚Π°Ρ‚ΡŒΠΈ, курсы, совСты, ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΊΠΎΠ΄Π° 1Π‘ ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ C++πŸ“Œ https://max.ru/cpp_lib Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° C/C++ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Python πŸ“Œ https://max.ru/python_of Python акадСмия. https://max.ru/BookPython Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Python Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Java Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° πŸ“Œ https://max.ru/bookjava Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Java Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° GitHub БообщСство πŸ“Œ https://max.ru/githublib Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎΠ΅ ΠΈΠ· GitHub Π‘Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… (Data Base) πŸ“Œ https://max.ru/database_info ВсС ΠΏΡ€ΠΎ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π€Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° πŸ“Œ https://max.ru/frontend_1 ΠŸΠΎΠ΄Π±ΠΎΡ€ΠΊΠΈ для frontend Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ πŸ“Œ https://max.ru/programmist_of Книги ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ https://max.ru/proglb Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста https://max.ru/bfbook Книги для программистов ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ πŸ“Œ https://max.ru/bookflow Π›Π΅ΠΊΡ†ΠΈΠΈ, Π²ΠΈΠ΄Π΅ΠΎΡƒΡ€ΠΎΠΊΠΈ, Π΄ΠΎΠΊΠ»Π°Π΄Ρ‹ с IT ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΉ https://max.ru/itmozg ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρ‹, Π΄ΠΈΠ·Π°ΠΉΠ½Π΅Ρ€Ρ‹, новости ΠΈΠ· ΠΌΠΈΡ€Π° IT https://max.ru/php_lib Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° PHP программиста πŸ‘¨πŸΌβ€πŸ’»πŸ‘©β€πŸ’» Π¨ΡƒΡ‚ΠΊΠΈ программистов πŸ“Œ https://max.ru/itumor Π¨ΡƒΡ‚ΠΊΠΈ программистов Π—Π°Ρ‰ΠΈΡ‚Π°, Π²Π·Π»ΠΎΠΌ, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ πŸ“Œ https://max.ru/thehaking Канал ΠΎ кибСрбСзопасности https://max.ru/xakkep_1 Π₯Π°ΠΊΠ΅Ρ€ Free Книги, ΡΡ‚Π°Ρ‚ΡŒΠΈ для Π΄ΠΈΠ·Π°ΠΉΠ½Π΅Ρ€ΠΎΠ² πŸ“Œ https://max.ru/odesigners Π‘Ρ‚Π°Ρ‚ΡŒΠΈ, ΠΊΠ½ΠΈΠ³ΠΈ для Π΄ΠΈΠ·Π°ΠΉΠ½Π΅Ρ€ΠΎΠ² ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ° πŸ“Œ https://max.ru/Pomatematike Канал ΠΏΠΎ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅ https://max.ru/phismat_1 ΠžΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠ΅ Π²ΠΈΠ΄Π΅ΠΎ, ΠΊΠ½ΠΈΠ³ΠΈ ΠΏΠΎ Π€ΠΈΠ·ΠΈΠΊΠ΅ ΠΈ ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅ Вакансии πŸ“Œ https://max.ru/progjob Вакансии Π² IT ΠœΠΈΡ€ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ πŸ“Œ https://max.ru/mir_teh Канал для Π»ΡŽΠ±ΠΎΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Бонус πŸ“Œ https://max.ru/piterspb_78 Π‘Π²Π΅ΠΆΠΈΠ΅ новости Π‘Π°Π½ΠΊΡ‚-ΠŸΠ΅Ρ‚Π΅Ρ€Π±ΡƒΡ€Π³Π° https://max.ru/mockva_life Π‘Π²Π΅ΠΆΠΈΠ΅ новости ΠœΠΎΡΠΊΠ²Ρ‹

БущСствуСт Π΄Π²Π° понятия с ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌΠΈ названиями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π»Π΅Π³ΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΡƒΡ‚Π°Ρ‚ΡŒ: ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ (overriding) ΠΈ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° (overloading). ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ происходит, ΠΊΠΎΠ³Π΄Π° Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ класс опрСдСляСт ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΆΠ΅ Π±Ρ‹Π» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ классС, фактичСски замСняя Π΅Π³ΠΎ. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… языках Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ явно ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ пСрСопрСдСляСтся (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² C# ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ override), Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… β€” это Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ (Π² Java ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ @Override). Π’ Python Π½Π΅Ρ‚ Π½ΠΈ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ, Π½ΠΈ стандартного способа ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ (Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ программисты ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ @override, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚, Π° слуТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для читаСмости ΠΊΠΎΠ΄Π°). ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ°, Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ², β€” это Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ, Π½ΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ сигнатурами. Π­Ρ‚ΠΎ поддСрТиваСтся Π² Ρ‚Π°ΠΊΠΈΡ… языках, ΠΊΠ°ΠΊ Java ΠΈ C++, ΠΈ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ способ прСдоставлСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:

class Foo {
    public static void main(String[] args) {
        System.out.println(Hello());
    }

    public static String Hello() {
        return Hello("world");
    }

    public static String Hello(String name) {
        return "Hello, " + name;
    }
}
Python Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ поиск Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎ сигнатурам, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ ΠΈΠΌΠ΅Π½Π°ΠΌ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ явно Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΈΠΏΡ‹ ΠΈ количСство Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π½ΠΎ это ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ выглядит Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΎ ΠΈ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ красиво:

def quadrilateral_area(*args):
    if len(args) == 4:
        quadrilateral = Quadrilateral(*args)
    elif len(args) == 1:
        quadrilateral = args[0]
    else:
        raise TypeError()

    return quadrilateral.area()
Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ подсказки Ρ‚ΠΈΠΏΠΎΠ² для Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΌΠΎΠ΄ΡƒΠ»ΡŒ typing прСдоставляСт Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ @overload, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

from typing import overload

@overload
def quadrilateral_area(
    q: Quadrilateral
) -> float: ...

@overload
def quadrilateral_area(
    p1: Point, p2: Point,
    p3: Point, p4: Point
) -> float: ...
πŸ“² ΠœΡ‹ Π² MAX πŸ‘‰@BookPython

πŸš€ Как Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π΅Π· Π±ΠΎΠ»ΠΈ Π² Python Как Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Python ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· β€” ΠΈ большС ΠΊ этому Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ print(), Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ logging, Π½ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΠΈΡˆΡƒΡ‚ ΠΊΡƒΡ‡Ρƒ ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Π― Ρ‚Π°ΠΊ Ρ‚ΠΎΠΆΠ΅ Π΄Π΅Π»Π°Π». Но ΠΏΠΎΡ‚ΠΎΠΌ Π²Ρ‹Π²Π΅Π» сСбС ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΡƒΡŽ схСму, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ кидаю Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚:

import logging

def setup_logger(name: str) -> logging.Logger:
    logger = logging.getLogger(name)
    if not logger.hasHandlers():
        logger.setLevel(logging.INFO)
        handler = logging.StreamHandler()
        formatter = logging.Formatter(
            '%(asctime)s - %(levelname)s - %(name)s - %(message)s'
        )
        handler.setFormatter(formatter)
        logger.addHandler(handler)
    return logger

logger = setup_logger(__name__)

logger.info("Π‘ΠΊΡ€ΠΈΠΏΡ‚ стартовал")
Π§Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ: * Π£Π΄ΠΎΠ±Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ уровня Π»ΠΎΠ³Π° * Π—Π°Ρ‰ΠΈΡ‚Ρƒ ΠΎΡ‚ дублирования Π»ΠΎΠ³ΠΎΠ² (Ссли ΠΌΠΎΠ΄ΡƒΠ»ΡŒ импортируСтся нСсколько Ρ€Π°Π·) * Π“ΠΎΡ‚ΠΎΠ²Π½ΠΎΡΡ‚ΡŒ ΠΊ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ (ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ»-Π»ΠΎΠ³Π³Π΅Ρ€) Если Π²Ρ‹ устали ΠΎΡ‚ print(), просто сохранитС сСбС этот сниппСт β€” ΠΎΠ½ сэкономит Π²Π°ΠΌ врСмя ΠΈ Π½Π΅Ρ€Π²Ρ‹. ΠŸΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ Π»ΠΈ Π²Ρ‹ встроСнным logging, ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ loguru? πŸ“² ΠœΡ‹ Π² MAX πŸ‘‰@BookPython

πŸ’‘ Как ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ повторСния ΠΊΠΎΠ΄Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ functools.partial Как ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ ΠΈ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ дублирования с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ functools.partial. Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ функция send_email(to, subject, body, is_html=False), ΠΈ ΠΌΡ‹ часто Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π΅Ρ‘ с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ is_html=True. ВмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΠΈΡΠ°Ρ‚ΡŒ это явно, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΠΈΡ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

from functools import partial

send_html_email = partial(send_email, is_html=True)

# Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‰Π΅:
send_html_email("user@example.com", "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", "<b>Как Π΄Π΅Π»Π°?</b>")
Π­Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: * Π»ΠΎΠ³Π³Π΅Ρ€Ρ‹ с прСдустановлСнным ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ * ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ с ΠΎΠ±Ρ‰ΠΈΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ * ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ CLI с Ρ‚ΠΈΠΏΠΎΠ²Ρ‹ΠΌΠΈ Ρ„Π»Π°Π³Π°ΠΌΠΈ Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚Π΅ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚Π΅ ΠΊΠΎΠ΄ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠ΅Π΅. А Π΅Ρ‰Ρ‘ это красивый способ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ DI Π±Π΅Π· Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ² β€” просто ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ partial. πŸ“² ΠœΡ‹ Π² MAX πŸ‘‰@BookPython

ВстроСнныС значСния float Π² Python ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ вашСго ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, поэтому любоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ прСдставляСтся Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ Π² Π²ΠΈΠ΄Π΅ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ Π΄Ρ€ΠΎΠ±ΠΈ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с приблиТСниями, Π° Π½Π΅ с Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌΠΈ значСниями:

>>> format(0.1, '.17f')
'0.10000000000000001'
ΠœΠΎΠ΄ΡƒΠ»ΡŒ decimal позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π΅ΡΡΡ‚ΠΈΡ‡Π½ΡƒΡŽ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΡƒ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ:

>>> from decimal import Decimal
>>> Decimal(1) / Decimal(3)
Decimal('0.3333333333333333333333333333')
Но ΠΈ этого ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСдостаточно:

>>> Decimal(1) / Decimal(3) * Decimal(3) == Decimal(1)
False
Для Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Ρ‚ΠΎΡ‡Π½Ρ‹Ρ… вычислСний ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ fractions, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…Ρ€Π°Π½ΠΈΡ‚ любоС число ΠΊΠ°ΠΊ Ρ€Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅:

>>> from fractions import Fraction
>>> Fraction(1) / Fraction(3) * Fraction(3) == Fraction(1)
True
ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ β€” всё Ρ€Π°Π²Π½ΠΎ приходится ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ приблиТСния для ΠΈΡ€Ρ€Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… чисСл, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Ο€. πŸ“² ΠœΡ‹ Π² MAX πŸ‘‰@BookPython

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Python Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π΄Π²Π° ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… этапа. Π‘Π½Π°Ρ‡Π°Π»Π° вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ __new__, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаёт ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π—Π°Ρ‚Π΅ΠΌ вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ __init__ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ состояния этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Однако, Ссли __new__ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ являСтся экзСмпляром исходного класса, ΠΌΠ΅Ρ‚ΠΎΠ΄ __init__ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½. Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, вСроятно, ΡƒΠΆΠ΅ создан Π΄Ρ€ΡƒΠ³ΠΈΠΌ классом, ΠΈ Π΅Π³ΠΎ __init__ ΡƒΠΆΠ΅ Π±Ρ‹Π» Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½:

class Foo:
    def __new__(cls, x):
        return dict(x=x)

    def __init__(self, x):
        print(x)  # Никогда Π½Π΅ вызываСтся

print(Foo(0))
Π’Π°ΠΆΠ½ΠΎ: Π½Π΅ слСдуСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ экзСмпляры Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ класса Π² __new__ с использованиСм ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ конструктора (Foo(...)). Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π΄Π²ΠΎΠΉΠ½ΠΎΠΌΡƒ Π²Ρ‹Π·ΠΎΠ²Ρƒ __init__ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΊ бСсконСчной рСкурсии. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ бСсконСчной рСкурсии:

class Foo:
    def __new__(cls, x):
        return Foo(-x)  # РСкурсия
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° __init__:

class Foo:
    def __new__(cls, x):
        if x < 0:
            return Foo(-x)
        return super().__new__(cls)

    def __init__(self, x):
        print(x)
        self._x = x
ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ способ:

class Foo:
    def __new__(cls, x):
        if x < 0:
            return cls.__new__(cls, -x)
        return super().__new__(cls)

    def __init__(self, x):
        print(x)
        self._x = x
πŸ“² ΠœΡ‹ Π² MAX πŸ‘‰@BookPython

πŸš€ ΠŸΠΎΠ΄Π±ΠΎΡ€ΠΊΠ° ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… IT ΠΊΠ°Π½Π°Π»ΠΎΠ² Π² Max БистСмноС администрированиС, DevOps πŸ“Œ https://max.ru/i_odmin ВсС для систСмного администратора https://max.ru/bash_srv Bash Π‘ΠΎΠ²Π΅Ρ‚Ρ‹ https://max.ru/sysadminof Книги для Π°Π΄ΠΌΠΈΠ½ΠΎΠ², ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ https://max.ru/i_odmin_book Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° БистСмного Администратора https://max.ru/i_devops DevOps: ПишСм ΠΎ Docker, Kubernetes ΠΈ Π΄Ρ€. 1C Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° πŸ“Œ https://max.ru/odin1c_rus CΡ‚Π°Ρ‚ΡŒΠΈ, курсы, совСты, ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΊΠΎΠ΄Π° 1Π‘ ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ C++πŸ“Œ https://max.ru/cpp_lib Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° C/C++ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Python πŸ“Œ https://max.ru/python_of Python акадСмия. https://max.ru/BookPython Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Python Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Java Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° πŸ“Œ https://max.ru/bookjava Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Java Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° GitHub БообщСство πŸ“Œ https://max.ru/githublib Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎΠ΅ ΠΈΠ· GitHub Π‘Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… (Data Base) πŸ“Œ https://max.ru/database_info ВсС ΠΏΡ€ΠΎ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π€Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° πŸ“Œ https://max.ru/frontend_1 ΠŸΠΎΠ΄Π±ΠΎΡ€ΠΊΠΈ для frontend Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ πŸ“Œ https://max.ru/programmist_of Книги ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ https://max.ru/proglb Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста https://max.ru/bfbook Книги для программистов ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ πŸ“Œ https://max.ru/bookflow Π›Π΅ΠΊΡ†ΠΈΠΈ, Π²ΠΈΠ΄Π΅ΠΎΡƒΡ€ΠΎΠΊΠΈ, Π΄ΠΎΠΊΠ»Π°Π΄Ρ‹ с IT ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΉ https://max.ru/itmozg ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρ‹, Π΄ΠΈΠ·Π°ΠΉΠ½Π΅Ρ€Ρ‹, новости ΠΈΠ· ΠΌΠΈΡ€Π° IT https://max.ru/php_lib Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° PHP программиста πŸ‘¨πŸΌβ€πŸ’»πŸ‘©β€πŸ’» Π¨ΡƒΡ‚ΠΊΠΈ программистов πŸ“Œ https://max.ru/itumor Π¨ΡƒΡ‚ΠΊΠΈ программистов Π—Π°Ρ‰ΠΈΡ‚Π°, Π²Π·Π»ΠΎΠΌ, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ πŸ“Œ https://max.ru/thehaking Канал ΠΎ кибСрбСзопасности https://max.ru/xakkep_1 Π₯Π°ΠΊΠ΅Ρ€ Free Книги, ΡΡ‚Π°Ρ‚ΡŒΠΈ для Π΄ΠΈΠ·Π°ΠΉΠ½Π΅Ρ€ΠΎΠ² πŸ“Œ https://max.ru/odesigners Π‘Ρ‚Π°Ρ‚ΡŒΠΈ, ΠΊΠ½ΠΈΠ³ΠΈ для Π΄ΠΈΠ·Π°ΠΉΠ½Π΅Ρ€ΠΎΠ² ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ° πŸ“Œ https://max.ru/Pomatematike Канал ΠΏΠΎ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅ https://max.ru/phismat_1 ΠžΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠ΅ Π²ΠΈΠ΄Π΅ΠΎ, ΠΊΠ½ΠΈΠ³ΠΈ ΠΏΠΎ Π€ΠΈΠ·ΠΈΠΊΠ΅ ΠΈ ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅ Вакансии πŸ“Œ https://max.ru/progjob Вакансии Π² IT ΠœΠΈΡ€ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ πŸ“Œ https://max.ru/mir_teh Канал для Π»ΡŽΠ±ΠΎΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Бонус πŸ“Œ https://max.ru/piterspb_78 Π‘Π²Π΅ΠΆΠΈΠ΅ новости Π‘Π°Π½ΠΊΡ‚-ΠŸΠ΅Ρ‚Π΅Ρ€Π±ΡƒΡ€Π³Π° https://max.ru/mockva_life Π‘Π²Π΅ΠΆΠΈΠ΅ новости ΠœΠΎΡΠΊΠ²Ρ‹

Как ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ typer РаньшС для CLI-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Python я использовал argparse, ΠΏΠΎΡ‚ΠΎΠΌ Π±Ρ‹Π» click, Π½ΠΎ Π½Π΅Π΄Π°Π²Π½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΡˆΡ‘Π» Π½Π° typer. Π­Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΎΡ‚ Π°Π²Ρ‚ΠΎΡ€Π° FastAPI, ΠΈ ΠΎΠ½Π° Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ πŸ”₯ Π’ΠΎΡ‚ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

import typer

app = typer.Typer()

@app.command()
def hello(name: str, age: int = 18):
    print(f"ΠŸΡ€ΠΈΠ²Π΅Ρ‚, {name}! Π’Π΅Π±Π΅ {age} Π»Π΅Ρ‚.")

if __name__ == "__main__":
    app()
Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅:

$ python main.py hello Alice --age 30
ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Alice! Π’Π΅Π±Π΅ 30 Π»Π΅Ρ‚.
Π§Ρ‚ΠΎ ΠΊΡ€ΡƒΡ‚ΠΎ: - АвтоматичСски гСнСрируСтся --help - ΠŸΠΈΡˆΠ΅Ρ‚ΡΡ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΊΠ°ΠΊ обычная функция - Π•ΡΡ‚ΡŒ Π°Π²Ρ‚ΠΎΠΊΠΎΠΌΠΏΠ»ΠΈΡ‚ Π² ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ°Ρ… (bash/zsh) - ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ Ρ‚ΠΈΠΏΠΎΠ² ΠΈ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ "ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ" Если Ρ‚Ρ‹ всё Π΅Ρ‰Ρ‘ ΡΡ‚Ρ€Π°Π΄Π°Π΅ΡˆΡŒ с argparse, Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ typer. ОсобСнно Ссли Ρ‚Ρ‹ ΡƒΠΆΠ΅ ΠΊΠ°ΠΉΡ„ΡƒΠ΅ΡˆΡŒ ΠΎΡ‚ FastAPI β€” синтаксис ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈ. πŸ“² ΠœΡ‹ Π² MAX πŸ‘‰@BookPython

ΠŸΠΎΠΏΡƒΠ»ΡΡ€Π½Ρ‹ΠΉ способ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ абстрактный ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² Python β€” это Π²Ρ‹Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ NotImplementedError:

def human_name(self):
    raise NotImplementedError
Π₯отя этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ довольно распространён ΠΈ Π΄Π°ΠΆΠ΅ поддСрТиваСтся IDE (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, PyCharm считаСт Ρ‚Π°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ абстрактными), Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ нСдостаток: ошибка Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π° Π½Π΅ ΠΏΡ€ΠΈ создании экзСмпляра класса. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ abc:

from abc import ABCMeta, abstractmethod

class Service(metaclass=ABCMeta):
    @abstractmethod
    def human_name(self):
        pass
Π’Π°ΠΊΠΆΠ΅ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ NotImplemented β€” это Π½Π΅ Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ NotImplementedError. NotImplemented β€” это ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (ΠΊΠ°ΠΊ True ΠΈ False), Π° Π½Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Оно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… (__eq__(), __add__() ΠΈ Π΄Ρ€.), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ Python, Ρ‡Ρ‚ΠΎ опСрация Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° для Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли a.__add__(b) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ NotImplemented, Python ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ b.__radd__(a)). πŸ“² ΠœΡ‹ Π² MAX πŸ‘‰@BookPython

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Python Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° | Книги ΠΏΠΎ ΠΏΠΈΡ‚ΠΎΠ½Ρƒ - Telegram kanali @bookpython statistikasi va tahlili