Марк Лутц - Программирование на Python [Том 1]

Тут можно читать онлайн Марк Лутц - Программирование на Python [Том 1] - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство Символ-Плюс, год 2011. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Программирование на Python [Том 1]
  • Автор:
  • Жанр:
  • Издательство:
    Символ-Плюс
  • Год:
    2011
  • ISBN:
    978-5-93286-210-0
  • Рейтинг:
    4/5. Голосов: 11
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Марк Лутц - Программирование на Python [Том 1] краткое содержание

Программирование на Python [Том 1] - описание и краткое содержание, автор Марк Лутц, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Программирование на Python [Том 1] - читать онлайн бесплатно полную версию (весь текст целиком)

Программирование на Python [Том 1] - читать книгу онлайн бесплатно, автор Марк Лутц
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Кроме того, так как имена полей являются независимыми переменными, между записью в виде списка и именами полей отсутствует обратная связь. Имея одну только запись в виде списка, например, нельзя реализовать форматированный вывод значений полей с их именами. В случае с предыдущей записью без дополнительных ухищрений невозможно получить имя AGE из значения 42: вызов bob.index(42) вернет 1, значение переменной AGE, но не само имя AGE.

Можно было бы попробовать представлять записи в виде списков кортежей, где кортежи хранят не только значения полей, но их имена. Но еще лучше было бы использовать списки списков, что позволило бы изменять поля (кортежи относятся к категории неизменяемых объектов). Ниже демонстрируется воплощение этой идеи на примере простых записей:

>>> bob = [['name', ‘Bob Smith'], ['age', 42], ['pay', 10000]]

>>> sue = [['name', ‘Sue Jones'], ['age', 45], ['pay', 20000]]

>>> people = [bob, sue]

Однако на самом деле этот прием не решает проблему, потому что для извлечения полей все равно необходимо использовать числовые индексы:

>>> 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, что было предусмотрено еще несколько способов их создания, отличающихся от традиционного синтаксиса литералов, продемонстрированного выше, - например, вызовом конструктора с именованными аргументами, при этом все ключи будут строками:

>>> bob = dict(name='Bob Smith', age=42, pay=30000, job='dev')

>>> sue = dict(name='Sue Jones', age=45, pay=40000, job='hdw')

>>> bob

{‘pay’: 30000, ‘job’: ‘dev’, ‘age’: 42, ‘name’: ‘Bob Smith’}

>>> sue

{‘pay’: 40000, ‘job’: ‘hdw’, ‘age’: 45, ‘name’: ‘Sue Jones’}

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

>>> sue = {}

>>> sue[‘name'] = ‘Sue Jones'

>>> sue[‘age'] = 45 >>> sue[‘pay'] = 40000 >>> sue[‘job'] = ‘hdw'

>>> sue

{‘job’: ‘hdw’, ‘pay’: 40000, ‘age’: 45, ‘name’: ‘Sue Jones’}

объединением двух списков, содержащих имена и значения:

>>> names = [‘name', ‘age', ‘pay', ‘job']

>>> values = [‘Sue Jones', 45, 40000, ‘hdw']

>>> list(zip(names, values))

[(‘name’, ‘Sue Jones’), (‘age’, 45), (‘pay’, 40000), (‘job’, ‘hdw’)]

>>> sue = dict(zip(names, values))

>>> sue

{‘job’: ‘hdw’, ‘pay’: 40000, ‘age’: 45, ‘name’: ‘Sue Jones’}

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

>>> fields = (‘name', ‘age', ‘job', ‘pay')

>>> record = dict.fromkeys(fields, ‘?')

>>> record

{‘job’: ‘?’, ‘pay’: ‘?’, ‘age’: ‘?’, ‘name’: ‘?’}

Списки словарей

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

>>> bob

{‘pay’: 30000, ‘job’: ‘dev’, ‘age’: 42, ‘name’: ‘Bob Smith’}

>>> sue

{‘job’: ‘hdw’, ‘pay’: 40000, ‘age’: 45, ‘name’: ‘Sue Jones’}

>>> people = [bob, sue] # ссылки в списке

>>> for person in people:

print(person[‘name'], person[‘pay'], sep=', ‘) # все имена, оклады

Bob Smith, 30000 Sue Jones, 40000

>>> for person in people:

if person[‘name'] == ‘Sue Jones': # оклад Сью

print(person[‘pay'])

40000

Здесь точно так же используются инструменты итераций, но вместо таинственных числовых индексов используются ключи (в терминах баз данных генератор списков и функция map в следующем примере возвращают проекцию базы данных по полю «name»):

>>> names = [person[‘name'] for person in people] # выбирает имена >>> names

[‘Bob Smith’, ‘Sue Jones’]

>>> list(map((lambda x: x[‘name']), people)) # то же самое

[‘Bob Smith’, ‘Sue Jones’]

>>> sum(person[‘pay'] for person in people) # сумма всех окладов

70000

Интересно, что такие инструменты, как генераторы списков и выражения-генераторы, способны по своему удобству приблизиться к запросам в языке SQL, с тем отличием, что они манипулируют объектами в памяти:

>>> [rec[‘name'] for rec in people if rec[‘age'] >= 45] # SQL-подобный

[‘Sue Jones’] # запрос

>>> [(rec[‘age'] ** 2 if rec[‘age'] >= 45 else rec[‘age']) for rec in people]

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Марк Лутц читать все книги автора по порядку

Марк Лутц - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Программирование на Python [Том 1] отзывы


Отзывы читателей о книге Программирование на Python [Том 1], автор: Марк Лутц. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x