🐍 Укус питона 🐍
2.47K subscribers
1.07K photos
24 videos
285 links
🐍 Канал о программировании на языке Python. Тематические уроки и лайфхаки.

👽 Админ - @it_dashka
🔊 Купить рекламу: https://telega.in/c/byteofpython

👉 Чат: @abyteofpython
👉 Поделиться с друзьями: @byteofpython
Download Telegram
👩‍💻 Замороженные датаклассы — безопасные объекты без мутаций

В Python dataclasses можно сделать неизменяемыми с помощью параметра frozen=True.

Это превращает экземпляры в безопасные структуры данных, похожие на namedtuple, но с гибкостью классов.


➡️ Пример:

from dataclasses import dataclass

@dataclass(frozen=True)
class Point:
x: int
y: int

p = Point(3, 5)
# p.x = 10 # Ошибка: объект заморожен
print(p) # Point(x=3, y=5)


📌 Используй frozen dataclass, если данные должны быть константными и безопасными по дизайну
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет код?
👩‍💻 Дескрипторы в Python — сердце свойств и ORM

Дескрипторы — это объекты, которые управляют доступом к атрибутам других классов через методы __get__, __set__ и __delete__.

Они лежат в основе property, @staticmethod, @classmethod и ORM вроде Django.


➡️ Пример:

class Celsius:
def __get__(self, instance, owner):
return instance._temp

def __set__(self, instance, value):
if value < -273.15:
raise ValueError("Температура ниже абсолютного нуля!")
instance._temp = value


class Temperature:
temp = Celsius()


t = Temperature()
t.temp = 25
print(t.temp) # 25


📌 Дескрипторы — это низкоуровневая магия, на которой построен весь механизм Python-свойств.
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Генераторы — ленивые последовательности без лишней памяти

Генераторы в Python создают значения "на лету", без хранения всего списка в памяти.

Это делает их идеальными для работы с большими объёмами данных и потоками


➡️ Пример:

def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b

gen = fibonacci()
for _ in range(5):
print(next(gen))
# 0 1 1 2 3


📌 Здесь yield превращает функцию в генератор, который "запоминает" состояние между вызовами.
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет код?
👩‍💻 Контекстные менеджеры — управление ресурсами без утечек

Контекстные менеджеры позволяют автоматически управлять ресурсами — открытыми файлами, соединениями, блокировками.

Они гарантируют освобождение ресурсов даже при ошибках


➡️ Пример:

class Managed:
def __enter__(self):
print("Ресурс открыт")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("Ресурс закрыт")

with Managed():
print("Работаем с ресурсом")

# Ресурс открыт
# Работаем с ресурсом
# Ресурс закрыт


📌 Метод __enter__ выполняется при входе в блок, __exit__ — при выходе, даже если возникло исключение.
Please open Telegram to view this post
VIEW IN TELEGRAM
Зачем используется метод split() в Python и когда его применять?

Метод split() разбивает строку на части по заданному разделителю и возвращает список. Это удобно для обработки текста, логов, CSV-данных и пользовательского ввода.

Пример:

text = "apple,banana,orange"
fruits = text.split(",")
print(fruits)
# ➜ ['apple', 'banana', 'orange']


📌В этом примере split() разделяет строку по запятой, превращая её в список слов

split() удобно использовать при парсинге строк, чтении файлов, анализе данных и обработке команд. Без аргумента метод автоматически разделяет по пробелам — это особенно полезно для очистки и разбиения текста на слова
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет код?

from contextlib import ExitStack, contextmanager

@contextmanager
def cm(name):
print("e"+name)
try:
yield name
finally:
print("x"+name)

with ExitStack() as st:
a = st.enter_context(cm("A"))
b = st.enter_context(cm("B"))
print("body", a, b)
👩‍💻 Декоратор @property — чистый интерфейс без скобок

@property позволяет превратить методы класса в атрибуты, сохранив при этом логику вычислений или валидации.

Это делает интерфейс класса чистым и безопасным, без лишних вызовов и скобок.


➡️ Пример:

class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height

@property
def area(self):
return self.width * self.height

r = Rectangle(5, 10)
print(r.area) # 50, а не r.area()


📌
Здесь area выглядит как атрибут, но фактически вычисляется при обращении.
Please open Telegram to view this post
VIEW IN TELEGRAM