10 продвинутых приёмов Python, которые прокачают ваш уровень кодинга
Python остаётся языком, который любят за его лаконичность, читаемость и гибкость. Он одинаково уместен и в машинном обучении, и в веб-разработке, и в автоматизации. Но быть сильным питонистом — это не только знать синтаксис. Это умение писать код элегантно, эффективно и понятно. В этом материале — 10 коротких сниппетов, которые помогут вам мыслить как профессионал и писать чище.
1. Операции с множествами
Множества (set) поддерживают мощные операции: объединение, пересечение и разность. Это простой и быстрый способ работать с уникальными элементами.
set1 = {1, 2, 3}
set2 = {3, 4, 5}
union = set1 | set2
intersection = set1 & set2
difference = set1 - set2
print(union) # {1, 2, 3, 4, 5}
print(intersection) # {3}
print(difference) # {1, 2}2. Частичные функции
Иногда удобно «зафиксировать» часть аргументов функции и получить новую — более конкретную. (functools.partial)
from functools import partial
def power(base, exponent):
return base ** exponent
square = partial(power, exponent=2)
cube = partial(power, exponent=3)
print(square(2)) # 4
print(cube(2)) # 83. Мемоизация
Кэширование результатов функций экономит массу времени при повторных вызовах.
from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
print(fib(10)) # 55lru_cache запоминает результаты, превращая рекурсию в молниеносную операцию.
4. Метаклассы и паттерн Singleton
Метаклассы — это классы для классов. Через них можно контролировать создание объектов, например, сделать Singleton.
class SingletonMeta(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super().__call__(*args, **kwargs)
return cls._instances[cls]
class Singleton(metaclass=SingletonMeta):
pass
obj1 = Singleton()
obj2 = Singleton()
print(obj1 is obj2) # True5. Асинхронность
Асинхронное программирование позволяет выполнять несколько задач одновременно, не блокируя поток.
import asyncio
async def greet(name):
await asyncio.sleep(1)
print(f"Hello, {name}!")
async def main():
await asyncio.gather(greet("Alice"), greet("Bob"))
asyncio.run(main()6. Дата-классы
Дата-классы экономят десятки строк кода при описании простых структур данных.
from dataclasses import dataclass
@dataclass
class Point:
x: float
y: float
p = Point(1.5, 2.5)
print(p) # Point(x=1.5, y=2.5) Автоматически создаются init, repr, eq и другие методы.
7. Декораторы с аргументами
Декораторы в Python могут принимать параметры, что делает их гибкими и мощными.
def repeat(num_times):
def decorator_repeat(func):
def wrapper(*args, **kwargs):
for _ in range(num_times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator_repeat
@repeat(num_times=3)
def greet(name):
print(f"Hello, {name}!")
greet("Alice")Так можно легко управлять поведением функций без дублирования кода.
8. Перегрузка функций
С помощью @singledispatch можно создавать универсальные функции, которые ведут себя по-разному в зависимости от типа аргумента.
from functools import singledispatch
@singledispatch
def process(arg):
print("Default processing:", arg)
@process.register(int)
def _(arg):
print("Processing an integer:", arg)
@process.register(list)
def _(arg):
print("Processing a list:", arg)
process(10)
process([1, 2, 3])Это своего рода «типизированная перегрузка» функций, реализованная питоновским способом.
9. Асинхронные итераторы
Асинхронные итераторы (async for) позволяют обрабатывать данные по мере их поступления.
import asyncio
async def async_generator():
for i in range(3):
yield i
await asyncio.sleep(1)
async def main():
async for item in async_generator():
print(item)
asyncio.run(main())Незаменимо при работе с потоками данных или API.
10. Динамический доступ к атрибутам
getattr позволяет обращаться к атрибутам объектов по строковому имени — удобно для метапрограммирования и динамических сценариев.
class MyClass:
def __init__(self):
self.x = 10
self.y = 20
obj = MyClass()
attribute_name = "x"
print(getattr(obj, attribute_name)) # 10 Если атрибут неизвестен заранее — getattr выручит.
Заключение
Каждый из этих сниппетов — не просто трюк, а инструмент, который улучшает стиль и архитектуру вашего кода.
Используйте их, чтобы писать не просто работающий, а профессиональный Python — чистый, читаемый и масштабируемый.
Экспериментируйте, адаптируйте под свои проекты и совершенствуйте своё мышление разработчика.