Что такое
Каждый раз, когда мы импортируем код, он весь выполняется точно так же, словно мы его просто запустили. Чтобы избежать странного поведения, как на картинке, стоит использовать
Переменная получает значение '
#теория
__name__
?Каждый раз, когда мы импортируем код, он весь выполняется точно так же, словно мы его просто запустили. Чтобы избежать странного поведения, как на картинке, стоит использовать
__name__
.Переменная получает значение '
__main__
', если программу запустили напрямую (python file.py
). Если же файл импортировали как модуль, он получает своё название.#теория
⚡️ Фабричный метод
Фабричный метод используется как средство предоставления фабричных интерфейсов для создания объектов.
Они позволяют ослабить связи в коде и упростить его: чаще всего он используется, если вам нужно создать объект по какому-то условию.
Таким образом, мы перемещаем большое количество if/elif/else-кода в отдельный метод.
#паттерны
Фабричный метод используется как средство предоставления фабричных интерфейсов для создания объектов.
Они позволяют ослабить связи в коде и упростить его: чаще всего он используется, если вам нужно создать объект по какому-то условию.
Таким образом, мы перемещаем большое количество 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
«Keep it simple, stupid» означает, что программисту нужно максимально упрощать код, делать его более понятным. Таким образом в разы легче добавить новые фичи в проект, а вы сможете со спокойной душой уйти в отпуск.
Как это — проще? Вам не стоит реализовывать функционал, которые, более вероятно, не будут использовать. Также надо уметь остановиться, добавляя новые уровни абстракции или создавая интерфейсы.
#миниурок #kiss
Так что же такое NaN
Not a number (не число) — состояние числа с плавающей запятой, при котором машине не удалось посчитать какое-то выражение.
Компьютер не в силах поделить 0 на 0 или узнать asin(2), поэтому возвращает 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 имеет значение.
Документация
#теория
Если вы думали, что else есть только у if, то вынужден вас огорчить. Оно встречается и у try, и у for.
Блок else выполняется если цикл завершился нормально, то есть не был остановлен с помощью оператора break.
Хочу заметить, что continue никак не влияют на блок else, только оператор break имеет значение.
Документация
#теория
⚡️ Оператор моржа
Его добавили в Python 3.8. Он решает две задачи: присвоение значение переменной и возврат этого значения.
Другими словами, он позволяет нам присваивать значение переменной и возвращать его в одном и том же выражении.
Таким образом код становится короче и более читаемым, а повторное использование переменной в разы проще.
Записывается так:
P.S. А назвали его моржом, потому что := действительно похоже на глаза и бивни моржа, лежащего на боку.
#теория
Его добавили в Python 3.8. Он решает две задачи: присвоение значение переменной и возврат этого значения.
Другими словами, он позволяет нам присваивать значение переменной и возвращать его в одном и том же выражении.
Таким образом код становится короче и более читаемым, а повторное использование переменной в разы проще.
Записывается так:
var_name :=
expression
, где :=
— оператор. Подробнее можно почитать в PEP 572.P.S. А назвали его моржом, потому что := действительно похоже на глаза и бивни моржа, лежащего на боку.
#теория
Как определить истинный этот объект или нет?
Многие знают, что в Python всё можно перевести в bool. Пустые последовательности и коллекции ('', [], (), {}, range(0)), None и 0 возвращают False. Остальное — True.
Но как это просчитывается? Вызывается
Если ни одна из функций не определена, то объекты считаются True.
#объяснение
Многие знают, что в Python всё можно перевести в bool. Пустые последовательности и коллекции ('', [], (), {}, range(0)), None и 0 возвращают False. Остальное — True.
Но как это просчитывается? Вызывается
__bool__()
метод, который возвращает True/False. Если его нет, используется __len__()
. Если метод вернёт 0, то результат будет False.Если ни одна из функций не определена, то объекты считаются True.
#объяснение
Цепочка операторов
Синтаксический сахар для упрощения проверок. Работает со всеми операторами сравнения (<, ==, >, ...), is и in. Цепь может состоять из любого количества операторов.
Хочу заметить, что цепь не создаёт никаких связей, так что вы вполне можете написать так:
#теория
Синтаксический сахар для упрощения проверок. Работает со всеми операторами сравнения (<, ==, >, ...), is и in. Цепь может состоять из любого количества операторов.
Хочу заметить, что цепь не создаёт никаких связей, так что вы вполне можете написать так:
x < y > z
. Если увидите это на проде, пишите git blame и ищите, кому бить морду.#теория
Оператор with
Был придуман, чтобы заменить огромные try/except/finally при работе с файлами/соединениями на более простую конструкцию.
Он самостоятельно выполняет обязательные функции по завершению работы с классом после выполнения всех действий. Об этом в PEP 343.
Оператор использует
#теория
Был придуман, чтобы заменить огромные 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 используется для рекурсивного обхода графа. Чаще всего он используется для поиска элементов, для поиска мостов графов или для преобразования дерева в строку.
Как он работает? Мы берём любую вершину и проходимся по её соседям до того, пока у нашей вершины не останется связей. У каждого соседа мы вызываем эту же функцию и проделываем ту же операцию.
Главное не забыть записать вершину в посещённые, чтобы избежать циклического прохода по одним и тем же элементам графа.
Но вот рекурсия вызывает много проблем. Из-за переполнения стека мы не можем работать с большими графами.
#алгоритмы #графы
Depth-first search используется для рекурсивного обхода графа. Чаще всего он используется для поиска элементов, для поиска мостов графов или для преобразования дерева в строку.
Как он работает? Мы берём любую вершину и проходимся по её соседям до того, пока у нашей вершины не останется связей. У каждого соседа мы вызываем эту же функцию и проделываем ту же операцию.
Главное не забыть записать вершину в посещённые, чтобы избежать циклического прохода по одним и тем же элементам графа.
Но вот рекурсия вызывает много проблем. Из-за переполнения стека мы не можем работать с большими графами.
#алгоритмы #графы
Префиксы строк
Документация
#объяснение
r'raw str'
— строка останется в точно таком же виде, как и была введена. Они обрабатывают обратную косую строку как обычный символ.b'bytes literal'
— переводит строку в набор байтов. Там могут быть только символы из ASCII (англ. алфавит, цифры, \n, \t, \r, !*[]<=> и остальные символы).f'formated {string}'
— форматирует строку на основе правил, описанных тут.u'unicode'
— используются для решения проблем с двумя кодовыми базами в Python3 и Python2.Документация
#объяснение
Форматирование строк
У меня у одного течёт кровь из глаз когда я вижу как в строку добавляют данные используя +, хотя уже давно существуют f-строки?
f-строки позволяют быстро вставить какую-то информацию в строку и отформатировать её как-то (округлить до сотых, перевести в биты, заполнить нулями).
Расписать тут всё, что можно творить с данными нереально, поскольку возможностей очень много. Если интересно, можете почитать в документации.
#теория
У меня у одного течёт кровь из глаз когда я вижу как в строку добавляют данные используя +, хотя уже давно существуют f-строки?
f-строки позволяют быстро вставить какую-то информацию в строку и отформатировать её как-то (округлить до сотых, перевести в биты, заполнить нулями).
Расписать тут всё, что можно творить с данными нереально, поскольку возможностей очень много. Если интересно, можете почитать в документации.
#теория
Аннотация типов
Намучались с динамической типизацией? Что ж, у этого есть решение — аннотация типов.
Она никак не влияет на программу, а только говорит программисту и IDE какой тип должен быть на месте этой переменной.
При грамотном использовании вы сможете избежать множество проблем, ведь IDE вам подскажет, что здесь должен быть MySuperObject, а не None.
#теория
Намучались с динамической типизацией? Что ж, у этого есть решение — аннотация типов.
Она никак не влияет на программу, а только говорит программисту и IDE какой тип должен быть на месте этой переменной.
При грамотном использовании вы сможете избежать множество проблем, ведь IDE вам подскажет, что здесь должен быть MySuperObject, а не None.
#теория