Just Python
10.2K subscribers
4.39K photos
11 videos
4.38K links
🐍Простое изучение Python.

Ссылка: @Portal_v_IT

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

Канал на бирже: telega.in/c/justpython_it

РКН: clck.ru/3MnbSc
Download Telegram
Тесты в документации

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

Реализуется подобная фича с помощью встроенного модуля doctest. Он ищет текста, которые выглядят как интерактивные сеансы Python (>>>, ... и подобные символы).

Вы можете запускать тесты так же, как в примере, а можно с помощью терминала: python -m doctest -v example.py.

#theory // Just Python
isdecimal() vs isdigit() vs isnumeric()

Эти три метода str используются для определения, является ли строка числом, но у них есть небольшие отличия:

str.isdecimal() — проверяет, является ли строка только набором цифр (1-9). В то время как:

· str.isdigit() вернёт True, даже если в строке есть надстрочные и подстрочные цифры (² или u00B2).

· str.isnumeric() вернёт True, даже если это дробь (½ или u00BD).

#theory // Just Python
Правила документации

class Post:
"""На первой строке краткое описание объекта. После идёт пустая строка (это обязательно).

После идёт подробное объяснение. Кто он,
что он делает и какие параметры принимает.
Документировать можно в несколько абзацев.
Писать доки можно для всего: функции, класса, модуля.
Но если вы мне не доверяете, можете почитать PEP257,
там разработчики рассказывают, как объяснять код.
"""

#useful // Just Python
Несколько фишек Python

1. Мы можем передать кортеж функции isinstance, тогда она будет проверять, относится ли x к одному из этих типов.

2. round может округлять в обратную сторону. То есть не только до дестых, но и до десяток.

3. В один except можно записывать несколько ошибок на обработку.

#theory // Just Python
0x6e 0x75 0x6d 0x65 0x72 0x61 0x6c 0x20 0x73 0x79 0x73 0x74 0x65 0x6d

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

0x для шестнадцатеричной, 0o для восьмеричной и 0b для двоичной системы счисления.

#theory // Just Python
Перейдём к основам-основам

В Python есть два типа типов: изменяемые (list, set, dict) и неизменяемые (bool, int, float, complex, tuple, str, frozenset).

Зачем такие сложности? Неизменяемые типы сохраняют данные, не позволяя другим объектам на них повлиять.

#theory // Just Python
Готовы к взрыву мозга?

Когда вызывается id(Ok()), создаётся экземпляр класса, функция получает адрес в памяти и выкидывает объект (то есть удаляет его).

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

#theory // Just Python
Почему так на***?

reversed(x) позволяет пройтись по объекту в обратном порядке. То есть в нашем случае — 3, 2, 1. Но это итератор, а значит пройтись по нему можно только 1 раз.

Если попробовать получить значения ещё раз, то генератор просто ничего не вернёт. Вызывается sorted([3, 2, 1]) == sorted([]) и, понятное дело, мы получаем False.

#theory // Just Python
Про десятичные числа

В Python3 к цифрам относится всё, что можно считать цифрами, поэтому код с теста не выдал ошибки.

Это, например, '٠' (арабская ноль). Зачем их добавили? На эту тему есть интересная история, связанная с интернетом.

#theory // Just Python
Про метод str.split(sep)

Все знают, что он разделяет строку по sep, но у него есть свои особенности. И первое, это если sep не указан, то есть None.

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

Если sep передан, то разделители не группируются, а значит на месте повторов образуется ''. Также, разделение пустой строки всегда вернёт [''].

#theory // Just Python
Принцип DRY(не повторяйся)

Don't repeat yourself («не повторяйся») — этот принцип означает, что стоит избегать дублирования кода или данных.

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

Следование принципу приводит проект к модульной архитектуре с чётким разделением между бизнес-логикой и программными классами.

#theory // Just Python
Менять списки во время итерации плохая идея, и вот почему:

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

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

Её тоже удаляем и получаем [2, 4]. Поскольку дальше двигаться некуда, итератор останавливает свою работу.

#theory // Just Python
Упрощаем поиск багов с помощью assert

Функция поиска площади квадрата со стороной 5 должна возвращать 25. А если не вернёт? Самый быстрый способ это проверять — использовать assert.

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

Чтобы убрать проверку, добавьте флаг -O при запуске приложения: python3 -O foo.py. Подробнее в документации.

#theory // Just Python
Правильная сортировка символов по алфавиту

Буквы сортируются не в алфавитном порядке, а по позиции в таблице UTF-16, получить значение которого можно с помощью ord(x).

В верхнем регистре символы имеют меньшее значение, чем в нижнем, поэтому они оказались в начале списка.

#theory // Just Python
Context Manager

Помните про with? Там рассказывалось про его использование с классами, но ничто не мешает использовать его с функциями. Только нужна библиотека contextlib.

Чтобы функция могла работать с with, вы добавляете @contextmanager или @asynccontextmanager, в зависимости от того, нужно ли вам асинхронное выполнение.

Только ещё вам нужно yield, чтобы вернуть объект, с которым будет работать with и при этом только приостановить работу функции. Подробнее.

#theory // Just Python
Создаём интерфейс командной строки

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

Установка: pip install fire

Модуль придерживается ООПшного стиля, что сильно упрощает интеграцию к себе в проект.

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

#theory // Just Python
Любопытно

round(x) округляет значения до ближайшего чётного числа (в документации так и написано). В википедии можно даже найти такое правило.

Если вам нужно, чтобы 2.5 округлялось до трёх, то посмотрите в сторону decimal с настройкой ctx.rounding = ROUND_HALF_UP. Подробнее.

#theory // Just Python
Строки на несколько строк

Бывают ситуации, когда строку лучше разделить, чтобы она легче читалась, но при этом сохранить её содержимое в полном порядке. В таком случае у нас есть три варианта:
Использовать косую черту (/). Тогда мы переносим выражение на новую строку и ни о чем не заботимся.
Использовать скобки. Смотрите лучше пример. Никаких + использовать не надо, строки сами объединяться.
Использовать тройные кавычки. Внутри тройных кавычек все останется именно таким, как оно есть.

#theory // Just Python
IEEE 754

Это стандарт, который говорит как расставить нолики и единички, чтобы получить float. Он позволяет нам писать 0.3, но из-за него же 0.1 + 0.2 != 0.3.

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

#theory // Just Python
Интерпретатор умный

Перед запуском он проходится по файлу и смотрит на первые значения переменных (a = "string"), которые потом подставляет на месте повторений (если это неизменяемые типы данных).

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

#theory // Just Python