Библиотека Python разработчика | Книги по питону
Погружение в 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 18 326 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 7 317-o'rinni va Rossiya mintaqasida 36 872-o'rinni egallagan.
📊 Auditoriya ko‘rsatkichlari va dinamika
невідомо sanasidan buyon loyiha tez o‘sib, 18 326 obunachiga ega bo‘ldi.
05 Iyun, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -86 ga, so‘nggi 24 soatda esa -1 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.
- Tasdiqlash holati: Tasdiqlanmagan
- Jalb etish (ER): Auditoriya o‘rtacha 6.08% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 2.60% ini tashkil etuvchi reaksiyalarni to‘playdi.
- Post qamrovi: Har bir post o‘rtacha 1 114 marta ko‘riladi; birinchi sutkada odatda 477 ta ko‘rish yig‘iladi.
- Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 2 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 06 Iyun, 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.
>>> 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 не только работает быстрее, но и автоматически обрабатывает передачу значений во вложенные генераторы, возврат значений из генераторов и даже выброс исключений внутри вложенного генератора.
👉@BookPython
def append_length(lst=[]):
lst.append(len(lst))
return lst
print(append_length([1, 2])) # [1, 2, 2]
print(append_length()) # [0]
print(append_length()) # [0, 1]
Однако в некоторых случаях, например при реализации кешей, такое поведение может быть полезным:
def fact(x, cache={0: 1}):
if x not in cache:
cache[x] = x * fact(x - 1)
return cache[x]
print(fact(5))
В этом примере мы сохраняем вычисленные значения факториала внутри значения аргумента по умолчанию. Причём к этому значению даже можно обратиться напрямую:
>>> fact.__defaults__
({0: 1, 1: 1, 2: 2, 3: 6, 4: 24, 5: 120},)
👉@BookPython__hash__. Этот метод может возвращать любое целое число, но есть одно обязательное условие: равные объекты должны иметь одинаковые хэши (обратное не обязательно).
Также не стоит использовать изменяемые объекты в качестве ключей, потому что если объект изменится и станет не равным самому себе в прошлом, его больше нельзя будет найти в словаре.
Есть и один странный момент, который может удивить во время отладки или написания unit-тестов:
class A:
def __init__(self, x):
self.x = x
def __hash__(self):
return self.x
hash(A(2)) # 2
hash(A(1)) # 1
hash(A(0)) # 0
hash(A(-1)) # внимание!
# -2
hash(A(-2)) # -2
В CPython значение -1 зарезервировано для внутренних ошибок, поэтому оно неявно преобразуется в -2.
👉@BookPythoncollections предоставляет класс 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})
👉@BookPython
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
👉@BookPython__repr__ и прочие подобные вещи:
class Server:
def __init__(self, ip, version=4):
self.ip = ip
self._version = version
def __repr__(self):
return '{klass}("{ip!r}", {version!r})'.format(
klass=type(self).__name__,
ip=self.ip,
version=self._version,
)
Один из способов упростить такую рутину — использовать популярный пакет attrs, который автоматически генерирует множество стандартных методов на основе нескольких деклараций:
class Server:
ip = attrib()
_version = attrib(default=4)
server = Server(ip='192.168.0.0.1', version=4)
Этот подход не только создаёт конструктор (__init__) и представление (__repr__), но и полный набор методов сравнения (__eq__, __lt__ и т. д.).
Кроме того, в Python 3.7 появилась стандартная альтернатива — data classes (датаклассы), которые решают ту же задачу (и даже больше). Они используют аннотации переменных — ещё одну относительно новую функцию Python. Вот пример:
@dataclass
class InventoryItem:
name: str
unit_price: float
quantity_on_hand: int = 0
def total_cost(self) -> float:
return self.unit_price * self.quantity_on_hand
Таким образом, dataclass тоже автоматически создаёт __init__, __repr__, методы сравнения и многое другое, основываясь лишь на аннотациях типов.for и инструкции with.
Все эти примеры некорректны:
name: str, age: int = student
for x: int in numbers:
...
with connection() as conn: Connection:
...
Правильный способ указать тип таких переменных — объявить их заранее, без инициализации:
conn: Connection
with connection() as conn:
...
👉@BookPython-h или --help), опций с параметрами (--log-level 2) или позиционных параметров (cp file1 file2).
Опции отличаются от позиционных параметров тем, что начинаются с одного или двух дефисов. Проблемы возникают, когда позиционные аргументы тоже начинаются с дефиса — например, если нужно удалить файл с именем -rf: команда rm -rf в таком случае не работает как ожидается.
Общепринятый способ решения этой проблемы — поддержка разделителя --. Аргументы, идущие после --, никогда не интерпретируются как опции:
$ echo test > -rf
$ cat -rf
cat: invalid option -- 'r'
Try 'cat --help' for more information.
$ cat -- -rf
test
$ rm -- -rf
$ cat -- -rf
cat: -rf: No such file or directory
Модуль argparse автоматически обрабатывает -- за тебя.
👉@BookPython
try:
cache
except NameError:
cache = {}
На первый взгляд, в этом нет смысла: cache однозначно вызовет NameError в начале модуля, так как переменной ранее не присваивалось значение.
Однако это не так, если модуль перезагружается. В этом случае словарь, содержащий все атрибуты модуля, повторно используется, что даёт модулю возможность повторно использовать атрибуты своего предыдущего экземпляра. Если модуль спроектирован с учётом возможности перезагрузки, он может опираться на эту особенность. Например, приведённый выше код сохранить кэш при перезагрузке модуля.
👉@BookPythonsys.modules:
In : import sys
In : 'sys' in sys.modules.keys()
Out: True
Если вам действительно нужно перезагрузить модуль, следует использовать функцию importlib.reload(m). Здесь m — это объект модуля, который был успешно импортирован ранее, а не строка с его именем:
In : import importlib
In : importlib.reload(importlib)
Out[5]: <module 'importlib' from '/home/bookpython/.ve/pythonetc/lib/python3.6/importlib/__init__.py'>
👉@BookPython
>>> 2 + 2
4
>>> _
4
Во-вторых, в документации модуля gettext рекомендуется создавать псевдоним для функции gettext() в виде _(), чтобы не загромождать код.
В-третьих, _ используется, когда необходимо придумать имя для значения, которое не представляет интереса:
>>> log_entry = '10:50:24 14234 GET /api/v1/test'
>>> time, _, method, location = log_entry.split()
👉@BookPython
Endi mavjud! Telegram Tadqiqoti 2025 — yilning asosiy insaytlari 
