Разъяснивший Python
8.47K subscribers
2.25K photos
37 videos
30 files
2.08K links
Твой проводник в омут Python'а

Ссылка: @Portal_v_IT

Сотрудничество: @oleginc, @tatiana_inc

Канал на бирже: https://telega.in/c/python_pssss
Download Telegram
Подробнее разбираем type hints

Да, аннотацию типов ещё называют type hints. В модуле typing можно найти кучу полезных полезных объектов для работы с подсказками.

Самые часто используемые: коллекции (List, Dict, Tuple), Any, Union, Optional. Когда мы их используем, мы в квадратных скобках передаём тип, с которым работает объект.

#теория
Дзен Python

Предыстория: Тим Петерс решил составить правила для написания хорошего кода и назвал его «Дзен Python». Правил должно быть 20, но одного не хватает.

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

Прочитать его можно выполнив import this. Кстати, если посмотреть код модуля, то можно заметить нарушение чуть ли не всех правил :)

#теория
Переменная «_»

Если вы увидели такое название то знайте, что эта переменная просто необходима (без неё ничего не заработает), но нигде не используется.

Часто встречается в циклах и при распаковке. Кстати, два, три, четыре нижних подчёркивания несут ту же функцию, просто _ уже занято.

К тому же её использует интерпретатор Python, чтобы сохранять туда результат работы последней команды.

#теория
Методы генераторов

Всего их три: close, throw, send. Первые два нам не интересны, поскольку они просто прерывают работу генератора и/или выводят ошибку (если это throw).

send() же позволяет передавать значения генератору. В первый раз всегда должно передаваться None, что бы запустить функцию.

К слову, с помощью send() создают корутины — функции, которым можно передавать значения, останавливать и возобновлять работу программы.

#теория
Немного фактов про Python

— Думаете, Python — молодой язык? На самом деле он старше Java, ей только 27 лет, а Python уже стукнуло 28.

— Название пошло в честь «Монти Пайтона (Monty Python)», ведущего любимого шоу разработчика «Летающий цирк Монти Пайтона».

— В 2015 году родители и дети предпочитали изучать в школах Python, а не французский язык. И это было в Великобритании.

#факты
Оператор yield

Он позволяет создавать функции-генераторы. Они могут просчитать и вернуть несколько значений но не за раз.

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

По генератору можно пройтись так же, как и по списку, используя for. Или с помощью функции next().

Почему нельзя вернуть значения в виде списка? Список будет занимать очень много места, если в нём будет более 1000000 элементов, а генератор — нет.

#теория
Отсутствующие элементы в словаре

Если в словаре нет определённого ключа, то он вызывает __missing __. Суть в том, что мы можем переопределить этот метод.

Кстати, примерно таким же образом, как и на фото выше, реализован defaultdict из модуля collections.

#теория
Класс с данными

У всех классов есть данные, но есть те, которые используются специально для хранения информации о пользователе, позиции и т.д. Создавать их проще всего с @dataclass из dataclasses.

Декоратор самостоятельно создаёт __init__, __eq__, __str__ и множество других важных методов на основе статических переменных. Документация.

#теория
⚡️ Шутки про Python

Удивительно, но в документации python есть раздел — humor. Это набор шуток, связанных с нашим любимым языком. Вот одна из них:

Маленькая девочка пришла на шоу домашних животных и просит ваббита (wabbit). Продавец смотрит на нее, улыбается и говорит:

- Хочешь милого пушистого белого кролика или миленького коричневого кролика?

- На самом деле, - говорит маленькая девочка, - я не думаю, что мой питон что-то заметит.

#теория
Вы точно понимаете, как работает словарь?

Начнём с того, что нам нужны хешируемые объекты, это те, у которых реализована функция __hash__. Чаще всего это неизменяемые типы (tuple, str) или пользовательские классы.

После нам нужна хеш-таблица. Примерная её реализация есть на фото выше. Разобраться, как она работает, можно самостоятельно, но лучше прочитать классную статью, из которой я и украл код :)

