ЛЕКЦИЯ 5
.pdfЛекция 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 запрещает смешивание табуляции и пробелов в отступах.