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

Ссылка: @Portal_v_IT

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

Канал на бирже: https://telega.in/c/python_pssss
Download Telegram
__init__ и __new__

__new__(cls)
создаёт экземпляр класса. Это статический метод, который вызывается когда мы пишем MyClass().

В то время как __init__(self) инициализирует класс. То есть задаёт значения переменным, что-то считает.

__init__ всегда вызывается после __new__, если функция вернула экземпляр cls, то есть класса.

#теория
👍26🤯7👎1
Импортируем пакеты

Что может быть проще? Но у Python есть несколько фишек, которые упростят работу с пакетами.

1. import <package> — просто импорт.

2. from <package> import <obj>«вытаскивает» obj (функция, класс, переменная) из пакета. Можно импортировать всё, если написать на место <obj> звёздочку.

3. import <package> as <name> — импортирует модуль и задаёт имя, записанное после as. Работает и с from <package> import <obj> as <name>.

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

#теория
👍12👎2
Только ключевые и только позиционные аргументы

Начнём с терминов. Позиционные аргументы — те, что передаются по позиции (спасибо, капитан очевидность). Ключевые — те, что передаются за счёт key=value.

Все аргументы до косой черты (/) считаются позиционными, то есть передать в них данные можно только в определённом порядке.

Все аргументы после звёздочки (*) считаются ключевыми, то есть передать данные можно только с помощью key=value.

#теория
👍322😱2
Три помощника в работе с циклами

enumerate(iter, start=0) — проходится по итератору и возвращает (индекс, значение). Если задать start, то индекс сместиться на start единиц.

zip(a, b, c...) — параллельно проходит по всем последовательностям, возвращая по элементу с каждого.

reversed(obj) — переворачивает obj. Если это невозможно, выдаёт ошибку.

#теория
👍13🥰5
Геттеры и сеттеры

Такое есть в C# и Java. Это штуки, которые позволяют задавать и получать значение переменной (чаще всего приватной) с помощью функции.

Только вместо get и set, в Python, мы пишем @property и @свойство.setter. Свойство это и есть тот самый метод, помеченный @property.

Кстати, ещё важно чтобы имена геттера и сеттера совпадали, иначе ничего не заработает. Документация

#теория
👍14👎1
Что такое __pycache__

Вас не бесит эта папка? Возможно, вы её и не встречали, но знайте, что она хранит байткод приложения. Таким образом быстрее проходит импорт и запуск.

В ней можно найти .pyc и .pyo файлы. Это байткод и оптимизированный байткод. Они создаются заново, если код программы изменился.

Если очень интересно, зачем нужно переводить код в байткод, то можете почитать PEP 3147.

#теория
6👍1
Что ещё за Ellipsis?

Ellipsis
, в переводе с английского — многоточие. Теперь, думаю, нет вопросов, почему "..." и Ellipsis это одно и то же.

Используется переменная для расширения возможностей срезов, за счёт изменения метода __getitem__.

Зачем? Она используется в numpy. Может быть индикатором того, что тут код надо ещё написать. Или использоваться в аннотации типов.

#теория
👍13🔥2👎1
⚡️ Замыкание

Это возможность вложенной функции получить доступ к данным во внешней даже после того, как та выполнилась.

На его основе строится около половины алгоритмов в функциональном программировании. А ещё замыкание позволяет инкапсулировать код.

С этой штукой надо быть осторожным и без надобности не использовать, поскольку она довольно требовательная к ресурсам пк.

#теория
👍22🤔4
Дескрипторы

Сложная тема. Это атрибуты-классы, с методами __get__(obj, objtype), __set__(obj, value) или __delete__(obj).

Они позволяет менять поведения получения значения атрибута, его установки и удаления. Есть хороший HowTo на эту тему.

#теория
👍3🤯1
@staticmethod и @classmethod

@staticmethod
обозначает метод статическим. @classmethod привязывает метод к классу. Теперь перейдём к примеру.

__new__ это статический метод и он используется для создания экземпляра класса. dict.fromkey() это ещё один способ создания словаря и это уже classmethod.

#объяснение
👍14👎13
Ищем жуков (bugs)

Функция подсчёта площади квадрата со стороной 5 должна возвращать 25. А если не вернёт? От таких простых ошибок защищает assert.

Если передаём оператору False, то получаем AssertionError с текстом из второго аргумента (если он есть, конечно).

Кстати, чтобы ускорить приложение, проверку можно отключить, запустив скрипт так: python3 -O foo.py.

#теория
👍21🤯4
Экранирование

Вы пытались запихнуть ' и " в строку? А сделать перенос на новую линию? Это сделать довольно сложно без экранирования (про multi-line строки пока не говорим).

Первый символ всегда будет , после идёт дополнительный, например: ' -> ', \ -> , n - перенос на новую строку, 0 - пустой символ (сишники поймут).

#теория
👍22👎3
Что это за вакханалия?

Начнём с того, что в Python код функции это отдельный объект, который находится в __code__. Напишите import types; help(types.CodeType).

__doc__ указывает на документацию, то есть на строку после определения функции. Кстати, все атрибуты функции можно найти тут в разделе User-defined functions.

#объяснение
👍211🤔1
Лямбда-функция

Слово lambda позволяет запихнуть простую функцию в одну строку. Часто используется вместе с map(), filter().

Но будьте осторожны, некоторые питонисты не любят функциональщину... Я в том числе.

#теория
👍17🔥5🙏1
Теперь разберём генератор

Это всё те же итераторы, которые используются для генерации/создания чего либо, поэтому пройтись по ним можно только 1 раз. Есть функции-генераторы, есть генераторы списков (о них чуть позже).

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

#теория
👍17
Модуль dis

Лучший способ узнать Python — залезть к нему под капот. Это и делает dis. Вернее, он даёт нам доступ к байт-коду.

Таким образом можно понять, каким образом Python оптимизирует код. Особенно интересно проверять с строками.

#модули
👍10
Модуль random

Он генерирует псевдослучайные числа. Полностью случайные числа сгенерировать сложно, поэтому создают "случайные" числа.

Кстати, по этой причине лучше использовать для генерации токенов/паролей модуль secrets, добавленный с Python 3.6. Он намного безопаснее.

#модули
👍17💩2🤯1
Рассказываю про dict

Это переменная, которая есть почти у всех классов. Она хранит в себе все атрибуты. Поскольку это словарь, мы можем её менять, создавая новые атрибуты.

Самое интересное то, что эта переменная есть даже у функций. Таким образом мы можем создавать атрибуты даже у функций.

#объяснение
🔥19👍31
Немного про регулярные выражения

Регулярные выражения невероятно удобные. Но их просто невозможно читать, а уже тем более менять. Но есть решение!

Недавно наткнулся на статью, где гений-разработчик с помощью f-строк в разы упрощает работу с регулярными выражениями.

#теория
👍10🤔41🤯1