Разъяснивший Python
رفتن به کانال در Telegram
Твой проводник в омут Python'а Ссылка: @Portal_v_IT Сотрудничество: @oleginc
نمایش بیشتر6 893
مشترکین
+224 ساعت
-97 روز
-6430 روز
آرشیو پست ها
6 890
Цепочка операторов
Синтаксический сахар для упрощения проверок. Работает со всеми операторами сравнения (<, ==, >, ...), is и in. Цепь может состоять из любого количества операторов.
Хочу заметить, что цепь не создаёт никаких связей, так что вы вполне можете написать так:
x < y > z. Если увидите это на проде, пишите git blame и ищите, кому бить морду.
#теория6 890
Как определить истинный этот объект или нет?
Многие знают, что в Python всё можно перевести в bool. Пустые последовательности и коллекции ('', [], (), {}, range(0)), None и 0 возвращают False. Остальное — True.
Но как это просчитывается? Вызывается
__bool__() метод, который возвращает True/False. Если его нет, используется __len__(). Если метод вернёт 0, то результат будет False.
Если ни одна из функций не определена, то объекты считаются True.
#объяснение6 890
⚡️ Оператор моржа
Его добавили в Python 3.8. Он решает две задачи: присвоение значение переменной и возврат этого значения.
Другими словами, он позволяет нам присваивать значение переменной и возвращать его в одном и том же выражении.
Таким образом код становится короче и более читаемым, а повторное использование переменной в разы проще.
Записывается так:
var_name := expression, где := — оператор. Подробнее можно почитать в PEP 572.
P.S. А назвали его моржом, потому что := действительно похоже на глаза и бивни моржа, лежащего на боку.
#теория6 890
for...else
Если вы думали, что else есть только у if, то вынужден вас огорчить. Оно встречается и у try, и у for.
Блок else выполняется если цикл завершился нормально, то есть не был остановлен с помощью оператора break.
Хочу заметить, что continue никак не влияют на блок else, только оператор break имеет значение.
К слову, на эту тему у нас был тест.
Документация
#теория
6 890
Строки на несколько строк
Бывают ситуации, когда строку лучше разделить, чтобы она легче читалась, но при этом сохранить её содержимое в полном порядке. В таком случае у нас есть три варианта:
· Использовать косую черту (/). Тогда мы переносим выражение на новую строку и ни о чем не заботимся.
· Использовать скобки. Смотрите лучше пример. Никаких + использовать не надо, строки сами объединяться.
· Использовать тройные кавычки. Внутри тройных кавычек все останется именно таким, как оно есть.
#теория
6 890
Кстати, про functools
Это модуль с полезными функциями... для работы с функциями. Например:
@cache — простой легкий неограниченный кеш функций. Если функция долго вычисляется, то вы можете сохранить сохранить результат в памяти, чтобы потом его не считать, а брать оттуда.
partial(func, *args, **keywords) — возвращает вызываемый объект, который вызывает полученную функция с переданными при создании аргументами и во время вызова.
Но и это ещё не всё, в модуле много фишек, которые можно узнать из документации.
#теория6 890
Так что же такое NaN
Not a number (не число) — состояние числа с плавающей запятой, при котором машине не удалось посчитать какое-то выражение.
Компьютер не в силах поделить 0 на 0 или узнать asin(2), поэтому возвращает NaN.
Его особенностью среди других чисел является то, что оно не равно самому себе.
#объяснение
6 890
⚡️ Принцип KISS
«Keep it simple, stupid» означает, что программисту нужно максимально упрощать код, делать его более понятным. Таким образом в разы легче добавить новые фичи в проект, а вы сможете со спокойной душой уйти в отпуск.
Как это — проще? Вам не стоит реализовывать функционал, которые, более вероятно, не будут использовать. Также надо уметь остановиться, добавляя новые уровни абстракции или создавая интерфейсы.
#миниурок #kiss
6 890
all и any
all(iterable) — возвращает True, если все элементы в iterable являются True. Документация
any(iterable) — возвращает True, если хотя бы один элемент в iterable является True. Документация
#объяснение6 890
Декораторы
Это функции, которые меняют поведение других функций, не меняя код внутри них.
Сами по себе декораторы составляют вызываемый объект (функция, класс с
__call__), который возвращает другой вызываемый объект.
@wraps используется для изменения некоторых значения (__name__, __doc__) на значения функции, с которой мы работаем, а не декоратора.
#теория6 890
try/except
Эта конструкция используется для «ловли» ошибок и их обработки. Например, если пользователь неправильно ввёл число, попросить его сделать это заново.
try — здесь хранится код, который может выдать ошибку.
except Exception — если появилась ошибка, будет выполняться код из этого блока.
else — ошибок не было? Отлично, значит после try выполняем этот блок.
finally — выполняется всегда. Выдало ошибку, не выдало ошибку, функция использовала return — не имеет значение.
#объяснение6 890
args и kwargs
Бывает ситуации, когда мы не знаем, сколько пользователей передаст параметров функции. В таком случае используют
*args и **kwargs.
*args — кортеж со всем позиционными аргументами. Позиционные это те, что передаются по позиции (спасибо, капитан очевидность).
**kwargs — словарь с ключевыми аргументами. Ключевые, как вы поняли, передаются по ключу, то есть key=value.
Эти имена не имеют никакого значения, самое главное — символы звёздочки в начале.
#объяснение6 890
⚡️ Фабричный метод
Фабричный метод используется как средство предоставления фабричных интерфейсов для создания объектов.
Они позволяют ослабить связи в коде и упростить его: чаще всего он используется, если вам нужно создать объект по какому-то условию.
Таким образом, мы перемещаем большое количество if/elif/else-кода в отдельный метод.
#паттерны
6 890
Что такое
__name__ ?
Каждый раз, когда мы импортируем код, он весь выполняется точно так же, словно мы его просто запустили. Чтобы избежать странного поведения, как на картинке, стоит использовать __name__.
Переменная получает значение '__main__', если программу запустили напрямую (python file.py). Если же файл импортировали как модуль, он получает своё название.
#теория6 890
Про упаковку и распаковку
Распаковку задаёт переменным значения итерируемого объекта (список, кортеж, строка, генератор).
Упаковка позволяет собрать несколько значений в один список и после работать с ними.
Эти фишки делают код более красивым и элегантным, но стоит знать меру.
#объяснение
6 890
Нижние подчёркивание между цифрами
Они никак не влияют на приложение и используются для того, чтобы числа было удобнее считывать при больших значениях.
Таким образом можно разделять десятки, сотни, тысячи и так далее.
#объяснение
6 890
Сравнение последовательностей
При использовании оператор больше (>) или меньше (<) с строками, котрежами, списками, они сравниваются последовательно, то есть элемент с элементом.
Есть только небольшой нюанс при проверке строк. Они сравниваются по их позиции в таблице Unicode, которую можно получить с помощью
ord(char).
#объяснение6 890
Возможности срезов
С помощью срезов мы можем менять элементы списка. Называют это так: «Изменение путем присваивания».
Таким образом мы заменяем элементы внутри этого среза другими из итератора (list, tuple, range).
С их помощью мы также можем добавлять/удалять элементы, опустошать список и многое другое.
Стоит отметить, что в разреженных срезах ([::2]) такое не работает, если длина итератора не равна длине результата среза.
#объяснение
6 890
Оператор моржа
Это фишка Python c версии 3.9. Она позволяет задавать значение переменной и одновременно его возвращать для последующей обработки.
Его довольно удобно использовать в генераторных выражениях, ведь это делает код не только чище, но и быстрее.
#объяснение
6 890
Статические переменные
Это переменная, которая создаётся вместе с типом и существует до закрытия приложения.
Все переменные, что находится внутри класса, но не попадают в ни один метод являются статическими.
#объяснение
