Разъяснивший Python
8.18K subscribers
2.43K photos
40 videos
30 files
2.28K links
Твой проводник в омут Python'а

Ссылка: @Portal_v_IT

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

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

Это декоратор из модуля functools, который используется для создания декораторов.

Он обновляет значения __module__, __name__, __doc__ на значение реальной функции, а не декоратора, а также добавляет __wrapped__ для получения доступа к декорируемой функции.

Подробнее можно почитать в документации.

#объяснение
👍12👏8🤯6🤔2
Про copy

В python есть модуль, который называется copy. У него только две функции: copy() и deepcopy().

copy(x) — поверхностно копирует объект и вставляет в него ссылки на объекты, обнаруженные в оригинале.

deepcopy(x) — Создаёт новый объект и рекурсивно вставляет в него копии объектов, которые нашёл в оригинале.

#модули
🤔23👍14🤯63😱3🔥2
__getattribute__ и __getattr__

Это особые методы, которые вызываются при попытке получить какой-либо атрибут класса. Например, foo.var вызовет __getattribute__, а после, возможно __getattr__.

Отличие между методами только в том, что __getattribute__ используется всегда, а __getattr__ только если атрибут не найден.

#объяснение
👍26🔥5🤔31
Статические переменные

Это переменная, которая создаётся вместе с типом и существует до закрытия приложения.

Все переменные, что находится внутри класса, но не попадают в ни один метод являются статическими.

#объяснение
👍14🔥3
Оператор моржа

Это фишка Python c версии 3.9. Она позволяет задавать значение переменной и одновременно его возвращать для последующей обработки.

Его довольно удобно использовать в генераторных выражениях, ведь это делает код не только чище, но и быстрее.

#объяснение
👍42🤯23🔥4🥰1
Возможности срезов

С помощью срезов мы можем менять элементы списка. Называют это так: «Изменение путем присваивания».

Таким образом мы заменяем элементы внутри этого среза другими из итератора (list, tuple, range).

С их помощью мы также можем добавлять/удалять элементы, опустошать список и многое другое.

Стоит отметить, что в разреженных срезах ([::2]) такое не работает, если длина итератора не равна длине результата среза.

#объяснение
👍51🤯12❤‍🔥1👾1
Сравнение последовательностей

При использовании оператор больше (>) или меньше (<) с строками, котрежами, списками, они сравниваются последовательно, то есть элемент с элементом.

Есть только небольшой нюанс при проверке строк. Они сравниваются по их позиции в таблице Unicode, которую можно получить с помощью ord(char).

#объяснение
👍287
Нижние подчёркивание между цифрами

Они никак не влияют на приложение и используются для того, чтобы числа было удобнее считывать при больших значениях.

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

#объяснение
👍60🤯165🤔3
Про упаковку и распаковку

Распаковку задаёт переменным значения итерируемого объекта (список, кортеж, строка, генератор).

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

Эти фишки делают код более красивым и элегантным, но стоит знать меру.

#объяснение
👍526🤩2
Что такое __name__ ?

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

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

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

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

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

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

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

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

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

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

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

#объяснение
👍36🔥2👎1
try/except

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

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

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

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

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

#объяснение
👍57🔥1
Декораторы

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

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

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


#теория
👍19🤔6
all и any

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#теория
👍24👎1
for...else

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

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

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

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

#теория
👍16🍓1