Ответ:
Anonymous Quiz
25%
calc, 10, 99, 10
13%
10, 99, 10
25%
calc, 10, calc, 99
38%
calc, 10, 99, calc, 10
Контекстные менеджеры позволяют автоматически управлять ресурсами — открытыми файлами, соединениями, блокировками.
Они гарантируют освобождение ресурсов даже при ошибках
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() удобно использовать при парсинге строк, чтении файлов, анализе данных и обработке команд. Без аргумента метод автоматически разделяет по пробелам — это особенно полезно для очистки и разбиения текста на слова
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 позволяет превратить методы класса в атрибуты, сохранив при этом логику вычислений или валидации.
Это делает интерфейс класса чистым и безопасным, без лишних вызовов и скобок.
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
Метаклассы в Python определяют, как создаются и ведут себя классы.
Они дают контроль над структурой, проверкой и автоматизацией при объявлении новых классов
class Validator(type):
def __new__(cls, name, bases, attrs):
if "validate" not in attrs:
raise TypeError("Класс должен содержать метод validate()")
return super().__new__(cls, name, bases, attrs)
class User(metaclass=Validator):
def validate(self):
return True
# class BrokenUser(metaclass=Validator): # ❌ Ошибка — нет метода validate()
📌 Здесь Validator проверяет, что каждый класс обязан иметь метод validate.
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет код?
def f():
xs = []
for x in range(3):
xs.append(lambda: x)
ys = [(lambda: y) for y in range(3)]
return [fn() for fn in xs], [fn() for fn in ys], x
print(f())
По умолчанию каждый объект в Python хранит свои атрибуты в
__dict__, что гибко, но затратно по памяти.С помощью __slots__ можно задать фиксированный набор атрибутов — без словаря
class User:
__slots__ = ("name", "age")
def __init__(self, name, age):
self.name = name
self.age = age
u = User("Анна", 25)
u.city = "Москва" # ❌ AttributeError
📌 __slots__ экономит память (до 30–40%) и ускоряет доступ к атрибутам.
Please open Telegram to view this post
VIEW IN TELEGRAM
Корутины в Python — это функции, которые приостанавливают выполнение с помощью await, освобождая поток для других задач.
Это ядро asyncio, позволяющее писать конкурентный код без блокировок
import asyncio
async def download(name, delay):
print(f"Начинаю {name}")
await asyncio.sleep(delay)
print(f"{name} готов")
async def main():
await asyncio.gather(
download("Файл 1", 2),
download("Файл 2", 1)
)
asyncio.run(main())
📌 Здесь оба «скачивания» выполняются параллельно, хотя используется всего один поток.
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет код?
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())
Мемоизация — это техника кэширования результатов функций.
Если функция вызывается с теми же аргументами, результат возвращается из памяти, а не вычисляется заново
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 заняло бы секунды, а с ним — доли миллисекунды.
Please open Telegram to view this post
VIEW IN TELEGRAM
Метод
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() удобно использовать при очистке данных, форматировании строк, замене символов и шаблонов в текстах. Метод не изменяет исходную строку, что делает его безопасным для повторного использования данных
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет код?
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)