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

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

Kanalga Telegram’da o‘tish

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

Ko'proq ko'rsatish
2 334
Obunachilar
Ma'lumot yo'q24 soatlar
-117 kunlar
-3730 kunlar
Postlar arxiv
Массивы в pattern matching. В качестве шаблонов также могут выступать массивы. Подобным шаблоны также могут содержать либо ко
Массивы в pattern matching. В качестве шаблонов также могут выступать массивы. Подобным шаблоны также могут содержать либо конкретные значения, либо переменные, которые передаются элементы массивов, либо символ прочерка _, если элемент массива не важен. В данном случае функция print_people принимает массив, который, как предполагается, состоит из трех элементов, рассмотрим их в следующей части. 🐍 Укус питона // 💬 Чат // #теория #pattern_matching #массивы

👩‍💻 Динамическое создание классов — метапрограммирование в чистом виде В Python классы — это тоже объекты, и их можно создавать "на лету" с помощью функции type(). Это открывает путь к динамическому API, автоматическим моделям и DSL. ➡️ Пример:
def make_model(name, **fields):
    return type(name, (object,), fields)

User = make_model("User", name="Анна", age=25)
print(User.name)  # Анна

admin = User()
admin.role = "admin"
print(admin.role)  # admin
📌 Здесь type() создаёт новый класс User прямо во время исполнения.

Ответ:
Anonymous voting

Что выведет код?
x = 0

def outer():
    x = 1
    def inner():
        nonlocal x
        x += 1
        return x
    print("A", inner(), x)
    x = 5
    print("B", inner(), x)

outer()
print("G", x)

👩‍💻 Контракты через аннотации — не просто подсказки типов Аннотации типов (type hints) — это не только помощь IDE. С их помощью можно внедрять контроль логики исполнения — проверять типы, значения и инварианты прямо во время работы программы. ➡️ Пример:
from typing import get_type_hints

def enforce_types(func):
    hints = get_type_hints(func)
    def wrapper(*args, **kwargs):
        for name, arg in zip(hints, args):
            if not isinstance(arg, hints[name]):
                raise TypeError(f"{name} должен быть {hints[name].__name__}")
        return func(*args, **kwargs)
    return wrapper

@enforce_types
def greet(name: str, age: int):
    print(f"{name}, {age}")

greet("Анна", 25)   # ✅
greet("Анна", "25") # ❌ TypeError
📌 Здесь аннотации становятся частью исполняемого контракта, а не просто документацией.

👩‍💻 WeakRef — как избежать утечек памяти в Python Иногда объект больше не нужен, но на него всё ещё ссылаются другие части программы. Обычная ссылка удерживает объект в памяти, а слабая ссылка (weak reference) — нет.
Она не мешает сборщику мусора удалить объект, если больше нет сильных ссылок
➡️ Пример:
import weakref

class Data:
    def __init__(self, name):
        self.name = name
    def __del__(self):
        print(f"{self.name} удалён")

obj = Data("Test")
ref = weakref.ref(obj)

print(ref())  # <__main__.Data object at ...>

del obj
print(ref())  # None — объект собран GC
📌 weakref.ref() создаёт слабую ссылку: объект может быть удалён, даже если ссылка ещё существует.

Ответ:
Anonymous voting

Что выведет код?
import itertools

lst = [[1, 2], [3]]
it = itertools.chain.from_iterable(lst)
print(next(it))
lst.append([4, 5])
print(list(it))

👩‍💻 Протокол дескрипторов — скрытый механизм свойств и ORM В Python за @property, staticmethod, classmethod и даже ORM-поля стоит единый механизм — дескрипторы.
Это объекты, которые управляют доступом к атрибутам через методы __get__, __set__, __delete__
➡️ Пример:
class LoggedAttribute:
    def __init__(self, name):
        self.name = name

    def __get__(self, instance, owner):
        value = instance.__dict__.get(self.name)
        print(f"Получено {self.name} = {value}")
        return value

    def __set__(self, instance, value):
        print(f"Изменено {self.name} = {value}")
        instance.__dict__[self.name] = value


class User:
    age = LoggedAttribute("age")


u = User()
u.age = 30
print(u.age)
📌 При обращении к u.age срабатывают методы дескриптора, а не прямой доступ к атрибуту.

👩‍💻 Протокол итерации — как работает цикл for под капотом В Python любой объект можно сделать итерируемым, если он реализует протокол итерации — методы __iter__() и __next__().
Это основа работы for, генераторов, списковых включений и даже файлов
➡️ Пример:
class Counter:
    def __init__(self, limit):
        self.limit = limit
        self.value = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.value < self.limit:
            self.value += 1
            return self.value
        raise StopIteration

for i in Counter(3):
    print(i)
# 1 2 3
📌 Цикл for просто вызывает next() до тех пор, пока не появится StopIteration.

Ответ:
Anonymous voting

Что выведет код?
class A:
    def __eq__(self, o): return isinstance(o, A)

class B:
    def __eq__(self, o): return isinstance(o, B)
    __hash__ = object.__hash__

s = set()
try:
    s.add(A())
except TypeError:
    print("A")
b = B()
s.add(b)
print("B", b in s)

Зачем используется метод replace() в Python и когда его применять? Метод replace() возвращает новую строку, в которой все вхождения указанной подстроки заменены на другую. Это удобный способ быстро изменить текст без сложных регулярных выражений. Пример:
text = "Python is hard, but Python is fun!"
new_text = text.replace("Python", "Coding")
print(new_text)
# ➜ Coding is hard, but Coding is fun!
📌В этом примере replace() заменяет все вхождения слова "Python" на "Coding"
replace() удобно использовать при очистке данных, форматировании строк, замене символов и шаблонов в текстах. Метод не изменяет исходную строку, что делает его безопасным для повторного использования данных

👩‍💻 Мемоизация — ускорение функций без переписывания логики Мемоизация — это техника кэширования результатов функций.
Если функция вызывается с теми же аргументами, результат возвращается из памяти, а не вычисляется заново
➡️ Пример:
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(35))  # быстро!
📌 Здесь @lru_cache запоминает все вызовы fib(). Без него вычисление числа Фибоначчи 35 заняло бы секунды, а с ним — доли миллисекунды.

Ответ:
Anonymous voting

Что выведет код?
import asyncio

async def worker():
    await asyncio.sleep(0.05)
    return "ok"

async def main():
    t = asyncio.create_task(worker())
    try:
        await asyncio.wait_for(asyncio.shield(t), timeout=0.01)
    except asyncio.TimeoutError:
        print("timeout")
    print(t.cancelled(), t.done())
    print(await t)

asyncio.run(main())