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

Ссылка: @Portal_v_IT

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

Канал на бирже: https://telega.in/c/python_pssss
Download Telegram
Что такое __name__ ?

Каждый раз, когда мы импортируем код, он весь выполняется точно так же, словно мы его просто запустили. Чтобы избежать странного поведения, как на картинке, стоит использовать __name__.

Переменная получает значение '__main__', если программу запустили напрямую (python file.py). Если же файл импортировали как модуль, он получает своё название.

#теория
⚡️ Фабричный метод

Фабричный метод используется как средство предоставления фабричных интерфейсов для создания объектов.

Они позволяют ослабить связи в коде и упростить его: чаще всего он используется, если вам нужно создать объект по какому-то условию.

Таким образом, мы перемещаем большое количество if/elif/else-кода в отдельный метод.

#паттерны
args и kwargs

Бывает ситуации, когда мы не знаем, сколько пользователей передаст параметров функции. В таком случае используют *args и **kwargs.

*argsкортеж со всем позиционными аргументами. Позиционные это те, что передаются по позиции (спасибо, капитан очевидность).

**kwargsсловарь с ключевыми аргументами. Ключевые, как вы поняли, передаются по ключу, то есть key=value.

Эти имена не имеют никакого значения, самое главное — символы звёздочки в начале.

#объяснение
try/except

Эта конструкция используется для «ловли» ошибок и их обработки. Например, если пользователь неправильно ввёл число, попросить его сделать это заново.

try — здесь хранится код, который может выдать ошибку.

except Exception — если появилась ошибка, будет выполняться код из этого блока.

else — ошибок не было? Отлично, значит после try выполняем этот блок.

finally — выполняется всегда. Выдало ошибку, не выдало ошибку, функция использовала return — не имеет значение.

#объяснение
Декораторы

Это функции, которые меняют поведение других функций, не меняя код внутри них.

Сами по себе декораторы составляют вызываемый объект (функция, класс с __call__), который возвращает другой вызываемый объект.

@wraps используется для изменения некоторых значения (__name__, __doc__) на значения функции, с которой мы работаем, а не декоратора.


#теория
all и any

all(iterable) — возвращает True, если все элементы в iterable являются True. Документация

any(iterable) — возвращает True, если хотя бы один элемент в iterable является True. Документация

#объяснение
⚡️ Принцип KISS

«Keep it simple, stupid»
означает, что программисту нужно максимально упрощать код, делать его более понятным. Таким образом в разы легче добавить новые фичи в проект, а вы сможете со спокойной душой уйти в отпуск.

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

#миниурок #kiss
Так что же такое NaN

Not a number
(не число) — состояние числа с плавающей запятой, при котором машине не удалось посчитать какое-то выражение.

Компьютер не в силах поделить 0 на 0 или узнать asin(2), поэтому возвращает NaN.

Его особенностью среди других чисел является то, что оно не равно самому себе.

#объяснение
Кстати, про functools

Это модуль с полезными функциями... для работы с функциями. Например:

@cache — простой легкий неограниченный кеш функций. Если функция долго вычисляется, то вы можете сохранить сохранить результат в памяти, чтобы потом его не считать, а брать оттуда.

partial(func, *args, **keywords) — возвращает вызываемый объект, который вызывает полученную функция с переданными при создании аргументами и во время вызова.

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

#теория
Строки на несколько строк

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

· Использовать косую черту (/). Тогда мы переносим выражение на новую строку и ни о чем не заботимся.

· Использовать скобки. Смотрите лучше пример. Никаких + использовать не надо, строки сами объединяться.

· Использовать тройные кавычки. Внутри тройных кавычек все останется именно таким, как оно есть.

#теория
for...else

Если вы думали, что else есть только у if, то вынужден вас огорчить. Оно встречается и у try, и у for.

Блок else выполняется если цикл завершился нормально, то есть не был остановлен с помощью оператора break.

Хочу заметить, что continue никак не влияют на блок else, только оператор break имеет значение.

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

#теория
⚡️ Оператор моржа

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

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

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

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

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

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

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

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

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

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

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

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

#теория
Оператор with

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

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

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

#теория
__str__ vs __repr__

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#объяснение
Форматирование строк

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

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

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

#теория
Аннотация типов

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

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

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

#теория