ru
Feedback
🐍 Укус ΠΏΠΈΡ‚ΠΎΠ½Π° 🐍

🐍 Укус ΠΏΠΈΡ‚ΠΎΠ½Π° 🐍

ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π² Telegram

🐍 Канал ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° языкС Python. ВСматичСскиС ΡƒΡ€ΠΎΠΊΠΈ ΠΈ Π»Π°ΠΉΡ„Ρ…Π°ΠΊΠΈ. πŸ‘½ Админ - @tg_adminisrator πŸ”Š ΠšΡƒΠΏΠΈΡ‚ΡŒ Ρ€Π΅ΠΊΠ»Π°ΠΌΡƒ: https://telega.in/c/byteofpython πŸ‘‰ Π§Π°Ρ‚: @abyteofpython πŸ‘‰ ΠŸΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ с Π΄Ρ€ΡƒΠ·ΡŒΡΠΌΠΈ: @byteofpython

Π‘ΠΎΠ»ΡŒΡˆΠ΅
2 334
ΠŸΠΎΠ΄ΠΏΠΈΡΡ‡ΠΈΠΊΠΈ
НСт Π΄Π°Π½Π½Ρ‹Ρ…24 часа
-117 Π΄Π½Π΅ΠΉ
-3730 Π΄Π½Π΅ΠΉ
Архив постов
ΠœΠ°ΡΡΠΈΠ²Ρ‹ Π² 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)

photo content

πŸ‘©β€πŸ’» ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρ‹ Ρ‡Π΅Ρ€Π΅Π· Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ β€” Π½Π΅ просто подсказки Ρ‚ΠΈΠΏΠΎΠ² Аннотации Ρ‚ΠΈΠΏΠΎΠ² (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))

photo content

πŸ‘©β€πŸ’» ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» дСскрипторов β€” скрытый ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ свойств ΠΈ 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() ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ очисткС Π΄Π°Π½Π½Ρ‹Ρ…, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ строк, Π·Π°ΠΌΠ΅Π½Π΅ символов ΠΈ шаблонов Π² тСкстах. ΠœΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ измСняСт ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ строку, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ бСзопасным для ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования Π΄Π°Π½Π½Ρ‹Ρ…

photo content

πŸ‘©β€πŸ’» ΠœΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΡ β€” ускорСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π±Π΅Π· пСрСписывания Π»ΠΎΠ³ΠΈΠΊΠΈ ΠœΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΡ β€” это Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.
Если функция вызываСтся с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ возвращаСтся ΠΈΠ· памяти, Π° Π½Π΅ вычисляСтся Π·Π°Π½ΠΎΠ²ΠΎ
➑️ ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
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())