Telegram Web Link
Python backend

Python - Архитектура кода
Python - Базы данных и миграции
Python - Тестирование
Python - Тестирование
Нагрузочное тестирование
Нагрузочное тестирование (лайвкодинг)
Девопс, деплой, CI/CD. Часть 1
Девопс, деплой, CI/CD. Часть 2
Архитектура распределенных систем
Python - Дебаг - логирование - профилирование
Код-ревью
Python - Асинхронное программирование. Часть 1
Python - Асинхронное программирование. Часть 2
Отбор в IT компанию
Лекция Практики разработчиков
Интенсив по алгоритмам. Введение
Интенсив по алгоритмам. Разбор ДЗ 2

Все видео доступны на youtube

👉@BookPython
👍4😁1
Генераторы — один из самых полезных механизмов в Python. Они имеют множество применений, одно из которых — создание менеджеров контекста. Обычно нужно вручную определять магические методы __enter__ и __exit__, но декоратор @contextmanager из модуля contextlib делает это намного удобнее:


from contextlib import contextmanager

@contextmanager
def atomic():
print('BEGIN')

try:
yield
except Exception:
print('ROLLBACK')
else:
print('COMMIT')

Теперь atomic — это менеджер контекста, который можно использовать следующим образом:



In : with atomic():
...: print('ERROR')
...: raise RuntimeError()
...:
BEGIN
ERROR
ROLLBACK

Кроме того, @contextmanager позволяет использовать его как декоратор, так и менеджер контекста.


In : @atomic()
...: def ok():
...: print('OK')
...:
In : ok()
...:
BEGIN
OK
COMMIT

👉@BookPython
👍5
Вредные советы python разработчику


l=[['a', 'b', 'c'], ['1', '2'], ['#']]
sum(l, [])


В Python можно выпрямить вложенные списки с помощью... функции sum(). Вот код (выполнять, пока никто не видит):

Дело в том, что sum() принимает первым аргументом итерируемый объект, а вторым — значение, с которого начинается операция. По умолчанию это 0, но если указать пустой список [], то sum() начнёт с него. Затем sum() последовательно применяет операцию сложения к элементам первого аргумента, начиная со значения второго аргумента. В случае списков это означает конкатенацию.

👉@BookPython
👍61
Простая, но гибкая естественная сортировка на языке Python

Когда вы пытаетесь отсортировать список строк, содержащих числа, обычный алгоритм сортировки python сортирует лексикографически, поэтому вы можете не получить ожидаемых результатов

>>> a = ['2 ft 7 in', '1 ft 5 in', '10 ft 2 in', '2 ft 11 in', '7 ft 6 in']
>>> sorted(a)
['1 ft 5 in', '10 ft 2 in', '2 ft 11 in', '2 ft 7 in', '7 ft 6 in']


https://github.com/SethMMorton/natsort

👉@BookPython
👍1
В Python вы можете переопределить оператор квадратных скобок ([]), определив магический метод getitem. Примером может быть объект Cycle, который виртуально содержит бесконечное количество повторяющихся элементов:


class Cycle:
def __init__(self, lst):
self._lst = lst

def __getitem__(self, index):
return self._lst[index % len(self._lst)]

print(Cycle(['a', 'b', 'c'])[100]) # prints 'b'


Необычность здесь заключается в том, что оператор [] поддерживает уникальный синтаксис. Он может использоваться не только так — [2], но и так — [2:10], или [2:10:2], или [2::2], или даже [:]. Семантика — [start:stop:step], но вы можете применять её так, как вам нужно, для ваших собственных объектов.

Но что же получает getitem в качестве параметра index, если использовать этот синтаксис? Для этого существуют объекты slice.


In : class Inspector:
...: def __getitem__(self, index):
...: print(index)
...:
In : Inspector()[1]
1
In : Inspector()[1:2]
slice(1, 2, None)
In : Inspector()[1:2:3]
slice(1, 2, 3)
In : Inspector()[:]
slice(None, None, None)


Вы даже можете комбинировать синтаксис кортежей и срезов:


In : Inspector()[:, 0, :]
(slice(None, None, None), 0, slice(None, None, None))


Slice не делает ничего, кроме как просто хранит атрибуты start, stop и step.


In : s = slice(1, 2, 3)
In : s.start
Out: 1
In : s.stop
Out: 2
In : s.step
Out: 3


👉@BookPython
👍5
Что такое контекстный менеджер в Python?

Контекстный менеджер в Python — это специальный тип объекта, который определяет методы enter() и exit() и используется с инструкцией with. Эти объекты часто применяются в операциях, которые требуют установки и освобождения ресурсов. 

Частый сценарий — это работа с файлом:


with open('file.txt', 'r') as file:
data = file.read()


Здесь контекстный менеджер гарантирует, что файл будет корректно закрыт после завершения блока with, даже если при чтении файла возникнет исключение.

Вот как можно написать простой контекстный менеджер самостоятельно:


import time

class Timer:
def __enter__(self):
self.start = time.time()

def __exit__(self, exc_type, exc_val, exc_tb):
self.end = time.time()
print(f'Время выполнения: {self.end - self.start:.2f} секунд')

with Timer():
# код, время выполнения которого нужно измерить
time.sleep(2)


👉@BookPython
👍4👎1
2025/07/09 20:15:28
Back to Top
HTML Embed Code: