пятница, 31 июля 2015 г.

Строковое представление объектов: __repr__ и __str__

Встроенные функции print и str (а также её внутренний эквивалент, который используется функцией print) сначала пытается использовать метод __str__. Вообще, этот метод должен возвращать строковое представление в удобном для пользователя виде.

Во всех остальных случаях используется метод __repr__: функцией автоматического вывода в интерактивной оболочке, функциями print и str, когда в классе отсутствует метод __str__. Вообще этот метод должен возвращать строку, которая могла бы использоваться как программный код для восстановления объекта или содержать информацию, полезную для разработчиков.

четверг, 30 июля 2015 г.

Протокол управления контекстом

Схема работы инструкции with:
  1. Производится вычисление выражения, возвращающего объект, известный как менеджер контекста, который должен иметь методы __enter__ и __exit__.
  2. Вызывается метод __enter__ менеджера контекста. Возвращаемое значение метода присваивается переменной в предложении as, если оно имеется, в противном случае значение просто уничтожается.
  3. Затем выполняется блок программного кода, вложенный в инструкцию with.
  4. Если при выполнении блока возбуждается исключение, вызывается метод __exit__(тип, значение, диагностическая информация), которому передается подробная информация об исключении. Если этот метод возвращает ложное значение, исключение возбуждается повторно, в противном случае исключение деактивируется. Обычно исключение следует возбуждать повторно, чтобы оно могло выйти за пределы инструкции with.
  5. Если в блоке with исключение не возникает, метод __exit__ все равно вызывается, но в аргументах тип, значение, и диагностическая информация ему передается значение None.
GitHub
Источник: Лутц М. Изучаем Python, 4-е издание. — Пер. с англ. — СПб.: Символ-Плюс, 2011, стр. 950.

Общие методы перегрузки операторов

Наиболее часто используемые методы перегрузки операторов.

четверг, 8 января 2015 г.

Эквивалентность инструкций import и from

Инструкция from, приведенная ниже:
from module import name1, name2
эквивалентна следующей последовательности, по крайней мере, концептуально:
import module
name1 = module.name1
name2 = module.name2
del module
Как и все операции присваивания, инструкция from создает новые переменные в импортирующем модуле, которые ссылаются на объекты с теми же именами в импортируемом файле.

UPD 1: Есть непонятное место в этом алгоритме. GitHub UPD 2: Вопрос на тостере.

Источник: Лутц М. Изучаем Python, 4-е издание. — Пер. с англ. — СПб.: Символ-Плюс, 2011, стр. 628.

Инструкции и выражения

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

Инструкции состоят из выражений.
Выражения создают и обрабатывают объекты.

Выражения обрабатывают объекты и встраиваются в инструкции. Инструкции представляют собой более крупные логические блоки программы — они напрямую используют выражения для обработки объектов. Инструкции это место, где создаются объекты (например, в инструкциях присваивания), а в некоторых инструкциях создаются совершенно новые виды объектов (функции, классы и т. д.).

Dict.get(key, default), где deafaul - изменяемый объект

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

среда, 7 января 2015 г.

Методы pop, get, insert, add, append списков, словарей, множеств

L - list
  • L.pop([index]) -> item удаляет и возвращает элемент списка с указанным индексом (по умолчанию последний элемент). Поддерживаются отрицательные индексы. Возбуждает ошибку IndexError, если список пустой или элемент с указанным индексом не найден (отрицательные индексы тоже имеют ограничение).
  • L.insert(index, object) вставляет объект перед указанным индексом. Отрицательные индексы поддерживаются.
  • L.append(object) -> None добавить элемент в конец списка (аналог push).
D - dict
  • D.pop(k[,d]) -> v удаляет из словаря и возвращает элемент по переданному ключу. Если ключ не найден:
    • если передано значение по умолчанию, то возвращает его,
    • иначе возбуждает ошибку KeyError.
  • D.get(k[,d]) -> D[k] — если ключ найден в наборе ключей словаря, то возвращает соответствующее значение, иначе — значение по умолчанию (если значение по умолчанию не передано, то None).
S - set
  • S.add(object) -> None — Добавляет элемент во множество. Если такой элемент уже есть во множестве, то множество не меняется.
  • S.pop() -> item Удаляет и возвращает произвольный элемент множества. Если множество пусто, то возбуждает ошибку KeyError.
GitHub

Повторение списка (умножение списка на число)

При умножение списка на число все элементы полученного списка - ссылки на элементы исходного списка.

Python list multiplication: [[…]]*3 makes 3 lists which mirror each other when modified [duplicate]

Проблему можно решить, используя генератор списка, где в роли значения будет выступать выражение (например, []) или полная копия нужного объекта. GitHub

Приемы, основанные на применении срезов

Рассмотрены функции:
  • Поверхностная копия списка, кортежа;
  • Добавление элемента в начало списка;
  • Расширение списка "спереди" списком, кортежем, строкой и пр. итератором;
  • Удалить первый элемент списка;
  • Удалить элементы с n по m.
  • UPD 1:
    • Сменить порядок следования элементов на обратный;
    • Выбрать элементы списка с заданным шагом;
    • Удалить элементы списка с заданным шагом.
Перечисленные функции разработаны с целью изучения срезов.
GitHub

Измерение времени выполнения функции

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

Поддерживает методы запуска теста:
  1. self.run_distributed - на базе входных параметров строится итоговый алгоритм, а затем запускается и засекается время;
  2. self.run_solid - алгоритм заранее не готовится и учитывает входные параметры в процессе выполнения.
Оба метода принимают одинаковые именованные параметры:
  • assign_value - присвоить ли значение, возвращаемое функцией, во временную переменную;
  • per_replay - хранить ли продолжительность каждого повтора.
Методы реализованы на основе способа описанного в книге: Лутц М. - Изучаем Python.

Позже будет реализован вывод результатов в консоль. GitHub

Расширение списка "спереди" - добавление нескольких элементов в начало списка

Были рассмотрены 3 способа расширения списка:
  1. Сложение списков;
  2. Сложение списка и итератора приведенного к списку;
  3. Присвоение срезу.
Важным условием при тестировании было изменение передаваемой переменной.