#объяснение
Что такое __all__ ?

Вот вы написали from module import * и к вам в код попало кучу классов, которые используются только внутри модуля, снаружи они бесполезны.

Избавиться от мусора можно, если записать в __all__ список имён всех объектов (классов, функций, переменных), которые надо импортировать. Документация.

Кстати, объекты, которые начинаются на нижнее подчёркивание тоже не импортируются.

#теория
global vs nonlocal

global
— перечисленные идентификаторы стоит воспринимать как глобальные. А глобальные это те, которые доступны из любого места в модуле.

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

#теория
Объединяем словари

В Python 3.9 добавили оператор |, который позволяет быстро объединить два словаря. Подробнее в PEP 584.

Если у вас версия Python 3.5+, то вам надо использовать {**a, **b}. Подробнее в PEP 448.

Для ещё более старых версий используют update, как на примере выше.

Во всех способах значения из первого словаря перезаписываются на значения второго словаря.

#теория
__init__ и __new__

__new__(cls)
создаёт экземпляр класса. Это статический метод, который вызывается когда мы пишем MyClass().

В то время как __init__(self) инициализирует класс. То есть задаёт значения переменным, что-то считает.

__init__ всегда вызывается после __new__, если функция вернула экземпляр cls, то есть класса.

#теория
Импортируем пакеты

Что может быть проще? Но у Python есть несколько фишек, которые упростят работу с пакетами.

1. import <package> — просто импорт.

2. from <package> import <obj>«вытаскивает» obj (функция, класс, переменная) из пакета. Можно импортировать всё, если написать на место <obj> звёздочку.

3. import <package> as <name> — импортирует модуль и задаёт имя, записанное после as. Работает и с from <package> import <obj> as <name>.

Последнее удобно использовать для совместимости или если у вас несколько модулей, которые работают одинаково.

#теория
Только ключевые и только позиционные аргументы

Начнём с терминов. Позиционные аргументы — те, что передаются по позиции (спасибо, капитан очевидность). Ключевые — те, что передаются за счёт key=value.

Все аргументы до косой черты (/) считаются позиционными, то есть передать в них данные можно только в определённом порядке.

Все аргументы после звёздочки (*) считаются ключевыми, то есть передать данные можно только с помощью key=value.

#теория
Три помощника в работе с циклами

enumerate(iter, start=0) — проходится по итератору и возвращает (индекс, значение). Если задать start, то индекс сместиться на start единиц.

zip(a, b, c...) — параллельно проходит по всем последовательностям, возвращая по элементу с каждого.

reversed(obj) — переворачивает obj. Если это невозможно, выдаёт ошибку.

#теория
Геттеры и сеттеры

Такое есть в C# и Java. Это штуки, которые позволяют задавать и получать значение переменной (чаще всего приватной) с помощью функции.

Только вместо get и set, в Python, мы пишем @property и @свойство.setter. Свойство это и есть тот самый метод, помеченный @property.

Кстати, ещё важно чтобы имена геттера и сеттера совпадали, иначе ничего не заработает. Документация

#теория
Что такое __pycache__

Вас не бесит эта папка? Возможно, вы её и не встречали, но знайте, что она хранит байткод приложения. Таким образом быстрее проходит импорт и запуск.

В ней можно найти .pyc и .pyo файлы. Это байткод и оптимизированный байткод. Они создаются заново, если код программы изменился.

Если очень интересно, зачем нужно переводить код в байткод, то можете почитать PEP 3147.

#теория
Что ещё за Ellipsis?

Ellipsis
, в переводе с английского — многоточие. Теперь, думаю, нет вопросов, почему "..." и Ellipsis это одно и то же.

Используется переменная для расширения возможностей срезов, за счёт изменения метода __getitem__.

Зачем? Она используется в numpy. Может быть индикатором того, что тут код надо ещё написать. Или использоваться в аннотации типов.

#теория