Лутц М. - Изучаем Python (1077325), страница 47
Текст из файла (страница 47)
Попутно мы подробно изучили различные концепции, такие как извлечение среза, вызовы методов и блоки строк в тройных кавычках. 213 Закрепление пройденного Кроме того, мы определили некоторые идеи, общие для различных типов: последовательности, к примеру, поддерживают общий набор операций. В следующей главе мы продолжим наши исследования и рассмотрим наиболее типичные коллекции объектов в языке Руьпоп— списки и словари. Там вы увидите, что многое из того, что говорилось здесь, применимо и к этим двум типам. Но перед этим ответьте на контрольные вопросы главы, которые помогут вам закрепить сведения, полученные здесь.
Закрепление пройденного Контрольные вопросы 1. Можно ли использовать строковый метод 11пс для поиска в списках? 2. Можно ли применить выражение извлечения среза к спискам? 3. Как бы вы преобразовали символы в соответствующие им целочисленные коды АЯСП? Как бы вы выполнили обратное преобразование — из кодов в символы? 4. Как бы вы реализовали изменение строки на языке Руьпоп? 5. Допустим, что имеется строка 8 со значением "з, ра, а".
Укажите два способа извлечения двух символов в середине строки. 6. Сколько символов в строке 'а~пЬ~х1Г~0000"? 7. По каким причинам вы могли бы использовать модуль з1г1пд вместо строковых методов? Ответы 1. Нет, потому что методы всегда зависят от типа объекта. То есть, они могут применяться только к одному определенному типу данных.
Но выражения являются более универсальными и могут использоваться для выполнения операций над различными типами. В этом случае, к примеру, оператор проверки вхождения 1п имеет похожий эффект и может использоваться для поиска как в строках, так и в списках. 2. Да, В отличие от методов, выражения универсальны и могут использоваться для выполнения операций над различными типами. В данном случае операция извлечения среза в действительности является операцией над последовательностями — она может применяться к любому типу последовательностей, включая строки, списки и кортежи.
Различие состоит лишь в том, что при выполнении операции над списком в результате будет получен новый список. 3. Встроенная функция ог0(8) преобразует односимвольную строку в целочисленный код. Функция сл г(1) преобразует целочисленный код в символ. Глава 7. Строки 4. Строки невозможно изменить — они являются неизменяемыми. Однако подобного эффекта можно добиться, создав новую строку,— выполнив операцию конкатенации, извлечения среза, форматирования или вызвав метод, такой как гер)асе, — и затем присвоив результат первоначальной переменной, 5.
Можно извлечь подстроку с помощью выражения 8[2:4] или, разбив строку по запятым, извлечь строку с помощью выражения Я, врПт( ', ')[1]. Попробуйте выполнить эти выражения в интерактивном сеансе, чтобы получить представление о том, как они действуют. 6. Шесть. Строка "атпэ\х1(т,0000" содержит следующие символы: а, символ новой строки (тп), э, символ с десятичным кодом 31 (тх1Г— в шестнадцатеричном представлении), символ с кодом 0 (т,000— в восьмеричном представлении) и с. Передайте строку встроенной функции )еп, чтобы проверить этот ответ, и выведите результаты преобразования каждого символа с помощью функции ого, чтобы увидеть фактические значения кодов символов.
За более подробной информацией обращайтесь к табл. 7.2. 7. Вам не следует использовать модуль этг(пд. При создании новых программ следует использовать строковые методы — функции этого модуля считаются устаревшими и скорее всего будут исключены из Ру(Поп 3.0. Единственная причина использования модуля этг(пд— это применение других средств из этого модуля, таких как предопределенные константы и шаблонные объекты. Списки и словари В этой главе вашему вниманию будут представлены такие типы объектов, как списки и словари, каждый из которых является коллекцией других объектов. Эти два типа являются основными рабочими лошадками практически во всех сценариях на языке Руьпоп.
Как вы увидите далее, оба типа обладают исключительной гибкостью: они могут изменяться непосредственно, могут увеличиваться и уменьшаться в размерах по мере необходимости и могут быть вложены в объекты любых других типов. Благодаря этим типам вы сможете создавать и обрабатывать в своих сценариях структуры данных любой степени сложности. Списки Следующая остановка в нашем путешествии по встроенным объектам языка Рубанов называется список. Списки — это самый гибкий тип упорядоченных коллекций в языке РуФпоп. В отличие от строк списки могут содержать объекты любых типов: числа, строки и даже другие списки. Кроме того, в отличие от строк, списки могут изменяться непосредственно, с помощью операции присваивания по смещениям и срезам, с помощью методов списков, с использованием инструкций удаления и другими способами — списки являются изменяемыми объектами.
Списки в языке Ру1поп реализуют практически все необходимое для работы с коллекциями данных, что вам пришлось бы писать вручную при использовании низкоуровневого языка программирования, такого как язык С. Ниже приводятся основные свойства списков. Списки в языке РуФпоп — зто: Упорядоченные коллекции обзектов произвольных типов С функциональной точки зрения, списки — это лишь место, в котором собраны другие объекты, поэтому их можно также рассматривать Глава 8. Списки и словари как группы. Кроме того, списки обеспечивают позиционное упорядочение элементов слева направо (то есть они являются последовательностями).
Доступ к элементам по смещению Так же, как и в случае ео строками, вы можете использовать операцию индексирования для извлечения отдельных объектов из списка по их смещениям. Поскольку элементы в списках упорядочены по их местоположению, можно также выполнять такие действия, как извлечение срезов и конкатенация. Переменная длина, гетерогенность и произвольное число уровней вложенности В отличие от строк списки могут увеличиваться и уменьшаться непосредственно (их длина может изменяться) и могут содержать не только односимвольные строки, но и любые другие объекты (списки гетерогенны).
Списки могут содержать другие сложные объекты и поддерживают возможность создания произвольного числа уровней вложенности, поэтому имеется возможность создавать списки из списков из списков и т. д. Относятся к категории изменяемых объектов В терминах категорий типов списки могут изменяться непосредственно (являются изменяемыми объектами) и поддерживают все операции над последовательностями, которые поддерживаются и строками, такие как индексирование, извлечение срезов и конкатенация.
Операции над последовательностями одинаковым образом работают как в случае списков, так и в случае строк, единственное отличие — при применении операций над последовательностями (таких как конкатенация и извлечение среза) к спискам операций возвращают новый список, а не новую строку. Кроме того, т. к. списки являются изменяемыми объектами, они поддерживают также операции, которые не поддерживаются строками (такие как операции удаления и присваивания по индексам, которые изменяют список непосредственно). Массивы ссылок на объекты Формально списки в языке РуФЬоп могут содержать ноль или более ссылок на другие объекты.
Списки чем-то напоминают массивы указателей (адресов). Извлечение элемента из списка в языке Руслоп выполняется так же быстро, как извлечение элемента массива в языке С. В действительности списки — это самые настоящие массивы языка С, реализованные в интерпретаторе Руьпоп, а не связанные структуры данных. Как мы узнали в главе 6, всякий раз, когда используется ссылка на объект, интерпретатор разыменовывает ее, поэтому ваши программы всегда будут иметь дело только е объектами.
Всякий раз, когда выполняетея приеваивание объекта элементу какой-либо структуры или имени переменной, интерпретатор Руъпоп 237 Списки сохраняет ссылку на этот объект, а не его копию (за исключением, когда явно запрашивается выполнение операции копирования). В табл. 8.1 приводятся наиболее типичные операции, применяемые к спискам. Как обычно, за дополнительной информацией о списках вам следует обратиться к руководству по стандартной библиотеке языка РУФ)гоп или запустить Ье1р(115() или б1Г(1151) в интерактивной оболочке, чтобы получить полный список методов списков — этим функциям можно передать существующий список или слово 115(, которое является именем типа данных 'список'.
Таблица В.1. Литералы списков и операции Операция Интерпретация Е1=[] (2=[0,1,2,3] Конкатенация, дублирование [1 4 (2 (2 ° 3 Обход в цикле, проверка вхождения Гог х гп (2 3 1П (2 Уменьшение списка 12[4] = 1 (2[к)] = [4,5,6] гзпце(4) хгзпце(0, 4) (4 = [х-*2 Гог х гп гапце(5)] Когда список определяется литеральным выражением, он записывается как последовательность объектов (точнее, как последовательность (3 = ['зос', ['Зе(', цы']] (2[г] (3[ей) ] [2[к)] 1еп((2) (2.зррепо(4) (2,ех(епо([5,6Л]) (2.зогг() $.2.гпзех(1) (2лпзег(( 1, Х) (2.гечегзе() Ое1 1.2[К] Зе1 [2[1.']] 1.2.рор( ) 52. гееоче( 2) Ьг[1:1] = [] Пустой список Четыре элемента с индексами 0..3 Вложенные списки Индекс, индекс индекса, срез, длина Методы: дополнение списка, сортировка, по- иск, вставка, изменение порядка следования элементов на обратный и т.
д. Присваивание по индексу, присваивание срезу Создание списков/кортежей целых чисел Дополнительные операции над списками (гла- вы 13 и 17) 228 Глава 8. Списки и словари выражений, создающих объекты) в квадратных скобках, разделенных запятыми. Например, вторая строка в табл. 8.1 присваивает переменной Г 2 список из четырех элементов, Вложенные списки описываются как вложенные последовательности квадратных скобок (строка 3), апустые списки определяются как пустая пара квадратных скобок (строка 1).' Многие операции из табл. 8.1 должны выглядеть для вас знакомыми, так как они являются теми же самыми операциями над последовательностями, которые мы применяли к строкам, — индексирование, конкатенация, обход элементов в цикле и т. д.
Кроме того, списки поддерживают специфические для своего типа методы (такие как сортировка, перестановка элементов в обратном порядке, добавление элементов в конец списка и т. д.), а также операции непосредственного изменения списка (удаление элементов, присваивание по индексам и срезам и т. д.). Списки получили эти операции потому, что они относятся к категории объектов изменяемых типов. Списки в действии Возможно, самый лучший способ понять принцип действия списков— это посмотреть на них в действии. Давайте еще раз вернемся к инте- рактивному сеансу работы с интерпретатором и проиллюстрируем опе- рации из табл. 8.1. Базовые операции над списками В рутаоп >» 1вп([1, 2, 3)) 3 »> [1, 2, 3) + [4, 5, 6) [1, 2, 3. 4, т1, 6) »> ['В11') 4 ['вп ', 'вп '.