Принцип 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
Элементы, которые отсутствуют в словаре
Если в словаре нет определённого ключа, то он вызывает
Кстати, примерно таким же образом, как и на фото выше, реализован defaultdict из модуля collections.
#theory // Just Python
Если в словаре нет определённого ключа, то он вызывает
__missing__. Суть в том, что мы можем переопределить этот метод.Кстати, примерно таким же образом, как и на фото выше, реализован defaultdict из модуля collections.
#theory // Just Python
yield оператор
Он позволяет создавать функции-генераторы. Они могут просчитать и вернуть несколько значений но не за раз.
Записывается он вместо return, принимая число, которое должна вернуть функция. Но если вы вызовете функцию то получите генератор, а не результат работы.
По генератору можно пройтись так же, как и по списку, используя for. Или с помощью функции
Почему нельзя вернуть значения в виде списка? Список будет занимать очень много места, если в нём будет более 1000000 элементов, а генератор — нет.
#theory // Just Python
Он позволяет создавать функции-генераторы. Они могут просчитать и вернуть несколько значений но не за раз.
Записывается он вместо return, принимая число, которое должна вернуть функция. Но если вы вызовете функцию то получите генератор, а не результат работы.
По генератору можно пройтись так же, как и по списку, используя for. Или с помощью функции
next().Почему нельзя вернуть значения в виде списка? Список будет занимать очень много места, если в нём будет более 1000000 элементов, а генератор — нет.
#theory // Just Python
Класс с данными (для хранения информации)
У всех классов есть данные, но есть те, которые используются специально для хранения информации о пользователе, позиции и т.д. Создавать их проще всего с
Декоратор самостоятельно создаёт
#theory // Just Python
У всех классов есть данные, но есть те, которые используются специально для хранения информации о пользователе, позиции и т.д. Создавать их проще всего с
@dataclass из dataclasses.Декоратор самостоятельно создаёт
__init__, __eq__, __str__ и множество других важных методов на основе статических переменных. Документация.#theory // Just Python
Шутки в Python
Удивительно, но в документации python есть раздел — humor. Это набор шуток, связанных с нашим любимым языком. Вот одна из них:
Маленькая девочка пришла на шоу домашних животных и просит ваббита (wabbit). Продавец смотрит на нее, улыбается и говорит:
- Хочешь милого пушистого белого кролика или миленького коричневого кролика?
- На самом деле, - говорит маленькая девочка, - я не думаю, что мой питон что-то заметит.
#theory // Just Python
Удивительно, но в документации python есть раздел — humor. Это набор шуток, связанных с нашим любимым языком. Вот одна из них:
Маленькая девочка пришла на шоу домашних животных и просит ваббита (wabbit). Продавец смотрит на нее, улыбается и говорит:
- Хочешь милого пушистого белого кролика или миленького коричневого кролика?
- На самом деле, - говорит маленькая девочка, - я не думаю, что мой питон что-то заметит.
#theory // Just Python
О том как работает словарь.
Начнём с того, что нам нужны хешируемые объекты, это те, у которых реализована функция
После нам нужна хеш-таблица. Примерная её реализация есть на фото выше. Разобраться, как она работает, можно самостоятельно, но лучше прочитать классную статью, из которой я и украл код :)
#theory // Just Python
Начнём с того, что нам нужны хешируемые объекты, это те, у которых реализована функция
__hash__. Чаще всего это неизменяемые типы (tuple, str) или пользовательские классы.После нам нужна хеш-таблица. Примерная её реализация есть на фото выше. Разобраться, как она работает, можно самостоятельно, но лучше прочитать классную статью, из которой я и украл код :)
#theory // Just Python
Что такое
Вот вы написали
Избавиться от мусора можно, если записать в
Кстати, объекты, которые начинаются на нижнее подчёркивание тоже не импортируются.
#theory // Just Python
__all__ ?Вот вы написали
from module import * и к вам в код попало кучу классов, которые используются только внутри модуля, снаружи они бесполезны.Избавиться от мусора можно, если записать в
__all__ список имён всех объектов (классов, функций, переменных), которые надо импортировать. Документация.Кстати, объекты, которые начинаются на нижнее подчёркивание тоже не импортируются.
#theory // Just Python