Подробнее разбираем type hints
Да, аннотацию типов ещё называют type hints. В модуле typing можно найти кучу полезных полезных объектов для работы с подсказками.
Самые часто используемые: коллекции (List, Dict, Tuple), Any, Union, Optional. Когда мы их используем, мы в квадратных скобках передаём тип, с которым работает объект.
#теория
Да, аннотацию типов ещё называют type hints. В модуле typing можно найти кучу полезных полезных объектов для работы с подсказками.
Самые часто используемые: коллекции (List, Dict, Tuple), Any, Union, Optional. Когда мы их используем, мы в квадратных скобках передаём тип, с которым работает объект.
#теория
Дзен Python
Предыстория: Тим Петерс решил составить правила для написания хорошего кода и назвал его «Дзен Python». Правил должно быть 20, но одного не хватает.
Тим предложил заполнить пробел создателю Python, но он этого так и не делал. Возможно, автор хотел сказать, что в любом правиле есть исключения.
Прочитать его можно выполнив
#теория
Предыстория: Тим Петерс решил составить правила для написания хорошего кода и назвал его «Дзен Python». Правил должно быть 20, но одного не хватает.
Тим предложил заполнить пробел создателю Python, но он этого так и не делал. Возможно, автор хотел сказать, что в любом правиле есть исключения.
Прочитать его можно выполнив
import this
. Кстати, если посмотреть код модуля, то можно заметить нарушение чуть ли не всех правил :)#теория
Переменная «_»
Если вы увидели такое название то знайте, что эта переменная просто необходима (без неё ничего не заработает), но нигде не используется.
Часто встречается в циклах и при распаковке. Кстати, два, три, четыре нижних подчёркивания несут ту же функцию, просто _ уже занято.
К тому же её использует интерпретатор Python, чтобы сохранять туда результат работы последней команды.
#теория
Если вы увидели такое название то знайте, что эта переменная просто необходима (без неё ничего не заработает), но нигде не используется.
Часто встречается в циклах и при распаковке. Кстати, два, три, четыре нижних подчёркивания несут ту же функцию, просто _ уже занято.
К тому же её использует интерпретатор Python, чтобы сохранять туда результат работы последней команды.
#теория
Методы генераторов
Всего их три:
К слову, с помощью
#теория
Всего их три:
close
, throw
, send
. Первые два нам не интересны, поскольку они просто прерывают работу генератора и/или выводят ошибку (если это throw
).send()
же позволяет передавать значения генератору. В первый раз всегда должно передаваться None, что бы запустить функцию. К слову, с помощью
send()
создают корутины — функции, которым можно передавать значения, останавливать и возобновлять работу программы.#теория
Немного фактов про Python
— Думаете, Python — молодой язык? На самом деле он старше Java, ей только 27 лет, а Python уже стукнуло 28.
— Название пошло в честь «Монти Пайтона (Monty Python)», ведущего любимого шоу разработчика «Летающий цирк Монти Пайтона».
— В 2015 году родители и дети предпочитали изучать в школах Python, а не французский язык. И это было в Великобритании.
#факты
— Думаете, Python — молодой язык? На самом деле он старше Java, ей только 27 лет, а Python уже стукнуло 28.
— Название пошло в честь «Монти Пайтона (Monty Python)», ведущего любимого шоу разработчика «Летающий цирк Монти Пайтона».
— В 2015 году родители и дети предпочитали изучать в школах Python, а не французский язык. И это было в Великобритании.
#факты
Оператор yield
Он позволяет создавать функции-генераторы. Они могут просчитать и вернуть несколько значений но не за раз.
Записывается он вместо return, принимая число, которое должна вернуть функция. Но если вы вызовете функцию то получите генератор, а не результат работы.
По генератору можно пройтись так же, как и по списку, используя for. Или с помощью функции
Почему нельзя вернуть значения в виде списка? Список будет занимать очень много места, если в нём будет более 1000000 элементов, а генератор — нет.
#теория
Он позволяет создавать функции-генераторы. Они могут просчитать и вернуть несколько значений но не за раз.
Записывается он вместо return, принимая число, которое должна вернуть функция. Но если вы вызовете функцию то получите генератор, а не результат работы.
По генератору можно пройтись так же, как и по списку, используя for. Или с помощью функции
next()
.Почему нельзя вернуть значения в виде списка? Список будет занимать очень много места, если в нём будет более 1000000 элементов, а генератор — нет.
#теория
Отсутствующие элементы в словаре
Если в словаре нет определённого ключа, то он вызывает
Кстати, примерно таким же образом, как и на фото выше, реализован defaultdict из модуля collections.
#теория
Если в словаре нет определённого ключа, то он вызывает
__missing __
. Суть в том, что мы можем переопределить этот метод.Кстати, примерно таким же образом, как и на фото выше, реализован defaultdict из модуля collections.
#теория
Класс с данными
У всех классов есть данные, но есть те, которые используются специально для хранения информации о пользователе, позиции и т.д. Создавать их проще всего с
Декоратор самостоятельно создаёт
#теория
У всех классов есть данные, но есть те, которые используются специально для хранения информации о пользователе, позиции и т.д. Создавать их проще всего с
@dataclass
из dataclasses.Декоратор самостоятельно создаёт
__init__
, __eq__
, __str__
и множество других важных методов на основе статических переменных. Документация.#теория
⚡️ Шутки про Python
Удивительно, но в документации python есть раздел — humor. Это набор шуток, связанных с нашим любимым языком. Вот одна из них:
Маленькая девочка пришла на шоу домашних животных и просит ваббита (wabbit). Продавец смотрит на нее, улыбается и говорит:
- Хочешь милого пушистого белого кролика или миленького коричневого кролика?
- На самом деле, - говорит маленькая девочка, - я не думаю, что мой питон что-то заметит.
#теория
Удивительно, но в документации python есть раздел — humor. Это набор шуток, связанных с нашим любимым языком. Вот одна из них:
Маленькая девочка пришла на шоу домашних животных и просит ваббита (wabbit). Продавец смотрит на нее, улыбается и говорит:
- Хочешь милого пушистого белого кролика или миленького коричневого кролика?
- На самом деле, - говорит маленькая девочка, - я не думаю, что мой питон что-то заметит.
#теория
Вы точно понимаете, как работает словарь?
Начнём с того, что нам нужны хешируемые объекты, это те, у которых реализована функция
После нам нужна хеш-таблица. Примерная её реализация есть на фото выше. Разобраться, как она работает, можно самостоятельно, но лучше прочитать классную статью, из которой я и украл код :)
#объяснение
Начнём с того, что нам нужны хешируемые объекты, это те, у которых реализована функция
__hash__
. Чаще всего это неизменяемые типы (tuple, str) или пользовательские классы.После нам нужна хеш-таблица. Примерная её реализация есть на фото выше. Разобраться, как она работает, можно самостоятельно, но лучше прочитать классную статью, из которой я и украл код :)
#объяснение
Что такое
Вот вы написали
Избавиться от мусора можно, если записать в
Кстати, объекты, которые начинаются на нижнее подчёркивание тоже не импортируются.
#теория
__all__
?Вот вы написали
from module import *
и к вам в код попало кучу классов, которые используются только внутри модуля, снаружи они бесполезны.Избавиться от мусора можно, если записать в
__all__
список имён всех объектов (классов, функций, переменных), которые надо импортировать. Документация.Кстати, объекты, которые начинаются на нижнее подчёркивание тоже не импортируются.
#теория
global vs nonlocal
global — перечисленные идентификаторы стоит воспринимать как глобальные. А глобальные это те, которые доступны из любого места в модуле.
nonlocal — оператор, уведомляющий среду, что стоит работать не с локальной переменной, а уровнем выше. Часто используется с вложенными функциями.
#теория
global — перечисленные идентификаторы стоит воспринимать как глобальные. А глобальные это те, которые доступны из любого места в модуле.
nonlocal — оператор, уведомляющий среду, что стоит работать не с локальной переменной, а уровнем выше. Часто используется с вложенными функциями.
#теория
Объединяем словари
В Python 3.9 добавили оператор |, который позволяет быстро объединить два словаря. Подробнее в PEP 584.
Если у вас версия Python 3.5+, то вам надо использовать
Для ещё более старых версий используют update, как на примере выше.
Во всех способах значения из первого словаря перезаписываются на значения второго словаря.
#теория
В 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.
2.
3.
Последнее удобно использовать для совместимости или если у вас несколько модулей, которые работают одинаково.
#теория
Что может быть проще? Но у 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, мы пишем
Кстати, ещё важно чтобы имена геттера и сеттера совпадали, иначе ничего не заработает. Документация
#теория
Такое есть в C# и Java. Это штуки, которые позволяют задавать и получать значение переменной (чаще всего приватной) с помощью функции.
Только вместо get и set, в Python, мы пишем
@property
и @свойство.setter
. Свойство это и есть тот самый метод, помеченный @property
.Кстати, ещё важно чтобы имена геттера и сеттера совпадали, иначе ничего не заработает. Документация
#теория
Что такое
В ней можно найти .pyc и .pyo файлы. Это байткод и оптимизированный байткод. Они создаются заново, если код программы изменился.
Если очень интересно, зачем нужно переводить код в байткод, то можете почитать PEP 3147.
#теория
__pycache__
Вас не бесит эта папка? Возможно, вы её и не встречали, но знайте, что она хранит байткод приложения. Таким образом быстрее проходит импорт и запуск.В ней можно найти .pyc и .pyo файлы. Это байткод и оптимизированный байткод. Они создаются заново, если код программы изменился.
Если очень интересно, зачем нужно переводить код в байткод, то можете почитать PEP 3147.
#теория
Что ещё за Ellipsis?
Ellipsis, в переводе с английского — многоточие. Теперь, думаю, нет вопросов, почему "..." и Ellipsis это одно и то же.
Используется переменная для расширения возможностей срезов, за счёт изменения метода
Зачем? Она используется в numpy. Может быть индикатором того, что тут код надо ещё написать. Или использоваться в аннотации типов.
#теория
Ellipsis, в переводе с английского — многоточие. Теперь, думаю, нет вопросов, почему "..." и Ellipsis это одно и то же.
Используется переменная для расширения возможностей срезов, за счёт изменения метода
__getitem__
.Зачем? Она используется в numpy. Может быть индикатором того, что тут код надо ещё написать. Или использоваться в аннотации типов.
#теория