четверг, 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. Присвоение срезу.
Важным условием при тестировании было изменение передаваемой переменной.