byteofpython | Unsorted

Telegram-канал byteofpython - 🐍 Укус питона 🐍

2619

🐍 Канал о программировании на языке Python. Тематические уроки и лайфхаки. 👽 Админ - @it_dashka 🔊 Купить рекламу: https://telega.in/c/byteofpython 👉 Чат: @abyteofpython 👉 Поделиться с друзьями: @byteofpython

Subscribe to a channel

🐍 Укус питона 🐍

⚡️ Как работает @staticmethod в Python?

Декоратор @staticmethod превращает метод класса в обычную функцию внутри класса, которая не получает ссылку на экземпляр (self) или класс (cls).

✅ Пример:

class MathUtils:
@staticmethod
def add(x, y):
return x + y

print(MathUtils.add(3, 5)) # 8


🔹 Зачем нужен?

• Используется, когда метод не зависит от состояния экземпляра или класса.
• Делает код логичнее, если метод просто выполняет действие, связанное с классом.
• Упрощает структуру, так как не требует создания объекта для вызова.

⚡️ Используйте @staticmethod, если метод не работает с self или cls, но логически относится к классу!

Читать полностью…

🐍 Укус питона 🐍

Как работает getitem в Python?

Метод getitem позволяет обращаться к объектам класса по индексу или ключу, как к спискам или словарям.

✅ Пример:

class CustomList:
def init(self, data):
self.data = data

def getitem(self, index):
return self.data[index] # Позволяет использовать obj[index]

nums = CustomList([10, 20, 30])
print(nums[1]) # 20


🔹 Зачем нужно?

• Позволяет настроить доступ к элементам объекта.
• Делает объекты итерируемыми (например, в for-циклах).
• Помогает создавать свои структуры данных, работающие как списки или словари.

⚡️ getitem делает объекты гибкими и удобными в использовании, улучшая читаемость кода!

Читать полностью…

🐍 Укус питона 🐍

⚙️ Сборщик мусора в Python: как он работает?

В Python управление памятью происходит автоматически с помощью сборщика мусора (Garbage Collector, GC). Он следит за объектами, которые больше не используются, и освобождает занимаемую ими память.

🔹 Подсчет ссылок

Каждый объект хранит количество ссылок на себя. Когда это число становится нулем, объект автоматически удаляется. Однако если два объекта ссылаются друг на друга, но больше нигде не используются, Python не сможет их удалить.

🔹 Алгоритм поколений

Чтобы эффективно управлять памятью, Python разделяет объекты на три группы:

Gen 0 — новые объекты, проверяются чаще всего.
Gen 1 — пережившие одну проверку, удаляются реже.
Gen 2 — долгоживущие объекты, проверяются редко.

Новые объекты проверяются чаще, а старые — реже, что ускоряет работу сборщика мусора.

🔹 Управление GC

Python справляется сам, но можно управлять GC вручную:

gc.collect() — запустить сборку мусора вручную.
gc.disable() — отключить GC (не рекомендуется).

GC в Python делает управление памятью удобным, но понимание его работы помогает писать более эффективный код и избегать утечек памяти.

Читать полностью…

🐍 Укус питона 🐍

🐍 Что делает enumerate() в Python?

enumerate() добавляет индекс при итерации по списку.

✅ Пример:

fruits = ["🍎", "🍌", "🍇"]
for i, fruit in enumerate(fruits, start=1):
print(i, fruit)

1 🍎
2 🍌
3 🍇


Зачем нужно?

Упрощает работу с индексами в циклах
Делает код читаемым без range(len())

Используйте enumerate() вместо range(len()) для чистого и Pythonic-кода!

Читать полностью…

🐍 Укус питона 🐍

🔥 Что такое slots в Python и зачем он нужен?

slots ограничивает список атрибутов у экземпляров класса, экономя память за счет отказа от dict.

Обычный класс без slots:

class Person:
def init(self, name, age):
self.name = name
self.age = age

p = Person("Alice", 25)
p.city = "New York" # Можно добавить новый атрибут


