Python на примерах
1.39K subscribers
411 photos
6 videos
145 links
Короткие уроки Python на примерах
Download Telegram
Когда ты вызываешь id(Ok()), происходит магия:
1. Создаётся объект класса Ok.
2. Функция id() возвращает его адрес в памяти.
3. Объект тут же уничтожается, потому что больше нигде не используется.

А теперь фокус: при следующем вызове id(Ok()) — Python создаёт новый, но точно такой же объект, и... размещает его на том же месте в памяти. Поэтому id() снова возвращает тот же адрес.

Кажется, будто объект остался, но это просто Python оптимизирует работу с памятью.
reversed(x) — это итератор, который позволяет пройтись по объекту в обратном порядке. В нашем случае — это 3, 2, 1. Но так как это итератор, пройтись по нему можно только один раз.

При следующем вызове он ничего не вернёт, и результат сравнения sorted([3, 2, 1]) == sorted([]) даст False.
Про метод str.split(sep)

Все знают, что он разделяет строку по sep, но у него есть свои особенности. И первое, это если sep не указан, то есть None.

Тогда ряды пробелов рассматриваются как один разделитель и, к тому же, в результате не будет пустых строк в начале и в конце.

Если sep передан, то разделители не группируются, а значит на месте повторов образуется ''. Также, разделение пустой строки всегда вернёт [''].
❤2
Упрощаем поиск багов с помощью assert в Python

Функция для вычисления площади квадрата со стороной 5 должна вернуть 25. А что если нет? Самый быстрый способ проверить — использовать assert.

Если условие в первом аргументе False, будет вызвано AssertionError, а второй аргумент (если он есть) выведет сообщение.

Чтобы отключить проверку, используйте флаг -O при запуске: python3 -O foo.py. Подробнее в документации https://docs.python.org/3/reference/simple_stmts.html#grammar-token-python-grammar-assert_stmt
👍2
Правильная сортировка символов по алфавиту

Буквы сортируются не по алфавиту, а по их позиции в таблице UTF-16. Значение символа можно получить с помощью ord(x).

Символы в верхнем регистре имеют меньший код, чем в нижнем, поэтому они оказываются в начале списка при сортировке.
👍4
Создаём интерфейс командной строки

Если создаёте консольное приложение, важно, чтобы пользователи могли легко с ним работать. Для этого на помощь приходит fire.

Установка: pip install fire

Модуль использует ООП-стиль, что упрощает интеграцию в ваш проект.

Кроме того, он позволяет работать с атрибутами, переданными в него. Подробнее об этом и многом другом в документации
Работа с декораторами в Python

Декораторы — это мощный инструмент для изменения поведения функций или методов. С помощью декораторов можно добавлять функциональность, не изменяя сам код функции.

Пример:
def my_decorator(func):
def wrapper():
print("До выполнения функции")
func()
print("После выполнения функции")
return wrapper

@my_decorator
def hello():
print("Привет!")

hello()


С помощью @my_decorator мы оборачиваем функцию hello, добавляя код до и после её вызова.
👍4👎1
🔧 Как "привинтить" функцию к объекту на лету с помощью `types.MethodType`

Иногда нужно добавить методу немного гибкости... прямо во время выполнения 😏
С помощью types.MethodType можно прикрепить обычную функцию к экземпляру класса, превратив её в метод — с доступом к self и всему, что ему положено.

Это особенно полезно, когда структура объекта формируется динамически, и заранее всё не пропишешь.

В этом примере функция external_function добавляется в экземпляр класса MyClass как метод. Это позволяет вызывать её как обычный метод класса, используя атрибуты экземпляра.
👍2❤1
Что такое замыкания?

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

Пример:
def outer():
x = 10
def inner():
print(x)
return inner

closure = outer()
closure() # Выведет 10


В этом примере, даже после завершения работы функции outer, функция inner продолжает "помнить" переменную x.
❤4👎1
🧵 `contextlib.nested` — управление несколькими контекстами в старом стиле

Раньше для работы с несколькими менеджерами контекста использовали contextlib.nested. Он позволял аккуратно открывать несколько ресурсов в одной конструкции.

Сейчас считается устаревшим — используйте множественные with, генераторы или ExitStack.

Если тебе нужно открыть несколько файлов (или других ресурсов), особенно в цикле, contextlib.ExitStack — твоё всё:

