Python академия
7.55K subscribers
2.47K photos
5 videos
285 links
Учи Python быстро и легко.

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

Подходит для прокачки навыков кодирования.

По всем вопросам @evgenycarter
Download Telegram
Что происходит, когда у нас есть избыточные ключи в ChainMap?

Возможно, что 2 словаря содержат один и тот же ключ.

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

Подписывайтесь на канал 👉@pythonofff
👍2
Выводим вложенные словари и списки

При выводе вложенных словарей и списков с помощью обычного print() мы получаем всё в одну строчку и в неразборчивом виде.

Но в стандартной библиотеке есть модуль pprint, который поможет вывести подобное дело в красивом формате — достаточно в коде заменить print() на pprint.pprint().

Из интересных аргументов есть depth, отвечающий за глубину вложенности при выводе, а также width, который отвечает за ширину вывода в консоли.

Подписывайтесь на канал 👉@pythonofff
👍3
Как использовать функцию pow() в Python

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

pow(base, exponent)

Приведенный выше код интерпретируется как baseexponent, то есть число base в степени exponent.

Функция pow() принимает два аргумента: число (известное как основание или base) и степень, в которую число должно быть возведено (показатель степени — exponent).

Подписывайтесь на канал 👉@pythonofff
👍3
Что выведет код и почему?


def make_counters():
counters = []

for i in range(3):
def counter():
return i
counters.append(counter)

return counters


funcs = make_counters()
print([f() for f in funcs])


Подписывайтесь на канал 👉@pythonofff
👍3
Превращаем текст в числа

Пакет Numerizer преобразует обычный текст в числа. То есть, например, из строки "forty two" можно получить число "42".

Кроме функции numerize особо выделить нечего, но можете посмотреть https://github.com/jaidevd/numerizer

Подписывайтесь на канал 👉@pythonofff
👍41
Методы PurePath

PurePath().is_absolute() проверяет, является ли ваш путь абсолютным

Обратите внимание, что абсолютный путь состоит из корня и имени диска. В этом случае PurePath() не позволяет нам узнать имя диска.

Если вы используете PureWindowsPath(), вы можете представить абсолютный путь, содержащий имя диска, например PureWindowsPath('c:/Program Files').

Подписывайтесь на канал 👉@pythonofff
👍1
Деструкторы

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

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

Вообще деструкторы крайне редко переопределяется в Python, но полезно знать, что именно эти методы отвечают за очистку при удалении объекта.

Подписывайтесь на канал 👉@pythonofff
👍3
Получаем атрибуты объекта

Функция vars() возвращает все атрибуты переданного параметра, в качестве которого может быть почти что угодно: модуль, класс, экземпляр и т. д.

Проще говоря, vars() возвращает словарь, который хранится в атрибуте __dict__ у переданного объекта.

А если ничего не передать в аргументы, то функция вернет словарь локальных переменных, как и locals()

Подписывайтесь на канал 👉@pythonofff
👍4
Как использовать Concrete Paths

Path() является дочерним классом PurePath(). Он обеспечивает операции обработки с возможностью выполнения операций записи.

Когда вы создаете экземпляр Path(), он создает два класса для обработки путей Windows и путей, отличных от Windows. Как и PurePath(), Path() также создает общий объект пути «agnostic path», независимо от операционной системы, в которой вы работаете.

Подписывайтесь на канал 👉@pythonofff
👍2
Получение списка имен в объектах

С помощью функции dir() можно получить отсортированный список имен атрибутов и методов, доступных в локальной области. Либо если в функцию передать какой-либо объект dir(object), она вернет список всех имен атрибутов и методов переданного объекта.

Для того, чтобы вручную определить для класса выдачу информации по атрибутам для функции dir(), можно определить в классе метод __dir__().

Для классов, в которых не определен dir__(), функция соберет информацию по атрибутам из __dict.

Данную функцию удобно использовать в интерактивном режиме для поиска нужного атрибута, применяя функцию help() по нужному атрибуту для получения документации.

📲 Мы в MAX

Подписывайтесь на канал 👉@pythonofff
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
PosixPath()

Это дочерний класс Path() и PurePosixPath(), реализованный для обработки и управления путями файловой системы, отличной от Windows.

Вы получите сообщение об ошибке, если создадите экземпляр PosixPath() на компьютере с Windows, потому что нельзя выполнять системные вызовы, работая в другой операционной системе.

📲 Мы в MAX

Подписывайтесь на канал 👉@pythonofff
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Генерация капчи

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

Все максимально просто, за нас по сути все делает уже написанный в модуле код. Создаем объект изображения ImageCaptcha, на который будет нанесен текст. После чего вызываем метод write с заданным текстом и именем файла, в который будет записано изображение.

📲 Мы в MAX

Подписывайтесь на канал 👉@pythonofff
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Получаем исходный код объекта

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

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

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

📲 Мы в MAX

Подписывайтесь на канал 👉@pythonofff
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
Свойства Concrete Paths

Поскольку Concrete Paths является подклассом PurePath, мы можем использовать все свойства PurePath().

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

📲 Мы в MAX

Подписывайтесь на канал 👉@pythonofff
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Проверяем тип объекта

Раз уж в предыдущем посте затронули модуль inspect, то давайте еще поговорим про некоторые его возможности.

Функции ismodule(), isclass(), ismethod() и isfunction() проверяют переданный объект на то, является ли он модулем, классом, методом или функцией соответственно.

📲 Мы в MAX

Подписывайтесь на канал 👉@pythonofff
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍1
Path().mkdir()

Согласно официальной документации, метод .mkdir() принимает три аргумента. Мы пока сосредоточимся только на parents и exists_ok.

Оба аргумента имеют значение False по умолчанию. Аргумент parents вызывает ошибку FileNotFound в случае отсутствия родителя, тогда как exists_ok вызывает ошибку FileExists, если данный каталог уже существует.

📲 Мы в MAX

Подписывайтесь на канал 👉@pythonofff
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🐍 Ловушка с аргументами по умолчанию

Посмотрите на код ниже. Как вы думаете, что выведет второй вызов функции?


def append_to(num, target=[]):
target.append(num)
return target

print(append_to(1))
print(append_to(2))



Варианты ответа:

1. [1] и [2]
2. [1] и [1, 2]
3. Ошибка SyntaxError

⬇️ Правильный ответ и объяснение ⬇️


Правильный ответ: 2 — [1] и [1, 2]

Почему?
В Python аргументы по умолчанию вычисляются один раз при определении функции, а не при каждом вызове. Список target создается один раз и сохраняет свое состояние между вызовами.

Как исправить?
Используйте None в качестве значения по умолчанию:


def append_to(num, target=None):
if target is None:
target = []
target.append(num)
return target


📲 Мы в MAX

Подписывайтесь на канал 👉@pythonofff
👍7
Объединяем словари в Python 3.9+

Раньше для объединения двух словарей нам приходилось использовать метод .update() или распаковку **kwargs.

Начиная с Python 3.9, появился оператор объединения |. Это делает код намного чище!

Пример:


x = {"key1": "value1 from x", "key2": "value2 from x"}
y = {"key2": "value2 from y", "key3": "value3 from y"}

# Старый способ (до 3.9)
z = {**x, **y}

# Новый способ (Python 3.9+)
z = x | y

print(z)
# {'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}



💡При совпадении ключей (в примере key2), побеждает значение из последнего словаря (справа от оператора).

Сохраняй, чтобы писать чистый код! 💾

📲 Мы в MAX

Подписывайтесь на канал 👉@pythonofff
👍3