Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЛЕКЦИЯ 5

.pdf
Скачиваний:
17
Добавлен:
26.03.2016
Размер:
751.54 Кб
Скачать

Лекция 5. Словари. Стиль программирования на Python (Стандарт PEP-8). Документирование кода. (Стандарт PEP-257).

1.Словари.

1.1.Операции.

1.2.Пример: Таблица языков. 1.3.Замечания по использованию. 1.4.Примеры использования.

1.5.Обращение к несуществующему ключу.

2.PEP 8 - руководство по написанию кода на Python.

3.Документирование кода в Python. PEP 257. ̆

1.Словари

Доступ к элементам по ключу, а не по индексу. Ассоциативные массивы. Для получения элементов словаря используется та же самая операция доступа по индексу, как и в списке, только индекс приобретает форму ключа, а не смещения относительно начала.

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

Переменная длина, гетерогенность и произвольное число уровней вложенности.

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

Относятся к категории «изменяемых отображений». Словари представляют собой

неупорядоченные коллекции, поэтому операции, которые основаны на использовании

фиксированного порядка следования элементов (например, извлечение среза), не имеют смысла для словарей. Словари – это единственный встроенный представитель объектовотображений (объекты, которые отображают ключи на значения).

Таблицы ссылок на объекты (хеш-таблицы). Cловари – это неупорядоченные таблицы ссылок на объекты, которые поддерживают доступ к элементам по ключу. Внутри словари реализованы как хеш-таблицы (структуры данных, которые обеспечивают очень высокую скорость поиска), изначально небольшого размера и увеличивающиеся по мере необходимости. Подобно спискам, словари хранят ссылки на объекты (а не их копии).

1.1 Операции

1.1.Операции

>>> D = {‘spam’: 2, ‘ham’: 1, ‘eggs’: 3} # Создание словаря

>>> list(D.keys()) # Создает новый список ключеи ̆

[‘eggs’, ‘ham’, ‘spam’] # Список может быть отсортирован

>>> list(D.values()) #Cписок значений элементов словаря [3, 1, 2]

>>>list(D.items()) #Кортежи пар (key, value)

[(‘eggs’, 3), (‘ham’, 1), (‘spam’, 2)]

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

>>>D[‘brunch’] = ‘Bacon’ # Добавление нового элемента

>>>D

{‘brunch’: ‘Bacon’, ‘spam’: 2, ‘ham’: 1, ‘eggs’: 3}

Метод update объединяет ключи и значения одного словаря с ключами и значениями другого, просто перезаписывая значения с одинаковыми ключами:

>>>D2 = {‘toast’:4, ‘muffin’:5}

>>>D.update(D2)

>>>D

{‘toast’: 4, ‘muffin’: 5, ‘eggs’: 3, ‘ham’: 1, ‘spam’: 2}

Метод pop удаляет ключ из словаря и возвращает его значение:

>>> D.pop(‘muffin’) 5

1.2.Пример: Таблица языков.

Таблица отображает названия языков программирования (ключи) на имена их создателей (значения):

>>> table = {‘Python’: ‘Guido van Rossum’,

...

‘Perl’: ‘Larry Wall’,

...

‘Tcl’: ‘John Ousterhout’ }

>>>language = ‘Python’

>>>creator = table[language]

>>>creator

‘Guido van Rossum’

>>> for lang in table: # То же, что и: for lang in table.keys()

... print(lang, ‘\t’, table[lang])

Tcl John Ousterhout Python Guido van Rossum Perl Larry Wall

1.3.Замечания по использованию ̆

Операции над последовательностями неприменимы к словарям. Словари – это отображения, а не последовательности. Вследствие того, что словари не предусматривают никакого упорядочения элементов, такие операции, как конкатенация (упорядоченное объединение) и извлечение среза (извлечение непрерывного блока элементов), просто неприменимы.