✅ Класс с slots:
class Person:
slots = ("name", "age") # Разрешены только эти атрибуты

def init(self, name, age):
self.name = name
self.age = age

p = Person("Alice", 25)
p.city = "New York" # ❌ AttributeError: 'Person' object has no attribute 'city'


➕ Плюсы slots

Экономит память (не создается dict)
Ускоряет доступ к атрибутам
Предотвращает создание лишних атрибутов

⚡️ Используйте slots, если нужно много однотипных объектов и важна производительность!

Читать полностью…

🐍 Укус питона 🐍

Немножко о реализации set в Python

Почему set в Python не всегда такой хаотичный, как кажется? Разбираемся, как множества устроены под капотом, как работают хэш-таблицы и почему порядок элементов иногда оказывается предсказуемым.

Читать полностью…

🐍 Укус питона 🐍

🔥 *args и **kwargs в Python

🔹 *args — передает позиционные аргументы как кортеж:

def add_numbers(*args):
return sum(args)

print(add_numbers(1, 2, 3)) # 6


🔹 **kwargs — передает именованные аргументы как словарь:
def greet(**kwargs):
print(kwargs)

greet(name="Alice", age=25) # {'name': 'Alice', 'age': 25}


✅ Используйте *args для списка значений и **kwargs для гибких параметров!

Читать полностью…

🐍 Укус питона 🐍

🔥 Mutable vs Immutable в Python

В Python все данные — это объекты, и они делятся на изменяемые (mutable) и неизменяемые (immutable).

🔹 Неизменяемые (immutable): нельзя изменить после создания
int, float, str, tuple, frozenset

x = "hello"
x += " world" # Создается новый объект, а не изменяется старый


🔹 Изменяемые (mutable): можно изменять без создания нового объекта
list, dict, set, bytearray
lst = [1, 2, 3]
lst.append(4) # Список изменяется в той же области памяти


⚠️ Важный нюанс

Передача изменяемых объектов в функцию может привести к неожиданным изменениям:

def modify_list(lst):
lst.append(99) # Изменяет оригинальный список!

my_list = [1, 2, 3]
modify_list(my_list)
print(my_list) # [1, 2, 3, 99]


✅ Вывод:

Используйте tuple, если данные не должны изменяться.
Будьте осторожны с изменяемыми объектами при передаче в функции.
Если нужно копирование, используйте .copy() или deepcopy().

Читать полностью…

🐍 Укус питона 🐍

❓ Что делает getattr() в Python и когда его использовать?

Функция getattr() позволяет динамически получать атрибут объекта по его имени в виде строки. Это удобно, когда атрибут неизвестен заранее.

✅ Пример:

class Person:
def init(self, name, age):
self.name = name
self.age = age

p = Person("Alice", 30)
print(getattr(p, "name")) # Alice


📌 Если атрибута нет, можно передать значение по умолчанию, чтобы избежать ошибки:

print(getattr(p, "city", "Не указано"))  # Не указано


getattr() полезен, когда нужно работать с атрибутами гибко, например, при обработке конфигураций, JSON-данных или динамических объектов.

Читать полностью…

🐍 Укус питона 🐍

⚡️ Как работает super() в Python?

super() позволяет вызывать методы родительского класса, обеспечивая правильное наследование и расширение функционала.

✅ Пример:

class Parent:
def greet(self):
return "Hello from Parent"

class Child(Parent):
def greet(self):
return super().greet() + " and Child"

obj = Child()
print(obj.greet()) # "Hello from Parent and Child"


super() особенно полезен при множественном наследовании, так как помогает вызывать методы родительских классов без явного указания их имен.

Читать полностью…

🐍 Укус питона 🐍

⚙️ Как работает metaclass в Python?

В Python метаклассы управляют созданием классов, так же как классы управляют созданием объектов. Они позволяют автоматизировать и настраивать процесс создания классов.

✅ Пример:

class Meta(type):
def new(cls, name, bases, dct):
dct["custom_attr"] = 42
return super().new(cls, name, bases, dct)

