×
Traktatov.net » Программирование на Python » Читать онлайн
Страница 31 из 625 Настройки

>>> for person in people:

print(person[0][1], person[2][1])    # имя, оклад

Bob Smith 10000 Sue Jones 20000

>>> [person[0][1] for person in people] # выборка имен [‘Bob Smith’, ‘Sue Jones’]

>>> for person in people:

print(person[0][1].split()[-1]) # получить фамилию person[2][1] *= 1.10    # повысить оклад на 10%

Smith

Jones

>>> for person in people: print(person[2])

[‘pay’, 11000.0]

[‘pay’, 22000.0]

Все, чего мы добились, - добавили еще один уровень индексирования. Для достижения желаемого мы могли бы просматривать имена полей в цикле, отыскивая необходимые (в следующем цикле используется операция присваивания кортежа для распаковывания пар имя/значение):

>>> for person in people:

for (name, value) in person:

if name == ‘name': print(value) # поиск требуемого поля

Bob Smith Sue Jones

Еще лучше было бы реализовать функцию, выполняющую всю работу за нас:

>>> def field(record, label):

for (fname, fvalue) in record:

if fname == label:    # поиск поля по имени

return fvalue

>>> field(bob, ‘name')

‘Bob Smith’

>>> field(sue, ‘pay')

22000.0

>>> for rec in people:    # вывести возраст всех людей

print(field(rec, ‘age'))    # в базе данных

42

45

Если двигаться дальше по этому пути, в конечном итоге можно получить набор функций, осуществляющих интерфейс к записям, отображающих имена полей в их значения. Однако если прежде вам приходилось программировать на языке Python, вы наверняка знаете, что существует более простой способ реализации такого рода ассоциаций, и вы уже наверняка догадались, в какую сторону мы направимся в следующем разделе.


Словари

Реализация записей на основе списков, как было показано в предыдущем разделе, вполне работоспособна, хотя и за счет некоторой потери производительности из-за необходимости выполнять поиск полей по именам (если вас волнуют потери, измеряемые миллисекундами). Однако если вы уже имеете некоторое знакомство с языком Python, вы должны знать, что существуют более эффективные и более удобные способы связывания имен полей с их значениями. Встроенные объекты словарей выглядят естественно:

>>> bob = {‘name': ‘Bob Smith', ‘age': 42, ‘pay': 30000, ‘job': ‘dev'}

>>> sue = {‘name': ‘Sue Jones', ‘age': 45, ‘pay': 40000, ‘job': ‘hdw'}

Теперь bob и sue - это объекты, автоматически отображающие имена полей в их значения, и их использование делает программный код более простым и понятным. Нам не требуется запоминать, что означают числовые индексы, и мы даем интерпретатору возможность использовать его высокоэффективный алгоритм индексации словарей, чтобы отыскивать значения полей, ассоциированные с их именами:

>>> bob[‘name'], sue[‘pay'] # в отличие от bob[0], sue[2]

(‘Bob Smith’, 40000)

>>> bob[‘name'].split()[-1]

‘Smith’

>>> sue[‘pay'] *= 1.10

>>> sue[‘pay']

44000.0

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

Другие способы создания словарей

Словари являются настолько удобными объектами при программировании на языке Python, что было предусмотрено еще несколько способов их создания, отличающихся от традиционного синтаксиса литералов, продемонстрированного выше, - например, вызовом конструктора с именованными аргументами, при этом все ключи будут строками: