0x6e 0x75 0x6d 0x65 0x72 0x61 0x6c 0x20 0x73 0x79 0x73 0x74 0x65 0x6d
В Python мы можем использовать другие системы счисления, просто добавив приставку.
0x для шестнадцатеричной, 0o для восьмеричной и 0b для двоичной системы счисления.
#theory // Just Python
В Python мы можем использовать другие системы счисления, просто добавив приставку.
0x для шестнадцатеричной, 0o для восьмеричной и 0b для двоичной системы счисления.
#theory // Just Python
Перейдём к основам-основам
В Python есть два типа типов: изменяемые (list, set, dict) и неизменяемые (bool, int, float, complex, tuple, str, frozenset).
Зачем такие сложности? Неизменяемые типы сохраняют данные, не позволяя другим объектам на них повлиять.
#theory // Just Python
В Python есть два типа типов: изменяемые (list, set, dict) и неизменяемые (bool, int, float, complex, tuple, str, frozenset).
Зачем такие сложности? Неизменяемые типы сохраняют данные, не позволяя другим объектам на них повлиять.
#theory // Just Python
Готовы к взрыву мозга?
Когда вызывается id(Ok()), создаётся экземпляр класса, функция получает адрес в памяти и выкидывает объект (то есть удаляет его).
Во второй раз происходит то же самое, но на месте, где только что был предыдущий объект появляется новый, точно такой же. И в итоге мы получаем один и тот же адрес.
#theory // Just Python
Когда вызывается id(Ok()), создаётся экземпляр класса, функция получает адрес в памяти и выкидывает объект (то есть удаляет его).
Во второй раз происходит то же самое, но на месте, где только что был предыдущий объект появляется новый, точно такой же. И в итоге мы получаем один и тот же адрес.
#theory // Just Python
Почему так на***?
Если попробовать получить значения ещё раз, то генератор просто ничего не вернёт. Вызывается
#theory // Just Python
reversed(x) позволяет пройтись по объекту в обратном порядке. То есть в нашем случае — 3, 2, 1. Но это итератор, а значит пройтись по нему можно только 1 раз.Если попробовать получить значения ещё раз, то генератор просто ничего не вернёт. Вызывается
sorted([3, 2, 1]) == sorted([]) и, понятное дело, мы получаем False.#theory // Just Python
Про десятичные числа
В Python3 к цифрам относится всё, что можно считать цифрами, поэтому код с теста не выдал ошибки.
Это, например, '٠' (арабская ноль). Зачем их добавили? На эту тему есть интересная история, связанная с интернетом.
#theory // Just Python
В Python3 к цифрам относится всё, что можно считать цифрами, поэтому код с теста не выдал ошибки.
Это, например, '٠' (арабская ноль). Зачем их добавили? На эту тему есть интересная история, связанная с интернетом.
#theory // Just Python
Про метод
Тогда ряды пробелов рассматриваются как один разделитель и, к тому же, в результате не будет пустых строк в начале и в конце.
Если sep передан, то разделители не группируются, а значит на месте повторов образуется
#theory // Just Python
str.split(sep)
Все знают, что он разделяет строку по sep, но у него есть свои особенности. И первое, это если sep не указан, то есть None.Тогда ряды пробелов рассматриваются как один разделитель и, к тому же, в результате не будет пустых строк в начале и в конце.
Если sep передан, то разделители не группируются, а значит на месте повторов образуется
''. Также, разделение пустой строки всегда вернёт [''].#theory // Just Python
Принцип DRY(не повторяйся)
Don't repeat yourself («не повторяйся») — этот принцип означает, что стоит избегать дублирования кода или данных.
Внесение изменений в такой код становится в разы сложнее. Что если вы забыли добавить фичу в другом файле? Этот вопрос не даст вам покоя.
Следование принципу приводит проект к модульной архитектуре с чётким разделением между бизнес-логикой и программными классами.
#theory // Just Python
Don't repeat yourself («не повторяйся») — этот принцип означает, что стоит избегать дублирования кода или данных.
Внесение изменений в такой код становится в разы сложнее. Что если вы забыли добавить фичу в другом файле? Этот вопрос не даст вам покоя.
Следование принципу приводит проект к модульной архитектуре с чётким разделением между бизнес-логикой и программными классами.
#theory // Just Python
Менять списки во время итерации плохая идея, и вот почему:
С помощью итератора мы можем пройтись по элементам списка, так давайте напишем свой итератор и посмотрим, что там происходит внутри.
Как мы видим, поскольку удалили 1 из списка, все элементы сместились влево и на второй позиции уже будет не двойка а тройка.
Её тоже удаляем и получаем
#theory // Just Python
С помощью итератора мы можем пройтись по элементам списка, так давайте напишем свой итератор и посмотрим, что там происходит внутри.
Как мы видим, поскольку удалили 1 из списка, все элементы сместились влево и на второй позиции уже будет не двойка а тройка.
Её тоже удаляем и получаем
[2, 4]. Поскольку дальше двигаться некуда, итератор останавливает свою работу.#theory // Just Python
Упрощаем поиск багов с помощью assert
Функция поиска площади квадрата со стороной 5 должна возвращать 25. А если не вернёт? Самый быстрый способ это проверять — использовать assert.
Если оператор получает на первый аргумент False, то выводит AssertionError с текстом из второго аргумента (если таков имеется).
Чтобы убрать проверку, добавьте флаг -O при запуске приложения:
#theory // Just Python
Функция поиска площади квадрата со стороной 5 должна возвращать 25. А если не вернёт? Самый быстрый способ это проверять — использовать assert.
Если оператор получает на первый аргумент False, то выводит AssertionError с текстом из второго аргумента (если таков имеется).
Чтобы убрать проверку, добавьте флаг -O при запуске приложения:
python3 -O foo.py. Подробнее в документации.#theory // Just Python
Правильная сортировка символов по алфавиту
Буквы сортируются не в алфавитном порядке, а по позиции в таблице UTF-16, получить значение которого можно с помощью
В верхнем регистре символы имеют меньшее значение, чем в нижнем, поэтому они оказались в начале списка.
#theory // Just Python
Буквы сортируются не в алфавитном порядке, а по позиции в таблице UTF-16, получить значение которого можно с помощью
ord(x).В верхнем регистре символы имеют меньшее значение, чем в нижнем, поэтому они оказались в начале списка.
#theory // Just Python
Context Manager
Помните про with? Там рассказывалось про его использование с классами, но ничто не мешает использовать его с функциями. Только нужна библиотека contextlib.
Чтобы функция могла работать с with, вы добавляете
Только ещё вам нужно yield, чтобы вернуть объект, с которым будет работать with и при этом только приостановить работу функции. Подробнее.
#theory // Just Python
Помните про with? Там рассказывалось про его использование с классами, но ничто не мешает использовать его с функциями. Только нужна библиотека contextlib.
Чтобы функция могла работать с with, вы добавляете
@contextmanager или @asynccontextmanager, в зависимости от того, нужно ли вам асинхронное выполнение.Только ещё вам нужно yield, чтобы вернуть объект, с которым будет работать with и при этом только приостановить работу функции. Подробнее.
#theory // Just Python
Создаём интерфейс командной строки
Если вы пишите консольное приложение, то обязаны позаботиться о том, чтобы пользователям было удобно им пользоваться. CLI вам поможет создать fire.
Установка:
Также он предоставляет доступ ко всем атрибутам, которые переданы в него. Об этом и не только подробнее в документации.
#theory // Just Python
Если вы пишите консольное приложение, то обязаны позаботиться о том, чтобы пользователям было удобно им пользоваться. CLI вам поможет создать fire.
Установка:
pip install fire
Модуль придерживается ООПшного стиля, что сильно упрощает интеграцию к себе в проект.Также он предоставляет доступ ко всем атрибутам, которые переданы в него. Об этом и не только подробнее в документации.
#theory // Just Python
Любопытно
Если вам нужно, чтобы 2.5 округлялось до трёх, то посмотрите в сторону decimal с настройкой
#theory // Just Python
round(x) округляет значения до ближайшего чётного числа (в документации так и написано). В википедии можно даже найти такое правило. Если вам нужно, чтобы 2.5 округлялось до трёх, то посмотрите в сторону decimal с настройкой
ctx.rounding = ROUND_HALF_UP. Подробнее.#theory // Just Python
Строки на несколько строк
Бывают ситуации, когда строку лучше разделить, чтобы она легче читалась, но при этом сохранить её содержимое в полном порядке. В таком случае у нас есть три варианта:
Использовать косую черту (/). Тогда мы переносим выражение на новую строку и ни о чем не заботимся.
Использовать скобки. Смотрите лучше пример. Никаких + использовать не надо, строки сами объединяться.
Использовать тройные кавычки. Внутри тройных кавычек все останется именно таким, как оно есть.
#theory // Just Python
Бывают ситуации, когда строку лучше разделить, чтобы она легче читалась, но при этом сохранить её содержимое в полном порядке. В таком случае у нас есть три варианта:
Использовать косую черту (/). Тогда мы переносим выражение на новую строку и ни о чем не заботимся.
Использовать скобки. Смотрите лучше пример. Никаких + использовать не надо, строки сами объединяться.
Использовать тройные кавычки. Внутри тройных кавычек все останется именно таким, как оно есть.
#theory // Just Python
IEEE 754
Это стандарт, который говорит как расставить нолики и единички, чтобы получить float. Он позволяет нам писать 0.3, но из-за него же 0.1 + 0.2 != 0.3.
На эту тему тут был ролик, а я пока расскажу про странные моменты, которые связаны с этим стандартом.
#theory // Just Python
Это стандарт, который говорит как расставить нолики и единички, чтобы получить float. Он позволяет нам писать 0.3, но из-за него же 0.1 + 0.2 != 0.3.
На эту тему тут был ролик, а я пока расскажу про странные моменты, которые связаны с этим стандартом.
#theory // Just Python
Интерпретатор умный
Перед запуском он проходится по файлу и смотрит на первые значения переменных (
Именно поэтому, когда вы выполняете код в интерактивном интерпретаторе и как файл, результат может отличаться.
#theory // Just Python
Перед запуском он проходится по файлу и смотрит на первые значения переменных (
a = "string"), которые потом подставляет на месте повторений (если это неизменяемые типы данных).Именно поэтому, когда вы выполняете код в интерактивном интерпретаторе и как файл, результат может отличаться.
#theory // Just Python
Хороший Python
В первом тесте Python получает список, выполняет функцию join (объединяет строки в последовательности) и создаёт новую строку.
Но вот во втором случае Python сразу понимает что
#theory // Just Python
В первом тесте Python получает список, выполняет функцию join (объединяет строки в последовательности) и создаёт новую строку.
Но вот во втором случае Python сразу понимает что
''.join(a.split()) вернёт a, поэтому не выполняет ни split, ни join, а подставляет ту же строку.#theory // Just Python
Фокус со срезом
Срезы позволяют нам получить подмножество элементов (исключение). Работают они с последовательностями (строки, списки, кортежи, range).
Но если мы возьмём подмножество из ничего (как в примере), то и получим ничего, но это и не приведёт к ошибке.
#theory // Just Python
Срезы позволяют нам получить подмножество элементов (исключение). Работают они с последовательностями (строки, списки, кортежи, range).
Но если мы возьмём подмножество из ничего (как в примере), то и получим ничего, но это и не приведёт к ошибке.
#theory // Just Python
Оператор with
Был придуман, чтобы заменить огромные try/except/finally при работе с файлами/соединениями на более простую конструкцию.
Он самостоятельно выполняет обязательные функции по завершению работы с классом после выполнения всех действий. Об этом в PEP 343.
Оператор использует
#theory // Just Python
Был придуман, чтобы заменить огромные try/except/finally при работе с файлами/соединениями на более простую конструкцию.
Он самостоятельно выполняет обязательные функции по завершению работы с классом после выполнения всех действий. Об этом в PEP 343.
Оператор использует
__enter__ в самом начале, например, для открытия файла. После выполнения всех операций (или если возникла ошибка), используется __exit__.#theory // Just Python
Это спасёт вас от кучи багов
Просто знайте, что
Если вам нужно, чтобы 2.5 округлялось до трёх, то посмотрите в сторону decimal с настройкой
#theory // Just Python
Просто знайте, что
round(x) округляет x до ближайшего чётного числа, а не так, как мы привыкли (3.5 => 4; 2.5 => 3).Если вам нужно, чтобы 2.5 округлялось до трёх, то посмотрите в сторону decimal с настройкой
ctx.rounding = ROUND_HALF_UP
Документация#theory // Just Python
try/except
Эта конструкция используется для «ловли» ошибок и их обработки. Например, если пользователь неправильно ввёл число, попросить его сделать это заново.
#theory // Just Python
Эта конструкция используется для «ловли» ошибок и их обработки. Например, если пользователь неправильно ввёл число, попросить его сделать это заново.
try — здесь хранится код, который может выдать ошибку.except Exception — если появилась ошибка, будет выполняться код из этого блока.else — ошибок не было? Отлично, значит после try выполняем этот блок.finally — выполняется всегда. Выдало ошибку, не выдало ошибку, функция использовала return — не имеет значение.#theory // Just Python