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))    # 8

3. Мемоизация

Кэширование результатов функций экономит массу времени при повторных вызовах.

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))  # 55

lru_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)  # True

5. Асинхронность

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

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 — чистый, читаемый и масштабируемый.

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