⚡️ Что такое
Теперь поговорим про
#теория
__name__
Эта переменная хранит название модуля, который импортируется. А если это прямой запуск (python3 foo.py
), то его значение будет __main__
. Теперь поговорим про
__name__ == "__main__"
. При импорте модуля весь код выполняется. Чтобы избежать странного поведения (см. пример), стоит делать проверку.#теория
👍3
⚡️ is vs ==
Оператор сравнения (==) вызывает метод
Оператор is сравнивает, является ли этот объект одним и тем же. То есть сравнивает ссылки объектов:
Кстати, поскольку создатели некоторых классов могут неправильно реализовать
#теория
Оператор сравнения (==) вызывает метод
__eq__
у объекта, который сравнивает себя с другим и возвращает True или False.Оператор is сравнивает, является ли этот объект одним и тем же. То есть сравнивает ссылки объектов:
id(a) == id(b)
.Кстати, поскольку создатели некоторых классов могут неправильно реализовать
__eq__
, при сравнении с None рекомендуют использовать is.#теория
🔥11👍4
⚡️ Про область видимости
Вы можете просмотреть все переменные, которые хранятся в определённой области видимости (модуль, класс, функция) с помощью функций
#теория
Вы можете просмотреть все переменные, которые хранятся в определённой области видимости (модуль, класс, функция) с помощью функций
locals()
и dir()
.dir(object)
— возвращает список со всеми доступными именами у object. Если ничего не передано, возвращает имена в конкретной области видимости.locals()
— возвращает словарь со всеми доступными переменными и их значениями в конкретной области видимости. #теория
👍6
⚡️ Наследование
Это один из принципов ООП, который позволяет дочернему классу перенять все возможности родителя. Или, проще говоря, мы переиспользуем код другого класса.
Получить доступ к родителю можно с помощью вызова super(). Оттуда уже можно брать реализации функций, которые мы переопределяем, из родительского класса.
Кстати, по умолчанию все классы наследуются от object, даже если мы этого не указываем. Поэтому у класса будет всё, что есть у object.
#теория
Это один из принципов ООП, который позволяет дочернему классу перенять все возможности родителя. Или, проще говоря, мы переиспользуем код другого класса.
Получить доступ к родителю можно с помощью вызова super(). Оттуда уже можно брать реализации функций, которые мы переопределяем, из родительского класса.
Кстати, по умолчанию все классы наследуются от object, даже если мы этого не указываем. Поэтому у класса будет всё, что есть у object.
#теория
👍12
⚡️ Распаковка
Это удобный инструмент для разделения списка, кортежа, строки на именованные части.
Также распаковка может использоваться при вызове функции. Таким образом мы передаём элементы списка как аргументы.
Для распаковки последовательностей используется одна звёздочка, а для словарей — две.
#теория
Это удобный инструмент для разделения списка, кортежа, строки на именованные части.
Также распаковка может использоваться при вызове функции. Таким образом мы передаём элементы списка как аргументы.
Для распаковки последовательностей используется одна звёздочка, а для словарей — две.
#теория
👍7
⚡️ Лямбда функции
Лямбда функциями называют те, что определены с помощью lambda. Также их называют анонимными функциями, поскольку у них нет имени.
В таких функциях всегда только одно выражение, которое, чаще всего, что-то возвращает. Они могут использовать переменные из конкретной области видимости.
Таким образом нам нужно намного меньше кода для создания простой функции. Также лямбда-функции часто используются вместе с
#теория
Лямбда функциями называют те, что определены с помощью lambda. Также их называют анонимными функциями, поскольку у них нет имени.
В таких функциях всегда только одно выражение, которое, чаще всего, что-то возвращает. Они могут использовать переменные из конкретной области видимости.
Таким образом нам нужно намного меньше кода для создания простой функции. Также лямбда-функции часто используются вместе с
map()
и filter()
.#теория
👍9
⚡️ Что за Global Interpreter Lock (GIL)
Если вы интересовались многопоточными программами, то слышали про этот термин. Это означает, что в определённый момент интерпретатором будет выполняться только один поток.
Она не особо влияет на производительность, если приложение работает с I/O-операциями (чтение, запись файла), но если оно активно использует процессор, то никакого прироста от многопоточности вы не получите.
Почему до сих пор не исправили? Есть решения, но они либо очень сложные, либо сделают только хуже. Но, не смотря на это, разработчики сильно улучшили GIL в последних версиях Python.
#теория
Если вы интересовались многопоточными программами, то слышали про этот термин. Это означает, что в определённый момент интерпретатором будет выполняться только один поток.
Она не особо влияет на производительность, если приложение работает с I/O-операциями (чтение, запись файла), но если оно активно использует процессор, то никакого прироста от многопоточности вы не получите.
Почему до сих пор не исправили? Есть решения, но они либо очень сложные, либо сделают только хуже. Но, не смотря на это, разработчики сильно улучшили GIL в последних версиях Python.
#теория
👍3
⚡️ Замыкание
Это возможность вложенной функции получить доступ к данным во внешней даже после того, как та выполнилась.
На его основе строится около половины алгоритмов в функциональном программировании. А ещё замыкание позволяет инкапсулировать код.
С этой штукой надо быть осторожным и без надобности не использовать, поскольку она довольно требовательная к ресурсам пк.
#теория
Это возможность вложенной функции получить доступ к данным во внешней даже после того, как та выполнилась.
На его основе строится около половины алгоритмов в функциональном программировании. А ещё замыкание позволяет инкапсулировать код.
С этой штукой надо быть осторожным и без надобности не использовать, поскольку она довольно требовательная к ресурсам пк.
#теория
👍8
⚡️ Три помощника при работе с циклами
Если вы что-то не поняли, то можете посетить документацию: enumerate, zip и reversed.
#теория
enumerate(iter, start=0)
— проходится по итератору и возвращает кортеж (индекс, значение). Если задать второй параметр, то индекс сместиться на start единиц.zip(a, b, c...)
— параллельно проходит по всем объектам, возвращая по элементу с каждого. reversed(obj)
— просто переворачивает obj. Если это не возможно — возвращает ошибку.Если вы что-то не поняли, то можете посетить документацию: enumerate, zip и reversed.
#теория
👍3
⚡️ Переопределяем поведение
Python используется магические методы (
Суть в том, что мы можем менять поведение операторов за счёт переопределения этих самых магических методов. Хорошим примером является pathlib с делением.
Кстати, магическими методами называют всё, что окружено двойными подчёркиваниями. Это и
#теория
Python используется магические методы (
__eq__
, __add__
) при работе с операторами (==, +) и не только. Список действий и магических методом можно найти в operator.Суть в том, что мы можем менять поведение операторов за счёт переопределения этих самых магических методов. Хорошим примером является pathlib с делением.
Кстати, магическими методами называют всё, что окружено двойными подчёркиваниями. Это и
__init__
, и __str__
и остальные.#теория
👍1
⚡️ Быстро поднимаем HTTP сервер
Представим ситуацию: вам нужно срочно перекинуть файлы с одного пк на другой, флешки рядом нет, а через почту долго или файл слишком большой.
В таком случае нам надо зайти в папку с нужными файлами и ввести
Потом на другом устройстве вводим
Проблемы могут возникнуть только если устройства не в одной локальной сети, мешает брандмауэр или вы что-то неправильно ввели.
#теория
Представим ситуацию: вам нужно срочно перекинуть файлы с одного пк на другой, флешки рядом нет, а через почту долго или файл слишком большой.
В таком случае нам надо зайти в папку с нужными файлами и ввести
python3 -m http.server
. Понятное дело, там должен быть Python.Потом на другом устройстве вводим
wget <IP пк, на котором запустили сервер>:порт/файл
. Для загрузки secret.txt, например, пишем: 192.168.0.108:8000/secret.txt.Проблемы могут возникнуть только если устройства не в одной локальной сети, мешает брандмауэр или вы что-то неправильно ввели.
#теория
👍4
⚡️ Оператор with
Используется для оборачивания выполнения блока инструкций менеджером контекста. Выглядит намного проще и красивее, чем try/except/finally.
Первым делом вызывается
Если блок закончил свою работу или, вдруг, появилась ошибка, выполняется
Подробнее об этом операторе написали в PEP 343.
#теория
Используется для оборачивания выполнения блока инструкций менеджером контекста. Выглядит намного проще и красивее, чем try/except/finally.
Первым делом вызывается
__enter__
, где класс выполняет важные операции. Например, открывает файл. Если блок закончил свою работу или, вдруг, появилась ошибка, выполняется
__exit__
. Там выполняется, например, закрытие файла.Подробнее об этом операторе написали в PEP 343.
#теория
👍4
⚡️ Дескрипторы
Они используются для изменения поведения атрибутов. То есть модификация получения, изменения, и удаления свойств класса.
Их основное отличие это методы
На самом деле, тема довольно сложная, но в документации есть отличное HowTo, которое описывает все особенности дескрипторов и их возможное применение.
#теория
Они используются для изменения поведения атрибутов. То есть модификация получения, изменения, и удаления свойств класса.
Их основное отличие это методы
__get__(obj, objtype)
, __set__(obj, value)
, __delete__(obj)
, которые используются для получения, изменения и удаления атрибута.На самом деле, тема довольно сложная, но в документации есть отличное HowTo, которое описывает все особенности дескрипторов и их возможное применение.
#теория
👍1
⚡️
#теория
@staticmethod
и @classmethod
Декораторы говорят о том, как будут другие объекты обращаться к методу. @staticmethod
обозначает метод статическим, то есть он никак не работает с экземпляром, а значит и не принимает self. Её можно вызывать без создания экземпляра. @classmethod
— метод, который привязан к классу, а не к экземпляру класса. Используется, когда вам нужен метод, не относящийся к экземпляру, но тем не менее привязанный к классу. #теория
👍5
⚡️ Так что же такое
Это статический метод, которая вызывается, когда мы пытаемся создать экземпляр класса. То есть пишем
Она обязательно возвращает значение — тот самый экземпляр, который мы пытаемся создать.
Принимает она класс, который мы пытаемся создать и те же аргументы, что передаются
#теория
__new__
?Это статический метод, которая вызывается, когда мы пытаемся создать экземпляр класса. То есть пишем
MySuperClass()
.Она обязательно возвращает значение — тот самый экземпляр, который мы пытаемся создать.
Принимает она класс, который мы пытаемся создать и те же аргументы, что передаются
__init__
.#теория
👍7
⚡️ Правила документации кода
"""На этой строке обязательно должно быть краткое описание объекта. Кто он, что он делает и ради чего существует.
Вторая строка обязательно должна быть пустой. После неё идёт один или несколько абзацев более полного описания.
Вообще правила, описывающие документацию хранятся в PEP257.
"""
#теория
"""На этой строке обязательно должно быть краткое описание объекта. Кто он, что он делает и ради чего существует.
Вторая строка обязательно должна быть пустой. После неё идёт один или несколько абзацев более полного описания.
Вообще правила, описывающие документацию хранятся в PEP257.
"""
#теория
👍10
⚡️ Модули это тоже объекты
Мы можем получать свойства даже у модулей. У них есть имя (
Кстати, помимо обычного import мы так же можем получить доступ к модулю, используя
#теория
Мы можем получать свойства даже у модулей. У них есть имя (
__name__
), документация (__doc__
) и файл, в котором он находится (__file__
).Кстати, помимо обычного import мы так же можем получить доступ к модулю, используя
importlib.import_module()
или __import__()
.#теория
👍5
⚡️ Pattern matching в Python
Нововведение в Python 3.10. Является синтаксическим сахаром для большого количества if/else.
С его помощью мы можем определять поведение объекта на основе входящих данных. И при этом писать меньше кода.
Это switch/case, только возможностей в разы больше. Они все описаны в PEP 636.
#теория
Нововведение в Python 3.10. Является синтаксическим сахаром для большого количества if/else.
С его помощью мы можем определять поведение объекта на основе входящих данных. И при этом писать меньше кода.
Это switch/case, только возможностей в разы больше. Они все описаны в PEP 636.
#теория
👍9
⚡️
#теория
__getattr__
и __getattribute__
__getattribute__
вызывается каждый раз, когда мы пытаемся получить атрибут экземпляра. Даже если это произошло внутри класса с помощью self.__getattr__
вызывается только в том случае, если атрибут не был найден. Его можно спокойно переопределять.#теория
👍6