from contextlib import ExitStack

filenames = ["file1.txt", "file2.txt", "file3.txt"]

with ExitStack() as stack:
files = [stack.enter_context(open(fname)) for fname in filenames]
for f in files:
print(f.read())


📦 Удобно, когда количество контекстов заранее не известно. Все ресурсы закроются автоматически при выходе из блока with.
Что такое генераторы?

Генераторы позволяют вам создавать итераторы "на лету", не загружая всю коллекцию в память. Генератор возвращает элементы по одному, когда они запрашиваются.

Пример:
def countdown(n):
while n > 0:
yield n
n -= 1

gen = countdown(5)
for num in gen:
print(num)


Генератор countdown создает последовательность чисел от 5 до 1, не загружая их все сразу в память.

ния на ноль будет перехвачена, и вместо аварийного завершения программы выведется сообщение об ошибке.
👍3
В Python имя переменной может состоять из одного подчеркивания: _. Хотя обычно такие имена не достаточно описательны и не должны использоваться, есть по крайней мере три случая, когда _ имеет общепринятый смысл.

Во-первых, интерактивные интерпретаторы Python используют _ для хранения результата последнего выполненного выражения:

>>> 2 + 2
4
>>> _
4

Во-вторых, руководство модуля gettext рекомендует псевдоним его функции gettext() для _(), чтобы минимизировать загромождение вашего кода.

В-третьих, _ используется, когда вам нужно придумать имена для значений, которые вам не нужны:

for _ in range(10):
print('Hello!')
👍3
Как работает исключение `try-except`?

Блоки try и except используются для обработки ошибок. Код внутри блока try выполняется, и если возникает ошибка, она перехватывается блоком except.

Пример:
try:
x = 1 / 0
except ZeroDivisionError:
print("Деление на ноль невозможно!")


Здесь ошибка деления на ноль будет перехвачена, и вместо аварийного завершения программы выведется сообщение об ошибке.
👍1
pywin32 + GetSystemMetrics — получаем системную инфу в Windows

С помощью библиотеки pywin32 можно вытаскивать системные параметры прямо из Windows API. Получаем разрешение монитора.
👍1
⚙️ concurrent.futures.as_completed() — обрабатывай задачи по мере готовности

Когда запускаешь несколько задач параллельно, не всегда стоит ждать, пока завершатся все. С as_completed() можно обрабатывать результаты сразу, как только задача выполнится
👍4
Фильтрация значений False

Этот пример используется для устранения всех ложных значений из списка, например false, 0, None, " ".
Составной вывод

Простой способ — сложение (конкатенация) строк. Хорошо с одной переменной в строке, а если их больше — читается с трудом.

print('Hello ' + name + ' — ' + str(age) + ' y.o.')

Функция format() позволяет формировать понятный вывод не только для пользователя, но и для программиста.

print('Hello {} — {} y.o.'.format(name, age))

Python последовательно проставляет номера для скобок и передает им значения переменных, последовательно указанных в аргументе.
NumPy: concatenate

Функция numpy.concatenate() используется для объединения массивов вдоль существующих осей. Это позволяет объединять несколько массивов NumPy в один массив. Мы передаем последовательность массивов, которые хотим объединить, в функцию concatenate() вместе с осью. Если ось не передана явно, она принимается за 0.
Преобразование текста в речь

Этот проект на Python использует ряд новых библиотек для преобразования существующей статьи в воспроизводимый mp3-файл. Вам нужно будет установить nltk (natural language toolkit), newspaper3k и gtts.

Программа простая, поскольку мы просто передаем URL-адрес статьи для преобразования, а затем позволяем функции обрабатывать преобразование текста в речь с помощью наших недавно установленных модулей.
Как округлить число до нужного знака после запятой?

Новички часто пытаются округлять числа вручную или с помощью форматирования строк. Однако в Python есть встроенная функция round(), которая делает это просто и понятно.

Функция round(число, знаки) округляет число до указанного количества знаков после запятой. Если не указывать второй аргумент — округлит до целого. Удобно для вывода результатов вычислений, цен или процентов.

Итог:
round(x, n) — округление числа x до n знаков после запятой.
Без второго аргумента округляет до целого.
Полезно при работе с деньгами, метриками и графиками.
👍3