Присваивание по несуществующему индексу приводит к созданию нового элемента. Ключи можно создавать при определении словаря в виде литерала (в этом случае они встраиваются непосредственно в литерал) или при присваивании значения новому ключу существующего объекта словаря.

Ключи не обязательно должны быть строками. Например, в качестве ключей допустимо использовать целые числа, что превращает словарь в

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

1.4.Примеры использования ̆

Для имитации гибких списков:

>>> D = {}

>>> D[99] = ‘spam’

>>> D[99] # В такой структуре можно обращаться по смещениям, как в списке, но при этом не требуется выделять пространство для всех позиций, которые могут когда-либо потребоваться при выполнении программы.

‘spam’ # Результат выглядит так, как если бы D был списком из 100 элементов

>>> D

{99: ‘spam’}

Для структур разреженных данных:

>>>Matrix = {}

>>>Matrix[(2, 3, 4)] = 88 # Ключами словаря являются кортежи

>>>Matrix[(7, 8, 9)] = 99

>>>X = 2; Y = 3; Z = 4

>>>Matrix[(X, Y, Z)]

88

>>> Matrix

{(2, 3, 4): 88, (7, 8, 9): 99}

1.5.Обращение к несуществующему ключу ̆

Проверить наличие ключа с помощью условного оператора if:

>>>if (2,3,6) in Matrix:

...

print(Matrix[(2,3,6)])

...

else:

print(0)

0

Воспользоваться конструкцией try:

>>>try:

print(Matrix[(2,3,6)]) # Попытаться обратиться по индексу

except KeyError:

# Перехватить исключение и обработать

print(0)

0

 

 

Использовать метод словаря get, способный возвращать значение по умолчанию для несуществующих ключей:

>>> Matrix.get((2,3,4), 0) # Существует; извлекается и возвращается 88

>>>Matrix.get((2,3,6), 0) # Отсутствует; используется аргумент default 0

2. PEP 8 - руководство по написанию кода на Python. ̆

«Код читается намного больше раз, чем пишется.» Guido van Rossum

PEP - Python enhanced proposal.

Рекомендации о стиле написания кода направлены на то, чтобы улучшить читаемость кода и сделать его согласованным между большим числом проектов. В идеале, весь код будет написан в едином стиле, и любой сможет легко его прочесть.

Согласованность с PEP-8 очень важна. Согласованность внутри одного проекта еще важнее. А согласованность внутри модуля или функции — самое важное. Тем не менее иногда это руководство неприменимо. Важно понимать, когда можно отойти от рекомендаций.

Две причины для того, чтобы нарушить данные правила:

1)Когда применение правила сделает код менее читаемым даже для того, кто привык читать код, который следует правилам.

2)Чтобы писать в едином стиле с кодом, который уже есть в проекте и который нарушает правила (возможно, в силу исторических причин) — впрочем, это возможность переписать чужой код.

2.1.Внешний вид кода. ̆

Отступы. Используйте 4 пробела на каждый уровень отступа. Продолжительные строки должны выравнивать обернутые элементы либо вертикально, используя неявную линию в скобках, либо с использованием висячего отступа. При использовании висячего отступа на первой линии не должно быть аргументов, а остальные строки должны четко восприниматься как продолжение линии:

# Выровнено по открывающему разделителю: foo = long_function_name(var_one, var_two,

var_three, var_four)

# Больше отступов включено для отличия от остальных:

def long_function_name(

var_one, var_two, var_three, var_four):

print(var_one)

#Закрывающие скобки в многострочных конструкциях могут находиться под первым непробельным символом последней строки : result = some_function_that_takes_arguments(

'a', 'b', 'c', 'd', 'e', 'f',

)

#либо быть под первым символом строки, начинающей многострочную конструкцию:

my_list = [ 1, 2, 3,

] 4, 5, 6,

Табуляция или пробелы?

Пробелы - самый предпочтительный метод отступов.

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

Python 3 запрещает смешивание табуляции и пробелов в отступах.