🐍 Укус питона 🐍
前往频道在 Telegram
🐍 Канал о программировании на языке Python. Тематические уроки и лайфхаки. 👽 Админ - @tg_adminisrator 🔊 Купить рекламу: https://telega.in/c/byteofpython 👉 Чат: @abyteofpython 👉 Поделиться с друзьями: @byteofpython
显示更多2 334
订阅者
无数据24 小时
-117 天
-3730 天
正在加载数据
相似频道
标签云
进出提及
---
---
---
---
---
---
吸引订阅者
十月 '2610月 '26
十月 '260
在0个频道中
九月 '260
在0个频道中
Get PRO
八月 '260
在0个频道中
Get PRO
七月 '260
在0个频道中
Get PRO
六月 '260
在0个频道中
Get PRO
五月 '260
在0个频道中
Get PRO
四月 '260
在0个频道中
Get PRO
三月 '26
+2
在0个频道中
Get PRO
二月 '26
+2
在0个频道中
Get PRO
一月 '26
+5
在0个频道中
Get PRO
十二月 '25
+1
在0个频道中
Get PRO
十一月 '25
+3
在0个频道中
Get PRO
十月 '25
+5
在0个频道中
Get PRO
九月 '25
+5
在0个频道中
Get PRO
八月 '25
+7
在0个频道中
Get PRO
七月 '25
+6
在0个频道中
Get PRO
六月 '25
+4
在0个频道中
Get PRO
五月 '25
+3
在0个频道中
Get PRO
四月 '25
+53
在0个频道中
Get PRO
三月 '25
+9
在0个频道中
Get PRO
二月 '25
+11
在0个频道中
Get PRO
一月 '25
+10
在0个频道中
Get PRO
十二月 '24
+8
在0个频道中
Get PRO
十一月 '24
+9
在0个频道中
Get PRO
十月 '24
+9
在0个频道中
Get PRO
九月 '24
+15
在0个频道中
Get PRO
八月 '24
+11
在0个频道中
Get PRO
七月 '24
+15
在0个频道中
Get PRO
六月 '24
+10
在0个频道中
Get PRO
五月 '24
+20
在0个频道中
Get PRO
四月 '24
+17
在0个频道中
Get PRO
三月 '24
+25
在0个频道中
Get PRO
二月 '24
+18
在1个频道中
Get PRO
一月 '24
+12
在0个频道中
Get PRO
十二月 '23
+7
在1个频道中
Get PRO
十一月 '23
+232
在8个频道中
Get PRO
十月 '23
+13
在1个频道中
Get PRO
九月 '23
+14
在0个频道中
Get PRO
八月 '23
+18
在0个频道中
Get PRO
七月 '23
+21
在0个频道中
Get PRO
六月 '23
+9
在0个频道中
Get PRO
五月 '23
+17
在0个频道中
Get PRO
四月 '23
+27
在0个频道中
Get PRO
三月 '23
+48
在0个频道中
Get PRO
二月 '23
+50
在0个频道中
Get PRO
一月 '23
+77
在0个频道中
Get PRO
十二月 '22
+359
在0个频道中
Get PRO
十一月 '22
+259
在0个频道中
Get PRO
十月 '22
+823
在0个频道中
Get PRO
九月 '22
+1 769
在0个频道中
Get PRO
八月 '22
+1 898
在0个频道中
| 日期 | 订阅者增长 | 提及 | 频道 | |
| 26 十月 | 0 | |||
| 25 十月 | 0 | |||
| 24 十月 | 0 | |||
| 23 十月 | 0 | |||
| 22 十月 | 0 | |||
| 21 十月 | 0 | |||
| 20 十月 | 0 | |||
| 19 十月 | 0 | |||
| 18 十月 | 0 | |||
| 17 十月 | 0 | |||
| 16 十月 | 0 | |||
| 15 十月 | 0 | |||
| 14 十月 | 0 | |||
| 13 十月 | 0 |
频道帖子
Массивы в pattern matching.
В качестве шаблонов также могут выступать массивы. Подобным шаблоны также могут содержать либо конкретные значения, либо переменные, которые передаются элементы массивов, либо символ прочерка _, если элемент массива не важен.
В данном случае функция print_people принимает массив, который, как предполагается, состоит из трех элементов, рассмотрим их в следующей части.
🐍 Укус питона // 💬 Чат // #теория #pattern_matching #массивы
| 2 | 👩💻 Динамическое создание классов — метапрограммирование в чистом виде
В 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 прямо во время исполнения. | 236 |
| 3 | Ответ: | 225 |
| 4 | Что выведет код?
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) | 194 |
| 5 | 没有文字... | 200 |
| 6 | 👩💻 Контракты через аннотации — не просто подсказки типов
Аннотации типов (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
📌 Здесь аннотации становятся частью исполняемого контракта, а не просто документацией. | 193 |
| 7 | 👩💻 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() создаёт слабую ссылку: объект может быть удалён, даже если ссылка ещё существует. | 164 |
| 8 | Ответ: | 159 |
| 9 | Что выведет код?
import itertools
lst = [[1, 2], [3]]
it = itertools.chain.from_iterable(lst)
print(next(it))
lst.append([4, 5])
print(list(it)) | 159 |
| 10 | 没有文字... | 170 |
| 11 | 👩💻 Протокол дескрипторов — скрытый механизм свойств и 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 срабатывают методы дескриптора, а не прямой доступ к атрибуту. | 161 |
| 12 | 👩💻 Протокол итерации — как работает цикл 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. | 147 |
| 13 | Ответ: | 153 |
| 14 | Что выведет код?
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) | 164 |
| 15 | ❓ Зачем используется метод 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() удобно использовать при очистке данных, форматировании строк, замене символов и шаблонов в текстах. Метод не изменяет исходную строку, что делает его безопасным для повторного использования данных | 151 |
| 16 | 没有文字... | 196 |
| 17 | 👩💻 Мемоизация — ускорение функций без переписывания логики
Мемоизация — это техника кэширования результатов функций.
Если функция вызывается с теми же аргументами, результат возвращается из памяти, а не вычисляется заново
➡️ Пример:
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 заняло бы секунды, а с ним — доли миллисекунды. | 222 |
| 18 | Ответ: | 199 |
| 19 | Что выведет код?
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()) | 197 |
| 20 | 没有文字... | 167 |
