Что такое
Каждый раз, когда мы импортируем код, он весь выполняется точно так же, словно мы его просто запустили. Чтобы избежать странного поведения, как на картинке, стоит использовать
Переменная получает значение '
#theory // Just Python
__name__ ?Каждый раз, когда мы импортируем код, он весь выполняется точно так же, словно мы его просто запустили. Чтобы избежать странного поведения, как на картинке, стоит использовать
__name__.Переменная получает значение '
__main__', если программу запустили напрямую (python file.py). Если же файл импортировали как модуль, он получает своё название.#theory // Just Python
Фабричный метод
Фабричный метод используется как средство предоставления фабричных интерфейсов для создания объектов.
Они позволяют ослабить связи в коде и упростить его: чаще всего он используется, если вам нужно создать объект по какому-то условию.
Таким образом, мы перемещаем большое количество if/elif/else-кода в отдельный метод.
#theory // Just Python
Фабричный метод используется как средство предоставления фабричных интерфейсов для создания объектов.
Они позволяют ослабить связи в коде и упростить его: чаще всего он используется, если вам нужно создать объект по какому-то условию.
Таким образом, мы перемещаем большое количество if/elif/else-кода в отдельный метод.
#theory // Just Python
args и kwargs
Бывает ситуации, когда мы не знаем, сколько пользователей передаст параметров функции. В таком случае используют
Эти имена не имеют никакого значения, самое главное — символы звёздочки в начале.
#theory // Just Python
Бывает ситуации, когда мы не знаем, сколько пользователей передаст параметров функции. В таком случае используют
*args и **kwargs.*args — кортеж со всем позиционными аргументами. Позиционные это те, что передаются по позиции (спасибо, капитан очевидность).**kwargs — словарь с ключевыми аргументами. Ключевые, как вы поняли, передаются по ключу, то есть key=value.Эти имена не имеют никакого значения, самое главное — символы звёздочки в начале.
#theory // Just Python
Декораторы
Это функции, которые меняют поведение других функций, не меняя код внутри них.
Сами по себе декораторы составляют вызываемый объект (функция, класс с
#theory // Just Python
Это функции, которые меняют поведение других функций, не меняя код внутри них.
Сами по себе декораторы составляют вызываемый объект (функция, класс с
__call__), который возвращает другой вызываемый объект.@wraps используется для изменения некоторых значения (__name__, __doc__) на значения функции, с которой мы работаем, а не декоратора.#theory // Just Python
all и any
#theory // Just Python
all(iterable) — возвращает True, если все элементы в iterable являются True. Документацияany(iterable) — возвращает True, если хотя бы один элемент в iterable является True. Документация #theory // Just Python
Принцип KISS
«Keep it simple, stupid» означает, что программисту нужно максимально упрощать код, делать его более понятным. Таким образом в разы легче добавить новые фичи в проект, а вы сможете со спокойной душой уйти в отпуск.
Как это — проще? Вам не стоит реализовывать функционал, которые, более вероятно, не будут использовать. Также надо уметь остановиться, добавляя новые уровни абстракции или создавая интерфейсы.
#theory // Just Python
«Keep it simple, stupid» означает, что программисту нужно максимально упрощать код, делать его более понятным. Таким образом в разы легче добавить новые фичи в проект, а вы сможете со спокойной душой уйти в отпуск.
Как это — проще? Вам не стоит реализовывать функционал, которые, более вероятно, не будут использовать. Также надо уметь остановиться, добавляя новые уровни абстракции или создавая интерфейсы.
#theory // Just Python
Так что же такое NaN
Not a number (не число) — состояние числа с плавающей запятой, при котором машине не удалось посчитать какое-то выражение.
Компьютер не в силах поделить 0 на 0 или узнать asin(2), поэтому возвращает NaN.
Его особенностью среди других чисел является то, что оно не равно самому себе.
#theory // Just Python
Not a number (не число) — состояние числа с плавающей запятой, при котором машине не удалось посчитать какое-то выражение.
Компьютер не в силах поделить 0 на 0 или узнать asin(2), поэтому возвращает NaN.
Его особенностью среди других чисел является то, что оно не равно самому себе.
#theory // Just Python
Про functools
Это модуль с полезными функциями... для работы с функциями. Например:
Но и это ещё не всё, в модуле много фишек, которые можно узнать из документации.
#theory // Just Python
Это модуль с полезными функциями... для работы с функциями. Например:
@cache — простой легкий неограниченный кеш функций. Если функция долго вычисляется, то вы можете сохранить сохранить результат в памяти, чтобы потом его не считать, а брать оттуда.partial(func, *args, **keywords) — возвращает вызываемый объект, который вызывает полученную функция с переданными при создании аргументами и во время вызова.Но и это ещё не всё, в модуле много фишек, которые можно узнать из документации.
#theory // Just Python
for и else
Если вы думали, что else есть только у if, то вынужден вас огорчить. Оно встречается и у try, и у for.
Блок else выполняется если цикл завершился нормально, то есть не был остановлен с помощью оператора break.
Хочу заметить, что continue никак не влияют на блок else, только оператор break имеет значение.
Документация
#theory // Just Python
Если вы думали, что else есть только у if, то вынужден вас огорчить. Оно встречается и у try, и у for.
Блок else выполняется если цикл завершился нормально, то есть не был остановлен с помощью оператора break.
Хочу заметить, что continue никак не влияют на блок else, только оператор break имеет значение.
Документация
#theory // Just Python
Как определить истинный этот объект или нет?
Многие знают, что в Python всё можно перевести в bool. Пустые последовательности и коллекции ('', [], (), {}, range(0)), None и 0 возвращают False. Остальное — True.
Но как это просчитывается? Вызывается
Если ни одна из функций не определена, то объекты считаются True.
#theory // Just Python
Многие знают, что в Python всё можно перевести в bool. Пустые последовательности и коллекции ('', [], (), {}, range(0)), None и 0 возвращают False. Остальное — True.
Но как это просчитывается? Вызывается
__bool__() метод, который возвращает True/False. Если его нет, используется __len__(). Если метод вернёт 0, то результат будет False.Если ни одна из функций не определена, то объекты считаются True.
#theory // Just Python
Цепочка операторов
Синтаксический сахар для упрощения проверок. Работает со всеми операторами сравнения (<, ==, >, ...), is и in. Цепь может состоять из любого количества операторов.
Хочу заметить, что цепь не создаёт никаких связей, так что вы вполне можете написать так:
#theory // Just Python
Синтаксический сахар для упрощения проверок. Работает со всеми операторами сравнения (<, ==, >, ...), is и in. Цепь может состоять из любого количества операторов.
Хочу заметить, что цепь не создаёт никаких связей, так что вы вполне можете написать так:
x < y > z. Если увидите это на проде, пишите git blame и ищите, кому бить морду.#theory // Just Python
Зачем нужен оператор with
Был придуман, чтобы заменить огромные try/except/finally при работе с файлами/соединениями на более простую конструкцию.
Он самостоятельно выполняет обязательные функции по завершению работы с классом после выполнения всех действий. Об этом в PEP 343.
Оператор использует
#theory // Just Python
Был придуман, чтобы заменить огромные try/except/finally при работе с файлами/соединениями на более простую конструкцию.
Он самостоятельно выполняет обязательные функции по завершению работы с классом после выполнения всех действий. Об этом в PEP 343.
Оператор использует
__enter__ в самом начале, например, для открытия файла. После выполнения всех операций (или если возникла ошибка), используется __exit__.#theory // Just Python
__str__ vs __repr__
Эти методы используются для перевода класса в строку, но в чём между нимstr__str__ — используется функциями print() и format() для красивого вывода информации оrepr__repr__ — Часто используется при отладке, поэтому возвращает информативное представление об объекте.str
__str__ не определён, то иrepr__repr__.P.S. Это не обязательно, но часто встречается, что с помощьrepr
__repr__ можно получить новый объект с теми же данными, если запихнуть её в eval(str). Так, например, сделано в datetime.#theory // Just Python
Алгоритм DFS
Depth-first search используется для рекурсивного обхода графа. Чаще всего он используется для поиска элементов, для поиска мостов графов или для преобразования дерева в строку.
Как он работает? Мы берём любую вершину и проходимся по её соседям до того, пока у нашей вершины не останется связей. У каждого соседа мы вызываем эту же функцию и проделываем ту же операцию.
Главное не забыть записать вершину в посещённые, чтобы избежать циклического прохода по одним и тем же элементам графа.
Но вот рекурсия вызывает много проблем. Из-за переполнения стека мы не можем работать с большими графами.
#theory // Just Python
Depth-first search используется для рекурсивного обхода графа. Чаще всего он используется для поиска элементов, для поиска мостов графов или для преобразования дерева в строку.
Как он работает? Мы берём любую вершину и проходимся по её соседям до того, пока у нашей вершины не останется связей. У каждого соседа мы вызываем эту же функцию и проделываем ту же операцию.
Главное не забыть записать вершину в посещённые, чтобы избежать циклического прохода по одним и тем же элементам графа.
Но вот рекурсия вызывает много проблем. Из-за переполнения стека мы не можем работать с большими графами.
#theory // Just Python
Префиксы строк
Документация
#theory // Just Python
r'raw str' — строка останется в точно таком же виде, как и была введена. Они обрабатывают обратную косую строку как обычный символ.b'bytes literal' — переводит строку в набор байтов. Там могут быть только символы из ASCII (англ. алфавит, цифры, \n, \t, \r, !*[]<=> и остальные символы).f'formated {string}' — форматирует строку на основе правил, описанных тут.u'unicode' — используются для решения проблем с двумя кодовыми базами в Python3 и Python2.Документация
#theory // Just Python
Форматы строк
У меня у одного течёт кровь из глаз когда я вижу как в строку добавляют данные используя +, хотя уже давно существуют f-строки?
f-строки позволяют быстро вставить какую-то информацию в строку и отформатировать её как-то (округлить до сотых, перевести в биты, заполнить нулями).
Расписать тут всё, что можно творить с данными нереально, поскольку возможностей очень много. Если интересно, можете почитать в документации.
#theory // Just Python
У меня у одного течёт кровь из глаз когда я вижу как в строку добавляют данные используя +, хотя уже давно существуют f-строки?
f-строки позволяют быстро вставить какую-то информацию в строку и отформатировать её как-то (округлить до сотых, перевести в биты, заполнить нулями).
Расписать тут всё, что можно творить с данными нереально, поскольку возможностей очень много. Если интересно, можете почитать в документации.
#theory // Just Python
Делаем типы статичными
Намучались с динамической типизацией? Что ж, у этого есть решение — аннотация типов.
Она никак не влияет на программу, а только говорит программисту и IDE какой тип должен быть на месте этой переменной.
При грамотном использовании вы сможете избежать множество проблем, ведь IDE вам подскажет, что здесь должен быть MySuperObject, а не None.
#theory // Just Python
Намучались с динамической типизацией? Что ж, у этого есть решение — аннотация типов.
Она никак не влияет на программу, а только говорит программисту и IDE какой тип должен быть на месте этой переменной.
При грамотном использовании вы сможете избежать множество проблем, ведь IDE вам подскажет, что здесь должен быть MySuperObject, а не None.
#theory // Just Python
Подробнее разбираем type hints
Да, аннотацию типов ещё называют type hints. В модуле typing можно найти кучу полезных полезных объектов для работы с подсказками.
Самые часто используемые: коллекции (List, Dict, Tuple), Any, Union, Optional. Когда мы их используем, мы в квадратных скобках передаём тип, с которым работает объект.
#theory // Just Python
Да, аннотацию типов ещё называют type hints. В модуле typing можно найти кучу полезных полезных объектов для работы с подсказками.
Самые часто используемые: коллекции (List, Dict, Tuple), Any, Union, Optional. Когда мы их используем, мы в квадратных скобках передаём тип, с которым работает объект.
#theory // Just Python
Переменная «_»
Если вы увидели такое название то знайте, что эта переменная просто необходима (без неё ничего не заработает), но нигде не используется.
Часто встречается в циклах и при распаковке. Кстати, два, три, четыре нижних подчёркивания несут ту же функцию, просто _ уже занято.
К тому же её использует интерпретатор Python, чтобы сохранять туда результат работы последней команды.
#theory // Just Python
Если вы увидели такое название то знайте, что эта переменная просто необходима (без неё ничего не заработает), но нигде не используется.
Часто встречается в циклах и при распаковке. Кстати, два, три, четыре нижних подчёркивания несут ту же функцию, просто _ уже занято.
К тому же её использует интерпретатор Python, чтобы сохранять туда результат работы последней команды.
#theory // Just Python
Методы генераторов
Всего их три:
К слову, с помощью
#theory // Just Python
Всего их три:
close, throw, send. Первые два нам не интересны, поскольку они просто прерывают работу генератора и/или выводят ошибку (если это throw).send() же позволяет передавать значения генератору. В первый раз всегда должно передаваться None, что бы запустить функцию. К слову, с помощью
send() создают корутины — функции, которым можно передавать значения, останавливать и возобновлять работу программы.#theory // Just Python