М. Лутц - Изучаем Python (4-е издание)- 2011 (1126907), страница 64
Текст из файла (страница 64)
К настоящему моменту мы исследовали только числа и строки, но так как они относятся к двум из трех основных категорийв языке Python, то вы знаете о других типах гораздо больше, чем могли бы подумать.Типы одной категории имеют общий набор операцийКак вы уже знаете, строки представляют собой неизменяемые последовательности: они не могут быть изменены непосредственно (неизменяемые) и являются упорядоченными коллекциями элементов, доступ к которым может осуществляться по величине смещения (последовательности). Оказывается, надпоследовательностями, которые мы будем рассматривать в этой части книги,могут выполняться те же операции, которые были продемонстрированы в этойглаве, – конкатенация, доступ к элементам по индексам, обход элементов в цикле и так далее.
Формально в языке Python существует три категории типов(и операций):Числа (целые, вещественные, с фиксированной точностью, рациональные и др.)Поддерживают операции сложения, умножения и так далее.250Глава 7. СтрокиПоследовательности (строки, списки, кортежи)Поддерживают операции индексации, извлечения среза, конкатенациии так далее.Отображения (словари)Поддерживают операцию индексации по ключу и так далее.Множества образуют отдельную категорию типов (они не отображают ключив значения и не являются упорядоченными последовательностями), и мы ещене рассматривали подробно отображения (словари обсуждаются в следующейглаве), но к другим типам, которые нам встретятся, в основном будут применимы одни и те же операции.
Например, для любых объектов последовательностей X и Y:•• Выражение X + Y создает новый объект последовательности, включающийсодержимое обоих операндов.•• Выражение X * N создает новый объект последовательности, включающий Nкопий операнда X.Другими словами, эти операции действуют одинаково на любые виды последовательностей, включая строки, списки, кортежи и некоторые типы, определяемые пользователем.
Единственное отличие состоит в том, что результат, возвращаемый выражением, имеет тот же тип, что и операнды X и Y, то есть, есливыполняется операция конкатенации списков, то возвращается новый список,а не строка. Операции индексации и извлечения среза одинаково работают длялюбых последовательностей – тип объекта определяет, какая задача должнабыть решена.Изменяемые типыдопускают непосредственное изменениеКлассификация по возможности изменения – это слишком существенное ограничение, чтобы не помнить о нем, и все же она часто сбивает с толку начинающих программистов. Если объект является значением неизменяемого типа, выне сможете изменить его непосредственно – в этом случае интерпретатор будетвыдавать сообщение об ошибке. Вместо этого необходимо, чтобы программныйкод создавал новый объект, содержащий новое значение.
Основные базовыетипы данных в языке Python делятся на следующие категории:Неизменяемые (числа, строки, кортежи, фиксированные множества)Объекты неизменяемых типов не поддерживают возможность непосредственного изменения значения объекта, однако вы всегда сможете создавать новые объекты с помощью выражений и присваивать их требуемымпеременным.Изменяемые (списки, словари, множества)Объекты изменяемых типов, наоборот, всегда могут изменяться непосредственно, с помощью операций, которые не создают новые объекты. Изменяемые объекты могут быть скопированы, но они поддерживают и возможность непосредственного изменения.Вообще неизменяемые типы обеспечивают определенный уровень поддержкицелостности, гарантируя, что объект не подвергнется изменениям в другой части программы. Чтобы вспомнить, почему это имеет такое большое значение,В заключение251вернитесь к дискуссии о разделяемых ссылках на объекты в главе 6.
Чтобыувидеть, как списки, словари и кортежи соотносятся с категориями типов, намследует перейти к следующей главе.В заключениеВ этой главе мы подробно рассмотрели строковый тип объектов. Мы узналио строковых литералах и исследовали операции над строками, включая выражения с последовательностями, вызовы методов и форматирование с применением оператора форматирования и метода format. Попутно мы подробноизучили различные концепции, такие как извлечение среза, синтаксис вызоваметодов и блоки строк в тройных кавычках.
Кроме того, мы определили некоторые идеи, общие для различных типов: последовательности, к примеру, поддерживают общий набор операций.В следующей главе мы продолжим наши исследования и рассмотрим наиболее типичные коллекции объектов в языке Python – списки и словари. Там выувидите, что многое из того, что говорилось здесь, применимо и к этим двумтипам. Как уже упоминалось выше, в заключительной части этой книги мывернемся к модели реализации строк в языке Python и подробнее рассмотримособенности поддержки символов Юникода и двоичных данных в строках,которые представляют интерес для некоторых программистов, хотя и не длявсех. Но перед этим ответьте на контрольные вопросы главы, которые помогутвам закрепить сведения, полученные здесь.Закрепление пройденногоКонтрольные вопросы1. Можно ли использовать строковый метод find для поиска в списках?2.
Можно ли применить выражение извлечения среза к спискам?3. Как бы вы преобразовали символы в соответствующие им целочисленныекоды ASCII? Как бы вы выполнили обратное преобразование – из кодовв символы?4. Как бы вы реализовали изменение строки на языке Python?5. Допустим, что имеется строка S со значением “s,pa,m”. Укажите два способаизвлечения двух символов в середине строки.6. Сколько символов в строке “a\nb\x1f\000d”?7. По каким причинам вы могли бы использовать модуль string вместо строковых методов?Ответы1. Нет, потому что методы всегда зависят от типа объекта.
То есть они могут применяться только к одному определенному типу данных. Но выражения, такие как X+Y, и встроенные функции, такие как len(X), являютсяболее универсальными и могут использоваться для выполнения операцийнад различными типами. В данном случае, к примеру, оператор проверкивхождения in имеет похожий эффект и может использоваться для поиска252Глава 7. Строкикак в строках, так и в списках.
В Python 3.0 была предпринята попыткасгруппировать методы по категориям (например, типы изменяемых последовательностей, list и bytearray, обладают похожим множеством методов),и тем не менее методы все равно зависят от типа объекта в большей степени,чем другие разновидности операций.2.
Да. В отличие от методов, выражения универсальны и могут использоваться для выполнения операций над различными типами. В данном случаеоперация извлечения среза в действительности является операцией надпоследовательностями – она может применяться к любому типу последовательностей, включая строки, списки и кортежи. Различие состоит лишьв том, что при выполнении операции над списком в результате будет получен новый список.3.
Встроенная функция ord(S) преобразует односимвольную строку в целочисленный код. Функция chr(I) преобразует целочисленный код в символ.4. Строки невозможно изменить – они являются неизменяемыми. Однако подобного эффекта можно добиться, создав новую строку, – выполнив операцию конкатенации, извлечения среза, форматирования или вызвав метод,такой как replace, – и затем присвоив результат первоначальной переменной.5. Можно извлечь подстроку с помощью выражения S[2:4] или, разбив строкупо запятым, извлечь строку с помощью выражения S.split(‘,’)[1]. Попробуйте выполнить эти выражения в интерактивном сеансе, чтобы получитьпредставление о том, как они действуют.6. Шесть.
Строка “a\nb\x1f\000d” содержит следующие символы: a, символ новой строки (\n), b, символ с десятичным кодом 31 (\x1f – в шестнадцатеричном представлении), символ с кодом 0 (\000 – в восьмеричном представлении) и d. Передайте эту строку встроенной функции len, чтобы проверитьответ и выведите результаты преобразования каждого символа с помощьюфункции ord, чтобы увидеть фактические значения кодов символов. За более подробной информацией обращайтесь к табл. 7.2.7. Вам никогда не следует использовать модуль string – он полностью ликвидирован в версии Python 3.0. Единственная причина использования модуляstring – это применение других средств из этого модуля, таких как предопределенные константы и шаблонные объекты.
Кроме того, вы можете заметить, что этот модуль используется только в «старом и пыльном» программном коде на языке Python.Глава 8.Списки и словариВ этой главе вашему вниманию будут представлены такие типы объектов,как списки и словари, каждый из которых является коллекцией других объектов. Эти два типа являются основными рабочими лошадками практическиво всех сценариях на языке Python��������������������������������������������������������������������������������������. Как вы увидите далее, оба типа обладают исключительной гибкостью: они могут изменяться непосредственно, могутувеличиваться и уменьшаться в размерах по мере необходимости и могут бытьвложены в объекты любых других типов. Благодаря этим типам вы сможетесоздавать и обрабатывать в своих сценариях структуры данных любой степенисложности.СпискиСледующая остановка в нашем путешествии по встроенным объектам языкаPython называется список.
Списки – это самые гибкий тип упорядоченныхколлекций в языке �������������������������������������������������������Python�������������������������������������������������. В отличие от строк, списки могут содержать объекты любых типов: числа, строки и даже другие списки. Кроме того, в отличиеот строк, списки могут изменяться непосредственно, с помощью операции присваивания по смещениям и срезам, с помощью методов списков, с использованием инструкций удаления и другими способами – списки являются изменяемыми объектами.Списки в языке Python реализуют практически все необходимое для работыс коллекциями данных, что вам пришлось бы писать вручную при использовании низкоуровневого языка программирования, такого как язык C.
Нижеприводятся основные свойства списков. Списки в языке Python – это:Упорядоченные коллекции объектов произвольных типовС функциональной точки зрения, списки – это лишь место, в котором собраны другие объекты, поэтому их можно также рассматривать как группы. Кроме того, списки обеспечивают позиционное упорядочение элементовслева направо (то есть они являются последовательностями).254Глава 8. Списки и словариДоступ к элементам по смещениюТак же как и в случае со строками, вы можете использовать операцию индексирования для извлечения отдельных объектов из списка по их смещениям. Поскольку элементы в списках упорядочены по их местоположению,можно также выполнять такие действия, как извлечение срезов и конкатенация.Переменная длина, гетерогенность и произвольное число уровней вложенностиВ отличие от строк, списки могут увеличиваться и уменьшаться непосредственно (их длина может изменяться) и могут содержать не только односимвольные строки, но и любые другие объекты (списки гетерогенны).
Спискимогут содержать другие сложные объекты и поддерживают возможностьсоздания произвольного числа уровней вложенности, поэтому имеется возможность создавать списки списков из списков и так далее.Относятся к категории изменяемых объектовВ терминах категорий типов списки могут изменяться непосредственно(являются изменяемыми объектами) и поддерживают все операции над последовательностями, которые поддерживаются и строками, такие как индексирование, извлечение срезов и конкатенация.
Операции над последовательностями одинаковым образом работают как в случае списков, так и вслучае строк, единственное отличие – при применении операций над последовательностями (таких как конкатенация и извлечение среза) к спискамвозвращается новый список, а не новая строка. Кроме того, т. к. списки являются изменяемыми объектами, они поддерживают также операции, которые не поддерживаются строками (такие как операции удаления и присваивания по индексам, изменяющие список непосредственно).Массивы ссылок на объектыФормально списки в языке Python могут содержать ноль или более ссылокна другие объекты. Списки чем-то напоминают массивы указателей (адресов). Извлечение элемента из списка в языке Python выполняется так жебыстро, как извлечение элемента массива в языке C. В действительностисписки – это самые настоящие массивы языка C�������������������������������������������������, реализованные в интерпретаторе �������������������������������������������������������������Python�������������������������������������������������������, а не связанные структуры данных.