Главная страница
Навигация по странице:

  • Изменяемые типы допускают непосредственное изменение

  • Закрепление пройденного Контрольные вопросы

  • Операция Интерпретация

  • Базовые операции над списками

  • >>> str([1, 2]) + "34"

  • L = [spam, Spam, SPAM!] >>> L[2]

  • Математический анализ. 3е издание


    Скачать 4.86 Mb.
    Название3е издание
    АнкорМатематический анализ
    Дата04.02.2022
    Размер4.86 Mb.
    Формат файлаpdf
    Имя файлаpython_01.pdf
    ТипДокументы
    #351981
    страница28 из 98
    1   ...   24   25   26   27   28   29   30   31   ...   98
    212
    Глава 7. Строки
    Последовательности
    Поддерживают операции индексации, извлечения среза, конкате
    нации и т. д.
    Отображения
    Поддерживают операцию индексации по ключу и т. д.
    Мы еще не рассматривали подробно отображения (словари обсуждают
    ся в следующей главе), но к другим типам, которые нам встретятся,
    в основном будут применимы одни и те же операции. Например, для любых объектов последовательностей X и Y:

    Выражение X + Y создает новый объект последовательности, вклю
    чающий содержимое обоих операндов.

    Выражение X * N создает новый объект последовательности, вклю
    чающий N копий операнда X.
    Другими словами, эти операции действуют одинаково на любые виды последовательностей, включая строки, списки, кортежи и некоторые типы, определяемые пользователем. Единственное отличие состоит в том, что результат, возвращаемый выражением, имеет тот же тип, что и операнды X и Y, то есть, если выполняется операция конкатенации списков, то возвращается новый список, а не строка. Операции индекса
    ции и извлечения среза одинаково работают для любых последователь
    ностей – тип объекта определяет, какая задача должна быть решена.
    Изменяемые типы допускают
    непосредственное изменение
    Классификация по возможности изменения – это существенное огра
    ничение, чтобы не помнить о нем, и все же она часто сбивает с толку начинающих программистов. Если объект является неизменяемым типом, вы не сможете изменить его значение непосредственно – в этом случае интерпретатор будет выдавать сообщение об ошибке. Вместо этого необходимо, чтобы программный код создавал новый объект, со
    держащий новое значение. Вообще неизменяемые типы обеспечивают определенный уровень поддержки целостности, гарантируя, что объ
    ект не подвергнется изменениям в другой части программы. Чтобы вспомнить, почему это имеет такое большое значение, вернитесь к дис
    куссии о разделяемых ссылках на объекты в главе 6.
    В заключение
    В этой главе мы подробно рассмотрели строковый тип объектов. Мы узнали о строковых литералах и исследовали операции над строками,
    включая операции над последовательностями, форматирование и ме
    тоды. Попутно мы подробно изучили различные концепции, такие как извлечение среза, вызовы методов и блоки строк в тройных кавычках.

    Закрепление пройденного
    213
    Кроме того, мы определили некоторые идеи, общие для различных ти
    пов: последовательности, к примеру, поддерживают общий набор опе
    раций. В следующей главе мы продолжим наши исследования и рас
    смотрим наиболее типичные коллекции объектов в языке Python –
    списки и словари. Там вы увидите, что многое из того, что говорилось здесь, применимо и к этим двум типам. Но перед этим ответьте на кон
    трольные вопросы главы, которые помогут вам закрепить сведения,
    полученные здесь.
    Закрепление пройденного
    Контрольные вопросы
    1. Можно ли использовать строковый метод find для поиска в спи
    сках?
    2. Можно ли применить выражение извлечения среза к спискам?
    3. Как бы вы преобразовали символы в соответствующие им целочис
    ленные коды ASCII? Как бы вы выполнили обратное преобразова
    ние – из кодов в символы?
    4. Как бы вы реализовали изменение строки на языке Python?
    5. Допустим, что имеется строка S со значением "s,pa,m". Укажите два способа извлечения двух символов в середине строки.
    6. Сколько символов в строке "a\nb\x1f\000d"?
    7. По каким причинам вы могли бы использовать модуль string вме
    сто строковых методов?
    Ответы
    1. Нет, потому что методы всегда зависят от типа объекта. То есть, они могут применяться только к одному определенному типу данных.
    Но выражения являются более универсальными и могут использо
    ваться для выполнения операций над различными типами. В этом случае, к примеру, оператор проверки вхождения in имеет похо
    жий эффект и может использоваться для поиска как в строках, так и в списках.
    2. Да. В отличие от методов, выражения универсальны и могут ис
    пользоваться для выполнения операций над различными типами.
    В данном случае операция извлечения среза в действительности яв
    ляется операцией над последовательностями – она может приме
    няться к любому типу последовательностей, включая строки, спи
    ски и кортежи. Различие состоит лишь в том, что при выполнении операции над списком в результате будет получен новый список.
    3. Встроенная функция ord(S) преобразует односимвольную строку в целочисленный код. Функция chr(I) преобразует целочисленный код в символ.

    214
    Глава 7. Строки
    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 –
    это применение других средств из этого модуля, таких как предо
    пределенные константы и шаблонные объекты.

    8
    Списки и словари
    В этой главе вашему вниманию будут представлены такие типы объек
    тов, как списки и словари, каждый из которых является коллекцией других объектов. Эти два типа являются основными рабочими лошад
    ками практически во всех сценариях на языке Python. Как вы увидите далее, оба типа обладают исключительной гибкостью: они могут изме
    няться непосредственно, могут увеличиваться и уменьшаться в разме
    рах по мере необходимости и могут быть вложены в объекты любых других типов. Благодаря этим типам вы сможете создавать и обрабаты
    вать в своих сценариях структуры данных любой степени сложности.
    Списки
    Следующая остановка в нашем путешествии по встроенным объектам языка Python называется список. Списки – это самый гибкий тип упо
    рядоченных коллекций в языке Python. В отличие от строк списки мо
    гут содержать объекты любых типов: числа, строки и даже другие спи
    ски. Кроме того, в отличие от строк, списки могут изменяться непосред
    ственно, с помощью операции присваивания по смещениям и срезам,
    с помощью методов списков, с использованием инструкций удаления и другими способами – списки являются изменяемыми объектами.
    Списки в языке Python реализуют практически все необходимое для работы с коллекциями данных, что вам пришлось бы писать вручную при использовании низкоуровневого языка программирования, тако
    го как язык C. Ниже приводятся основные свойства списков. Списки в языке Python – это:
    Упорядоченные коллекции объектов произвольных типов
    С функциональной точки зрения, списки – это лишь место, в котором собраны другие объекты, поэтому их можно также рассматривать

    216
    Глава 8. Списки и словари как группы. Кроме того, списки обеспечивают позиционное упоря
    дочение элементов слева направо (то есть они являются последова
    тельностями).
    Доступ к элементам по смещению
    Так же, как и в случае со строками, вы можете использовать опера
    цию индексирования для извлечения отдельных объектов из спи
    ска по их смещениям. Поскольку элементы в списках упорядочены по их местоположению, можно также выполнять такие действия,
    как извлечение срезов и конкатенация.
    Переменная длина, гетерогенность и произвольное число уровней
    вложенности
    В отличие от строк списки могут увеличиваться и уменьшаться не
    посредственно (их длина может изменяться) и могут содержать не только односимвольные строки, но и любые другие объекты (спи
    ски гетерогенны). Списки могут содержать другие сложные объек
    ты и поддерживают возможность создания произвольного числа уровней вложенности, поэтому имеется возможность создавать списки из списков из списков и т. д.
    Относятся к категории изменяемых объектов
    В терминах категорий типов списки могут изменяться непосредст
    венно (являются изменяемыми объектами) и поддерживают все опе
    рации над последовательностями, которые поддерживаются и стро
    ками, такие как индексирование, извлечение срезов и конкатена
    ция. Операции над последовательностями одинаковым образом ра
    ботают как в случае списков, так и в случае строк, единственное отличие – при применении операций над последовательностями (та
    ких как конкатенация и извлечение среза) к спискам операций воз
    вращают новый список, а не новую строку. Кроме того, т. к. списки являются изменяемыми объектами, они поддерживают также опе
    рации, которые не поддерживаются строками (такие как операции удаления и присваивания по индексам, которые изменяют список непосредственно).
    Массивы ссылок на объекты
    Формально списки в языке Python могут содержать ноль или более ссылок на другие объекты. Списки чемто напоминают массивы ука
    зателей (адресов). Извлечение элемента из списка в языке Python выполняется так же быстро, как извлечение элемента массива в язы
    ке C. В действительности списки – это самые настоящие массивы языка C, реализованные в интерпретаторе Python, а не связанные структуры данных. Как мы узнали в главе 6, всякий раз, когда ис
    пользуется ссылка на объект, интерпретатор разыменовывает ее, по
    этому ваши программы всегда будут иметь дело только с объектами.
    Всякий раз, когда выполняется присваивание объекта элементу ка
    койлибо структуры или имени переменной, интерпретатор Python

    Списки
    217
    сохраняет ссылку на этот объект, а не его копию (за исключением,
    когда явно запрашивается выполнение операции копирования).
    В табл. 8.1 приводятся наиболее типичные операции, применяемые к спискам. Как обычно, за дополнительной информацией о списках вам следует обратиться к руководству по стандартной библиотеке язы
    ка Python или запустить help(list) или dir(list) в интерактивной обо
    лочке, чтобы получить полный список методов списков – этим функ
    циям можно передать существующий список или слово list, которое является именем типа данных ‘список’.
    Таблица 8.1. Литералы списков и операции
    Когда список определяется литеральным выражением, он записывает
    ся как последовательность объектов (точнее, как последовательность
    Операция
    Интерпретация
    L1 = []
    Пустой список
    L2 = [0, 1, 2, 3]
    Четыре элемента с индексами 0..3
    L3 = ['abc', ['def', ghi']]
    Вложенные списки
    L2[i]
    L3[i][j]
    L2[i:j]
    len(L2)
    Индекс, индекс индекса, срез, длина
    L1 + L2
    L2 * 3
    Конкатенация, дублирование for x in L2 3 in L2
    Обход в цикле, проверка вхождения
    L2.append(4)
    L2.extend([5,6,7])
    L2.sort()
    L2.index(1)
    L2.insert(I, X)
    L2.reverse()
    Методы: дополнение списка, сортировка, по
    иск, вставка, изменение порядка следования элементов на обратный и т. д.
    del L2[k]
    del L2[i:j]
    L2.pop( )
    L2.remove(2)
    L2[i:j] = []
    Уменьшение списка
    L2[i] = 1
    L2[i:j] = [4,5,6]
    Присваивание по индексу, присваивание срезу range(4)
    xrange(0, 4)
    Создание списков/кортежей целых чисел
    L4 = [x**2 for x in range(5)]
    Дополнительные операции над списками (гла
    вы 13 и 17)

    218
    Глава 8. Списки и словари выражений, создающих объекты) в квадратных скобках, разделенных запятыми. Например, вторая строка в табл. 8.1 присваивает перемен
    ной L2 список из четырех элементов. Вложенные списки описываются как вложенные последовательности квадратных скобок (строка 3),
    а пустые списки определяются как пустая пара квадратных скобок
    (строка 1).
    1
    Многие операции из табл. 8.1 должны выглядеть для вас знакомыми,
    так как они являются теми же самыми операциями над последова
    тельностями, которые мы применяли к строкам, – индексирование,
    конкатенация, обход элементов в цикле и т. д. Кроме того, списки под
    держивают специфические для своего типа методы (такие как сорти
    ровка, перестановка элементов в обратном порядке, добавление эле
    ментов в конец списка и т. д.), а также операции непосредственного изменения списка (удаление элементов, присваивание по индексам и срезам и т. д.). Списки получили эти операции потому, что они отно
    сятся к категории объектов изменяемых типов.
    Списки в действии
    Возможно, самый лучший способ понять принцип действия списков –
    это посмотреть на них в действии. Давайте еще раз вернемся к инте
    рактивному сеансу работы с интерпретатором и проиллюстрируем опе
    рации из табл. 8.1.
    Базовые операции над списками
    Списки, как и строки, поддерживают операторы + и * – для списков они так же соответствуют операции конкатенации и повторения, но в ре
    зультате получается новый список, а не строка. Фактически списки поддерживают все общие операции над последовательностями, кото
    рые мы рассматривали применительно к строкам в предыдущей главе.
    % python
    >>> len([1, 2, 3]) # Длина
    3
    >>> [1, 2, 3] + [4, 5, 6] # Конкатенация
    [1, 2, 3, 4, 5, 6]
    >>> ['Ni!'] * 4 # Повторение
    ['Ni!', 'Ni!', 'Ni!', 'Ni!']
    >>> 3 in [1, 2, 3] # Проверка на вхождение
    True
    >>> for x in [1, 2, 3]: print x, # Обход в цикле
    1
    На практике в текстах программ обработки списков вы нечасто встретите списки, заданные подобным образом. Чаще вам будет встречаться про
    граммный код, обрабатывающий списки, которые создаются динамически
    (во время выполнения). Несмотря на всю важность владения синтаксисом литералов, следует иметь в виду, что большая часть структур данных в языке Python конструируется во время выполнения программы.

    Списки в действии
    219
    1 2 3
    Подробнее об операции обхода элементов списка в цикле for и о встро
    енной функции range мы поговорим в главе 13, потому что они имеют отношению к синтаксису инструкций. Говоря вкратце, оператор цик
    ла for выбирает элементы последовательности в порядке слева напра
    во и выполняет одну или более инструкций для каждого из них. По
    следняя строка в табл. 8.1 – это одна из дополнительных операций над списками, которые описываются в главе 13 и расширенное обсужде
    ние которых приводится в главе 17. Как говорилось в главе 4, они представляют собой способ построить список, применяя выражение к каждому элементу последовательности, единственной инструкцией.
    Несмотря на то, что оператор + со списками работает точно так же, как и со строками, очень важно знать, что с обеих сторон оператора долж
    ны находиться последовательности одного и того же типа, в противном случае во время работы программного кода вы получите сообщение об ошибке. Например, нельзя выполнить операцию конкатенации для списка и строки, если предварительно не преобразовать список в стро
    ку (используя, например, обратные апострофы (backquotes), функцию str или %форматирование) или строку в список (с помощью встроен
    ной функции list):
    >>> str([1, 2]) + "34" # То же, что и "[1, 2]" + "34"
    '[1, 2]34'
    >>> [1, 2] + list("34") # То же, что и [1, 2] + ["3", "4"]
    [1, 2, '3', '4']
    Индексы, срезы и матрицы
    Так как списки являются последовательностями, операции доступа к элементам по индексам и извлечения срезов работают точно так же,
    как и в случае со строками. Однако, в результате обращения к элемен
    ту по индексу возвращается объект, который расположен по указанно
    му смещению, а в результате операции извлечения среза возвращается новый список:
    >>> L = ['spam', 'Spam', 'SPAM!']
    >>> L[2] # Отсчет смещений начинается с нуля
    'SPAM!'
    >>> L[ 2] # Отрицательное смещение: отсчитывается справа
    'Spam'
    >>> L[1:] # Операция извлечения среза возвращает разделы списка
    ['Spam', 'SPAM!']
    Здесь следует отметить следующее: поскольку списки (и объекты дру
    гих типов) могут быть вложены в другие списки, иногда бывает необ
    ходимо объединять в цепочку несколько индексов, чтобы получить доступ к элементам на более глубоком уровне вложенности в структу
    ре данных. Например, один из простейших способов представления

    220
    Глава 8. Списки и словари матриц (многомерных массивов) в языке Python заключается в ис
    пользовании вложенных списков. Ниже приводится пример двухмер
    ного массива размером 3
    ×3, построенного на базе списков:
    >>> matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    С помощью первого индекса извлекается целая строка (в действитель
    ности – вложенный список), а с помощью второго извлекается элемент этой строки:
    >>> matrix[1]
    [4, 5, 6]
    >>> matrix[1][1]
    5
    >>> matrix[2][0]
    7
    >>> matrix = [[1, 2, 3],
    ... [4, 5, 6],
    ... [7, 8, 9]]
    >>> matrix[1][1]
    5
    Обратите внимание на то, что, как показано в предыдущем примере,
    список может быть при необходимости растянут на несколько строк,
    ограниченных квадратными скобками (подробнее о синтаксисе будет говориться в следующей части книги). Далее в этой главе вы также увидите матрицы, реализованные на базе словарей. Модуль NumPy,
    упомянутый в главе 5, для высокопроизводительной работы с число
    выми данными предоставляет другие способы организации матриц.
    Изменение списка
    Списки относятся к категории изменяемых объектов, поэтому они поддерживают операции, которые изменяют сам список непосредст+
    венно
    . То есть все операции, представленные в этом разделе, изменяют сам список объектов и не приводят к необходимости создавать новую копию, как это было в случае со строками. В языке Python приходится иметь дело только со ссылками на объекты, что обусловливает сущест
    венные различия между непосредственным изменением объекта и соз
    данием нового объекта – как обсуждалось в главе 6, непосредственное изменение объекта может отражаться более чем на одной ссылке.
    1   ...   24   25   26   27   28   29   30   31   ...   98


    написать администратору сайта