Python Community
12.9K subscribers
1.26K photos
37 videos
15 files
740 links
Python Community RU - СНГ сообщество Python-разработчиков

Чат канала: @python_community_chat

Сотрудничество: @cyberJohnny и @Sergey_bzd

РКН реестр:
https://knd.gov.ru/license?id=67847dd98e552d6b54a511ed&registryType=bloggersPermission
Download Telegram
⚡️ Наследование

Это один из принципов ООП, который позволяет дочернему классу перенять все возможности родителя. Или, проще говоря, мы переиспользуем код другого класса.

Получить доступ к родителю можно с помощью вызова super(). Оттуда уже можно брать реализации функций, которые мы переопределяем, из родительского класса.

Кстати, по умолчанию все классы наследуются от object, даже если мы этого не указываем. Поэтому у класса будет всё, что есть у object.

#теория
👍12
⚡️ Распаковка

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

Также распаковка может использоваться при вызове функции. Таким образом мы передаём элементы списка как аргументы.

Для распаковки последовательностей используется одна звёздочка, а для словарей — две.

#теория
👍7
⚡️ Лямбда функции

Лямбда функциями называют те, что определены с помощью lambda. Также их называют анонимными функциями, поскольку у них нет имени.

В таких функциях всегда только одно выражение, которое, чаще всего, что-то возвращает. Они могут использовать переменные из конкретной области видимости.

Таким образом нам нужно намного меньше кода для создания простой функции. Также лямбда-функции часто используются вместе с map() и filter().

#теория
👍9
⚡️ Что за Global Interpreter Lock (GIL)

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

Она не особо влияет на производительность, если приложение работает с I/O-операциями (чтение, запись файла), но если оно активно использует процессор, то никакого прироста от многопоточности вы не получите.

Почему до сих пор не исправили? Есть решения, но они либо очень сложные, либо сделают только хуже. Но, не смотря на это, разработчики сильно улучшили GIL в последних версиях Python.

#теория
👍3
⚡️ Замыкание

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

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

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

#теория
👍8
⚡️ Три помощника при работе с циклами

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

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

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

Если вы что-то не поняли, то можете посетить документацию: enumerate, zip и reversed.

#теория
👍3
⚡️ Переопределяем поведение

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.

Первым делом вызывается __enter__, где класс выполняет важные операции. Например, открывает файл.

Если блок закончил свою работу или, вдруг, появилась ошибка, выполняется __exit__. Там выполняется, например, закрытие файла.

Подробнее об этом операторе написали в PEP 343.

#теория
👍4
⚡️ Дескрипторы

Они используются для изменения поведения атрибутов. То есть модификация получения, изменения, и удаления свойств класса.

Их основное отличие это методы __get__(obj, objtype), __set__(obj, value), __delete__(obj), которые используются для получения, изменения и удаления атрибута.

На самом деле, тема довольно сложная, но в документации есть отличное HowTo, которое описывает все особенности дескрипторов и их возможное применение.

#теория
👍1
⚡️ @staticmethod и @classmethod

Декораторы говорят о том, как будут другие объекты обращаться к методу.

@staticmethod обозначает метод статическим, то есть он никак не работает с экземпляром, а значит и не принимает self. Её можно вызывать без создания экземпляра.

@classmethod — метод, который привязан к классу, а не к экземпляру класса. Используется, когда вам нужен метод, не относящийся к экземпляру, но тем не менее привязанный к классу.

#теория
👍5
⚡️ Так что же такое __new__?

Это статический метод, которая вызывается, когда мы пытаемся создать экземпляр класса. То есть пишем MySuperClass().

Она обязательно возвращает значение — тот самый экземпляр, который мы пытаемся создать.

Принимает она класс, который мы пытаемся создать и те же аргументы, что передаются __init__.

#теория
👍7
⚡️ Правила документации кода

"""На этой строке обязательно должно быть краткое описание объекта. Кто он, что он делает и ради чего существует.

Вторая строка обязательно должна быть пустой. После неё идёт один или несколько абзацев более полного описания.
Вообще правила, описывающие документацию хранятся в PEP257.
"""

#теория
👍10
⚡️ Модули это тоже объекты

Мы можем получать свойства даже у модулей. У них есть имя (__name__), документация (__doc__) и файл, в котором он находится (__file__).

Кстати, помимо обычного import мы так же можем получить доступ к модулю, используя importlib.import_module() или __import__().

#теория
👍5
⚡️ Pattern matching в Python

Нововведение в Python 3.10. Является синтаксическим сахаром для большого количества if/else.

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

Это switch/case, только возможностей в разы больше. Они все описаны в PEP 636.

#теория
👍9
⚡️ __getattr__ и __getattribute__

__getattribute__
вызывается каждый раз, когда мы пытаемся получить атрибут экземпляра. Даже если это произошло внутри класса с помощью self.

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

#теория
👍6
⚡️ Больше нет проблем

Помните, рассказывал про проблемы с вычислением float? Так вот, в Python есть решение этой проблемы и это decimal.

Этот модуль может быстро и правильно округлять арифметические операции с плавающей точкой. Теперь 0.1 + 0.2 будет именно 0.3.

И это всё тот же float. То есть вы можете складывать значения, вычитать, умножать, делить, сравнивать, и так далее.

#теория
👍3
⚡️ Зависимости? Вы кто такие? Я вас не звал

Python может решать любые задачи за счёт сторонних библиотек (Tensorflow, pygame, Django). Вот их и называют зависимостями.

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

Но не стоит писать свой Tensorflow, просто потому что, и не стоит ставить funcy только ради одной функции.

А сохранить зависимости можно с помощью pip freeze > requirements.txt (доки). Установить: pip install -r requirements.txt.

#теория
👍1
⚡️ Атрибуты функций

__name__ возвращает имя функции. __qualname__ — полный путь к функции (ClassC.ClassD.function). __module__ модуль, в котором она находится.

__defaults__кортеж с значениями по умолчанию. __code__ — да-да, вы правильно поняли, код функции.

__globals__ — глобальные значения в модуле, где функция была определена.

И хочу напомнить про __dict__ — переменную, которая позволяет добавлять свои атрибуты функции.

#теория
👍15🤔1
⚡️ else в цикле

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

Если появится ошибка или цикл встретит на пути continue, то код из else всё равно сработает.

#теория
👍16