class MyClass(metaclass=Meta):
pass

print(MyClass.custom_attr) # 42


Метаклассы позволяют добавлять атрибуты, проверять код, изменять поведение классов перед их созданием.

Это мощный инструмент, но его стоит использовать только при необходимости, например, в ORM, фреймворках и API.

Читать полностью…

🐍 Укус питона 🐍

Что делает метод new в Python и когда его использовать?

Метод new отвечает за создание нового экземпляра класса перед его инициализацией в init. Он используется в случаях, когда нужно контролировать процесс создания объекта, например, в синглтонах или при наследовании от неизменяемых типов (int, str, tuple).

✅ Пример использования:

class Singleton:
_instance = None

def new(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super().new(cls)
return cls._instance

obj1 = Singleton()
obj2 = Singleton()

print(obj1 is obj2) # True (оба объекта — одна и та же ссылка)


В отличие от init, new контролирует сам процесс создания объекта. Полезен для ограничения числа экземпляров и работы с неизменяемыми классами.

Читать полностью…

🐍 Укус питона 🐍

🔄 Как работает itertools.chain в Python?

itertools.chain позволяет объединять несколько итерируемых объектов в один, не создавая новых списков. Это экономит память и делает код чище.

✅ Пример:

from itertools import chain

list1 = [1, 2, 3]
list2 = [4, 5, 6]

for num in chain(list1, list2):
print(num) # 1 2 3 4 5 6


Обычно для объединения списков используют +, но это создаёт новый список в памяти.

chain
позволяет перебирать элементы последовательно, без лишних затрат, что особенно полезно при работе с большими наборами данных или генераторами.

Читать полностью…

🐍 Укус питона 🐍

🏷 Что такое functools.lru_cache и зачем он нужен?

functools.lru_cache — это декоратор для автоматического кэширования результатов функций. Он ускоряет выполнение, избегая повторных вычислений.

✅ Пример:

from functools import lru_cache

@lru_cache(maxsize=100) # Кэшируем до 100 результатов
def fib(n):
if n < 2:
return n
return fib(n - 1) + fib(n - 2)

print(fib(10)) # 55 (значительно быстрее благодаря кэшу)


🔹 Зачем использовать?


• Ускоряет повторяющиеся вычисления.
• Уменьшает нагрузку на процессор при рекурсивных вызовах.
• Экономит память благодаря ограничению maxsize.

⚡️ lru_cache особенно полезен для функций с повторяющимися входными данными!

Читать полностью…

🐍 Укус питона 🐍

🏗 Как работает call в Python?

Метод call позволяет вызывать экземпляр класса как функцию. Если этот метод определён в классе, объект можно использовать как obj().

✅ Пример:

class Multiplier:
def init(self, factor):
self.factor = factor

def call(self, value):
return value * self.factor

double = Multiplier(2)
print(double(5)) # 10


🔹 Зачем нужно?

• Позволяет создавать объекты-функции.
• Удобно для конфигурируемых вычислений (например, замыканий).
• Улучшает читаемость, убирая лишние .method() вызовы.

⚡️ Используйте call, если хотите, чтобы объект вёл себя как функция!

Читать полностью…

🐍 Укус питона 🐍

🏗 Как работает call в Python?

Метод call позволяет вызывать экземпляр класса как функцию. Если этот метод определён в классе, объект можно использовать как obj().

✅ Пример:

class Multiplier:
def init(self, factor):
self.factor = factor

def call(self, value):
return value * self.factor

double = Multiplier(2)
print(double(5)) # 10


🔹 Зачем нужно?

• Позволяет создавать объекты-функции.
• Удобно для конфигурируемых вычислений (например, замыканий).
• Улучшает читаемость, убирая лишние .method() вызовы.

⚡️ Используйте call, если хотите, чтобы объект вёл себя как функция!

Читать полностью…

🐍 Укус питона 🐍

LLM-модули: как маленькая модель учится у большой

Как передавать знания от большой LLM в маленькую без файн-тюнинга? Разбираем метод через кросс-внимание и LLM-модули, который позволяет обучать модели для узких задач без больших затрат.

Читать полностью…

🐍 Укус питона 🐍

Так и работаем

Читать полностью…

🐍 Укус питона 🐍

Так и работаем

Читать полностью…

🐍 Укус питона 🐍

Что делает @property в Python?

@property превращает метод класса в свойство, позволяя обращаться к нему без скобок.

Пример:

class Person:
def init(self, name):
self._name = name

@property
def name(self):
return self._name

p = Person("Alice")
print(p.name) # Alice (как атрибут, но с логикой)


Зачем нужно?

Позволяет использовать методы как атрибуты
Защищает данные от прямого изменения
Позволяет добавить логику без изменения интерфейса

⚡️ @property делает код чище и безопаснее, улучшая инкапсуляцию!

Читать полностью…

🐍 Укус питона 🐍

↔️ Разница между is и == в Python

🔹 == (равенство) проверяет, равны ли значения объектов:

a = [1, 2, 3]
b = [1, 2, 3]
print(a == b) # True (значения одинаковые)


🔹 is (идентичность) проверяет, указывают ли переменные на один и тот же объект в памяти:
print(a is b)  # False (разные объекты)


🔹 Но для immutable-объектов (например, int, str, tuple) Python кеширует значения:
x = 256
y = 256
print(x is y) # True (указывают на один объект)


✅ Используйте == для сравнения значений и is для проверки, ссылаются ли переменные на один объект в памяти!

Читать полностью…

🐍 Укус питона 🐍

🔥 lambda — короткие функции в Python

lambda — это анонимная функция, которая записывается в одну строку и не требует def. Используется там, где нужна простая операция без имени функции.

Пример (обычная функция vs. lambda):

def square(x):
return x ** 2

square_lambda = lambda x: x ** 2

print(square(5)) # 25
print(square_lambda(5)) # 25


🔹 Где используется?

1️⃣ map() — Применение функции к списку
nums = [1, 2, 3, 4]
squared = list(map(lambda x: x ** 2, nums))
print(squared) # [1, 4, 9, 16]


2️⃣ filter() — Фильтрация данных
even = list(filter(lambda x: x % 2 == 0, nums))
print(even) # [2, 4]


3️⃣ sorted() — Сортировка по ключу
pairs = [(1, 'one'), (3, 'three'), (2, 'two')]
pairs.sort(key=lambda x: x[0])
print(pairs) # [(1, 'one'), (2, 'two'), (3, 'three')]


⚡️ Когда использовать lambda?

Когда функция простая и короткая
Когда она нужна один раз

❌ Не стоит использовать lambda, если логика сложная – лучше писать def.

Читать полностью…

🐍 Укус питона 🐍

🔍 Как работает slots в Python и зачем его использовать?

slots — это механизм, который ограничивает атрибуты объекта и уменьшает потребление памяти, исключая хранение dict.

✅ Пример:

class Person:
slots = ("name", "age") # Разрешены только эти атрибуты

def init(self, name, age):
self.name = name
self.age = age

p = Person("Alice", 30)
p.city = "New York" # ❌ AttributeError: 'Person' object has no attribute 'city'


Использование slots делает объекты легче и быстрее, так как Python не создаёт динамический словарь для атрибутов. Это особенно полезно при работе с большим количеством объектов.

Читать полностью…

🐍 Укус питона 🐍

Зачем нужно ключевое слово yield в Python?

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

Пример:

def count_up_to(n):
count = 1
while count <= n:
yield count # Возвращает значение и приостанавливает выполнение
count += 1

for num in count_up_to(5):
print(num)


yield позволяет приостанавливать и возобновлять выполнение функции, экономя память и упрощая работу с потоками данных.

Читать полностью…

🐍 Укус питона 🐍

Что такое дескрипторы в Python и зачем они нужны?

Дескриптор — это объект, который управляет доступом к атрибутам класса через методы get, set и delete. Они позволяют гибко контролировать поведение атрибутов.

✅ Пример:

class Descriptor:
def init(self, value=None):
self.value = value

def get(self, instance, owner):
print("Getting value")
return self.value

def set(self, instance, value):
print("Setting value")
self.value = value

class MyClass:
attr = Descriptor()

obj = MyClass()
obj.attr = 42 # Setting value
print(obj.attr) # Getting value → 42


Дескрипторы используются в свойствах (property), ORM, логировании доступа и валидации данных. Они помогают гибко управлять состоянием объектов и позволяют писать более чистый код.

Читать полностью…

🐍 Укус питона 🐍

🔍 Как работает staticmethod vs classmethod в Python?

В Python есть два специальных декоратора для методов класса: @staticmethod и @classmethod. Они позволяют работать без создания экземпляра, но имеют ключевые различия.

✅ Пример:

class Example:
class_attr = "Hello"

@staticmethod
def static_method():
return "I'm a static method"

@classmethod
def class_method(cls):
return f"Class method: {cls.class_attr}"

print(Example.static_method()) # I'm a static method
print(Example.class_method()) # Class method: Hello


@staticmethod ведёт себя как обычная функция внутри класса, не имея доступа к атрибутам класса или экземпляра. @classmethod, наоборот, получает ссылку на класс (cls) и может изменять его атрибуты.

Используйте @staticmethod для независимых функций, а @classmethod, когда нужно работать с самим классом.

Читать полностью…

🐍 Укус питона 🐍

Автоматизация тестирования desktop приложений с помощью Dogtail

В статье рассмотрим, как Dogtail заменил Appium для тестирования отечественных Linux-приложений. Разберём его работу с GTK и Qt, взаимодействие через ATK и DBus, а также опыт использования.

Читать полностью…

🐍 Укус питона 🐍

Как работает itertools.cycle в Python?

itertools.cycle создаёт бесконечный итератор, который зацикливает последовательность, перезапуская её с начала после завершения.

✅ Пример:

from itertools import cycle

colors = ["red", "green", "blue"]
color_cycle = cycle(colors)

for _ in range(5):
print(next(color_cycle)) # red → green → blue → red → green


🔹 Зачем использовать?

• Повторение элементов списка без переписывания вручную.
• Автоматическое зацикливание без индексов.
• Полезно в анимациях, смене тем, бесконечных процессах.

itertools.cycle — мощный инструмент для циклических операций без лишнего кода.

Читать полностью…

🐍 Укус питона 🐍

⚡️ Как работает @staticmethod в Python?

Декоратор @staticmethod превращает метод класса в обычную функцию внутри класса, которая не получает ссылку на экземпляр (self) или класс (cls).

✅ Пример:

class MathUtils:
@staticmethod
def add(x, y):
return x + y

print(MathUtils.add(3, 5)) # 8


🔹 Зачем нужен?

• Используется, когда метод не зависит от состояния экземпляра или класса.
• Делает код логичнее, если метод просто выполняет действие, связанное с классом.
• Упрощает структуру, так как не требует создания объекта для вызова.

⚡️ Используйте @staticmethod, если метод не работает с self или cls, но логически относится к классу!

Читать полностью…

🐍 Укус питона 🐍

Как работает getitem в Python?

Метод getitem позволяет обращаться к объектам класса по индексу или ключу, как к спискам или словарям.

✅ Пример:

class CustomList:
def init(self, data):
self.data = data

def getitem(self, index):
return self.data[index] # Позволяет использовать obj[index]

nums = CustomList([10, 20, 30])
print(nums[1]) # 20


🔹 Зачем нужно?

• Позволяет настроить доступ к элементам объекта.
• Делает объекты итерируемыми (например, в for-циклах).
• Помогает создавать свои структуры данных, работающие как списки или словари.

⚡️ getitem делает объекты гибкими и удобными в использовании, улучшая читаемость кода!

Читать полностью…
Subscribe to a channel