Разъяснивший Python
8.18K subscribers
2.43K photos
40 videos
30 files
2.28K links
Твой проводник в омут Python'а

Ссылка: @Portal_v_IT

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

Канал на бирже: https://telega.in/c/python_pssss
Download Telegram
⚡️ Оператор моржа

Его добавили в Python 3.8. Он решает две задачи: присвоение значение переменной и возврат этого значения.

Другими словами, он позволяет нам присваивать значение переменной и возвращать его в одном и том же выражении.

Таким образом код становится короче и более читаемым, а повторное использование переменной в разы проще.

Записывается так: var_name := expression, где := — оператор. Подробнее можно почитать в PEP 572.

P.S. А назвали его моржом, потому что := действительно похоже на глаза и бивни моржа, лежащего на боку.

#теория
👍23
Как определить истинный этот объект или нет?

Многие знают, что в Python всё можно перевести в bool. Пустые последовательности и коллекции ('', [], (), {}, range(0)), None и 0 возвращают False. Остальное — True.

Но как это просчитывается? Вызывается __bool__() метод, который возвращает True/False. Если его нет, используется __len__(). Если метод вернёт 0, то результат будет False.

Если ни одна из функций не определена, то объекты считаются True.

#объяснение
👍261
Цепочка операторов

Синтаксический сахар для упрощения проверок. Работает со всеми операторами сравнения (<, ==, >, ...), is и in. Цепь может состоять из любого количества операторов.

Хочу заметить, что цепь не создаёт никаких связей, так что вы вполне можете написать так: x < y > z. Если увидите это на проде, пишите git blame и ищите, кому бить морду.

#теория
👍38😁9👏3
Оператор with

Был придуман, чтобы заменить огромные try/except/finally при работе с файлами/соединениями на более простую конструкцию.

Он самостоятельно выполняет обязательные функции по завершению работы с классом после выполнения всех действий. Об этом в PEP 343.

Оператор использует __enter__ в самом начале, например, для открытия файла. После выполнения всех операций (или если возникла ошибка), используется __exit__.

#теория
👍20🔥1😱1
__str__ vs __repr__

Эти методы используются для перевода класса в строку, но в чём между ними разница?

__str__ — используется функциями print() и format() для красивого вывода информации об объекте.

__repr__ — Часто используется при отладке, поэтому возвращает информативное представление об объекте.

Если метод __str__ не определён, то используется __repr__.

P.S. Это не обязательно, но часто встречается, что с помощью строки от __repr__ можно получить новый объект с теми же данными, если запихнуть её в eval(str). Так, например, сделано в datetime.

#объяснение
👍364
⚡️ Алгоритм DFS

Depth-first search
используется для рекурсивного обхода графа. Чаще всего он используется для поиска элементов, для поиска мостов графов или для преобразования дерева в строку.

Как он работает? Мы берём любую вершину и проходимся по её соседям до того, пока у нашей вершины не останется связей. У каждого соседа мы вызываем эту же функцию и проделываем ту же операцию.

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

Но вот рекурсия вызывает много проблем. Из-за переполнения стека мы не можем работать с большими графами.

#алгоритмы #графы
👍9
Префиксы строк

r'raw str' — строка останется в точно таком же виде, как и была введена. Они обрабатывают обратную косую строку как обычный символ.

b'bytes literal' — переводит строку в набор байтов. Там могут быть только символы из ASCII (англ. алфавит, цифры, \n, \t, \r, !*[]<=> и остальные символы).

f'formated {string}' — форматирует строку на основе правил, описанных тут.

u'unicode' — используются для решения проблем с двумя кодовыми базами в Python3 и Python2.

Документация

#объяснение
👍12👏7👎1
Форматирование строк

У меня у одного течёт кровь из глаз когда я вижу как в строку добавляют данные используя +, хотя уже давно существуют f-строки?

f-строки позволяют быстро вставить какую-то информацию в строку и отформатировать её как-то (округлить до сотых, перевести в биты, заполнить нулями).

Расписать тут всё, что можно творить с данными нереально, поскольку возможностей очень много. Если интересно, можете почитать в документации.

#теория
👍30🔥3
Аннотация типов

Намучались с динамической типизацией? Что ж, у этого есть решение — аннотация типов.

Она никак не влияет на программу, а только говорит программисту и IDE какой тип должен быть на месте этой переменной.

При грамотном использовании вы сможете избежать множество проблем, ведь IDE вам подскажет, что здесь должен быть MySuperObject, а не None.

#теория
👍34💩2
Подробнее разбираем type hints

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

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

#теория
👍12🔥2
Дзен Python

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

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

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

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

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

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

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

#теория
👍5311🤔9👎2
Методы генераторов

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

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

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

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

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

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

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

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

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

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

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

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

#теория
👍22🔥2🆒1
Отсутствующие элементы в словаре

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

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

#теория
👍11🤔2
Класс с данными

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

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

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

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

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

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

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

#теория
👍21😁8🤔4
Вы точно понимаете, как работает словарь?

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

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

#объяснение
👍17🔥1😁1🥱1
Что такое __all__ ?

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

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

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

#теория
👍341