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

  • L = [spam, Spam, SPAM!] >>> L[1] = eggs

  • Методы списков Как и строки, объекты списков в языке Python поддерживают специфичные методы:>>> L.append(please)

  • L = [1, 2] >>> L.extend([3,4,5])

  • L = [] >>> L.append(1)

  • L = [Already, got, one] >>> L[1:] = [] >>> L [Already]>>> L[0] = [] >>> L

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

  • Базовые операции над словарями В обычном случае сначала создается словарь, а затем выполняются операции сохранения новых ключей и обращения к элементам по ключу:% python

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

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


    Скачать 4.86 Mb.
    Название3е издание
    АнкорМатематический анализ
    Дата04.02.2022
    Размер4.86 Mb.
    Формат файлаpdf
    Имя файлаpython_01.pdf
    ТипДокументы
    #351981
    страница29 из 98
    1   ...   25   26   27   28   29   30   31   32   ...   98
    Присваивание по индексам и срезам
    При использовании списков существует возможность изменять их со
    держимое, выполняя присваивание значений элементам (по смеще
    нию) или целым разделам (срезам) списка:
    >>> L = ['spam', 'Spam', 'SPAM!']
    >>> L[1] = 'eggs' # Присваивание по индексу элемента
    >>> L
    ['spam', 'eggs', 'SPAM!']

    Списки в действии
    221
    >>> L[0:2] = ['eat', 'more'] # Присваивание срезу: удаление+вставка
    >>> L # Элементы 0 и 1 были заменены
    ['eat', 'more', 'SPAM!']
    Обе операции присваивания – и отдельному элементу, и срезу – произ
    водятся непосредственно в списке – они изменяют сам список, а не соз
    дают новый список объектов. Операция присваивания по индексу в языке Python работает практически так же, как в языке C и во мно
    гих других языках программирования: интерпретатор замещает ста
    рую ссылку на объект в указанном смещении на новую.
    Присваивание срезу
    , последняя операция в предыдущем примере, за
    мещает целый раздел списка за один прием. Поскольку это довольно сложная операция, проще будет представить ее как последовательное выполнение двух действий:
    1. Удаление. Раздел списка, определяемый слева от оператора =, уда
    ляется.
    2. Вставка. Новые элементы, содержащиеся в объекте, расположен
    ном справа от оператора =, вставляются в список, начиная с левого края, где находился прежний удаленный срез.
    В действительности это не совсем то, что происходит на самом деле, но это достаточно точно объясняет, почему число вставляемых элементов не должно соответствовать числу удаляемых элементов. Например,
    представим, что список L имеет значение [1,2,3], тогда в результате операции присваивания L[1:2]=[4,5] будет получен список [1,4,5,3].
    Интерпретатор сначала удалит 2 (срез, состоящий из одного элемента),
    а затем, начиная с позиции удаленного элемента 2, вставит элементы
    4
    и 5. Это также объясняет, почему операция L[1:2]=[] в действитель
    ности является операцией удаления, – интерпретатор удалит срез
    (элемент со смещением 1) и затем вставит пустой список.
    В результате операция присваивания срезу замещает целый раздел списка, или «столбец», за одно действие. Поскольку длина последова
    тельности справа от оператора = не должна обязательно соответство
    вать длине среза, которому выполняется присваивание, эта операция может использоваться для замены (посредством перезаписи), расши
    рения (посредством вставки) или сжатия (посредством удаления) тре
    буемого списка. Это довольно мощная операция, но, честно говоря,
    она достаточно редко используется на практике. Обычно используют
    ся более простые способы замены, вставки и удаления (например, опе
    рация конкатенация и методы списков insert, pop и remove), которые программисты предпочитают использовать на практике.
    Методы списков
    Как и строки, объекты списков в языке Python поддерживают специ
    фичные методы:
    >>> L.append('please') # Вызов метода добавления элемента в конец списка
    >>> L

    222
    Глава 8. Списки и словари
    ['eat', 'more', 'SPAM!', 'please']
    >>> L.sort() # Сортировка элементов списка ('S' < 'e')
    >>> L
    ['SPAM!', 'eat', 'more', 'please']
    Методы были представлены в главе 7. Коротко напомню, что методы –
    это функции (в действительности – атрибуты, ссылающиеся на функ
    ции), которые связаны с определенным типом объектов. Методы обес
    печивают выполнение специфических операций, например, методы списков, представленные здесь, доступны только для списков.
    Наиболее часто используемым методом, пожалуй, является метод ap
    pend
    , который просто добавляет единственный элемент (ссылку на объ
    ект) в конец списка. В отличие от операции конкатенации, метод ap
    pend принимает единственный объект, а не список. По своему дейст
    вию выражение L.append(X) похоже на выражение L+[X], но в первом случае изменяется сам список, а во втором – создается новый список.
    1
    Другой часто используемый метод – метод sort – выполняет переупо
    рядочивание элементов в самом списке. По умолчанию он использует стандартные операторы сравнения языка Python (в данном случае вы
    полняется сравнение строк) и выполняет сортировку в порядке возрас
    тания значений. Однако существует возможность передать методу sort свою собственную функцию сравнения.
    В Python версии 2.5 и более ранних сравнение выполняется пораз
    ному для объектов разных типов (например, списков и строк) –
    язык определяет способ упорядочения различных типов, который является детерминистским и не всегда может выглядеть правиль
    ным. Этот способ упорядочения основан на именах типов, вовле
    ченных в операцию сравнения, например, любые целые числа все
    гда меньше любых строк, потому что строка "int" меньше, чем строка "str". При выполнении операции сравнения никогда не вы
    полняется преобразование типов объектов, за исключением срав
    нения объектов числовых типов.
    В Python 3.0 такой порядок, возможно, будет изменен: планиру
    ется, что в случае попытки сравнения объектов различных типов вместо прежнего способа упорядочения будет возбуждаться ис
    ключение. Так как метод сортировки использует операцию срав
    нения, это означает, что инструкция [1, 2, 'spam'].sort() будет успешно выполнена в Python 2.5, но будет возбуждать исключе
    ние в Python 3.0. За дополнительной информацией обращайтесь к примечаниям к выпуску Python 3.0.
    1
    В отличие от операции конкатенации (+), метод append не создает новый объ
    ект, поэтому обычно он выполняется быстрее. Существует возможность имитировать работу метода append с помощью операции присваивания сре
    зу: выражение L[len(L):]=[X] соответствует вызову L.append(X), а выражение
    L[:0]=[X]
    соответствует операции добавления в начало списка. В обоих слу
    чаях удаляется пустой сегмент списка и вставляется элемент X, при этом из
    меняется сам список L, так же быстро, как при использовании метода append.

    Списки в действии
    223
    Важно заметить, что методы append и sort изменяют сам объект списка и не возвращают список в виде результата (точнее говоря, оба метода возвращают значение None). Если вы написали инструкцию вроде
    L=L.append(X)
    , вы не получите измененное значение L (в действительно
    сти вы совсем потеряете ссылку на список) – использование таких ат
    рибутов, как append и sort приводит к изменению самого объекта, по
    этому нет никаких причин выполнять повторное присваивание.
    Как и строки, списки обладают рядом других методов, выполняющих специализированные операции. Например, метод reverse изменяет по
    рядок следования элементов в списке на обратный, а методы extend и pop вставляют несколько элементов в конец списка и удаляют эле
    менты из конца списка, соответственно:
    >>> L = [1, 2]
    >>> L.extend([3,4,5]) # Добавление нескольких элементов в конец списка
    >>> L
    [1, 2, 3, 4, 5]
    >>> L.pop() # Удаляет и возвращает последний элемент списка
    5
    >>> L
    [1, 2, 3, 4]
    >>> L.reverse() # Изменяет порядок следования элементов на обратный
    >>> L
    [4, 3, 2, 1]
    В некоторых типах программ метод pop, показанный здесь, часто ис
    пользуется в паре с методом append для реализации структур данных ти
    па стек – «последний пришел, первый ушел» (LastInFirstOut, LIFO).
    Конец списка служит вершиной стека:
    >>> L = []
    >>> L.append(1) # Втолкнуть на стек
    >>> L.append(2)
    >>> L
    [1, 2]
    >>> L.pop() # Вытолкнуть со стека
    2
    >>> L
    [1]
    Хотя это здесь и не показано, тем не менее, метод pop может принимать необязательное смещение элемента, который удаляется из списка и воз
    вращается (по умолчанию это последний элемент). Другие методы спи
    сков позволяют удалять элементы с определенными значениями (re
    move
    ), вставлять элементы в определенную позицию (insert), отыски
    вать смещение элемента по заданному значению (index) и т. д. Чтобы поближе познакомиться с этими методами, обратитесь к имеющимся источникам документации или поэкспериментируйте с этими метода
    ми в интерактивной оболочке интерпретатора.

    224
    Глава 8. Списки и словари
    Прочие часто используемые операции над списками
    Так как списки относятся к категории изменяемых объектов, вы мо
    жете использовать инструкцию del для удаления элемента или среза непосредственно из списка:
    >>> L
    ['SPAM!', 'eat', 'more', 'please']
    >>> del L[0] # Удаление одного элемента списка
    >>> L
    ['eat', 'more', 'please']
    >>> del L[1:] # Удаление целого сегмента списка
    >>> L # То же, что и L[1:] = []
    ['eat']
    Так как операция присваивания срезу выполняется как удаление и вставка, можно удалять срезы списка, присваивая им пустой список
    (L[i:j]=[]) – интерпретатор сначала удалит срез, определяемый слева от оператора =, а затем вставит пустой список. С другой стороны, при
    сваивание пустого списка по индексу элемента приведет к сохранению ссылки на пустой список в этом элементе, а не к его удалению:
    >>> L = ['Already', 'got', 'one']
    >>> L[1:] = []
    >>> L
    ['Already']
    >>> L[0] = []
    >>> L
    [[]]
    Все только что рассмотренные операции используются достаточно час
    то, однако существуют и другие дополнительные методы и операции для списков, которые не были показаны здесь (включая методы встав
    ки и поиска). Чтобы получить полный список существующих допол
    нительных операций, всегда следует обращаться к руководствам по языку Python, к функциям dir и help (с которыми мы впервые позна
    комились в главе 4) или к книге «Python Pocket Reference» (O’Reilly)
    и другим справочным руководствам, упоминавшимся в предисловии.
    Кроме того, я хотел бы напомнить, что все операции непосредственно
    го изменения объектов, обсуждавшиеся здесь, применимы только к из
    меняемым объектам: они не будут работать со строками (или с корте
    жами, которые рассматриваются в следующей главе) независимо от прикладываемых вами усилий. Изменяемость или неизменяемость –
    это исходное свойство, присущее каждому типу объектов.
    Словари
    После списков словари являются, пожалуй, самым гибким из встроен
    ных типов данных в языке Python. Если считать списки упорядочен
    ными коллекциями объектов, то в отличие от них элементы в слова

    Словари
    225
    рях сохраняются и извлекаются с помощью ключа, а не с помощью смещения, определяющего их позицию.
    Будучи встроенным типом данных, словари могут заменить множест
    во алгоритмов поиска и структур данных, которые приходится реали
    зовывать вручную в низкоуровневых языках программирования, –
    доступ к элементам словаря по их индексам представляет собой быст
    рую операцию поиска. Кроме того, иногда словари могут играть роль записей и таблиц символов, используемых в других языках, и способ
    ны служить для представления разреженных (по большей части пус
    тых) структур данных. Ниже приводятся основные характеристики словарей в языке Python:
    Доступ к элементам по ключу, а не по индексу
    Иногда словари называют ассоциативными массивами, или хеша+
    ми
    . Они определяют взаимосвязь между значениями и ключами,
    поэтому для извлечения элементов словаря можно использовать ключи, под которыми эти элементы были сохранены в словаре. Для получения элементов словаря используется та же самая операция доступа по индексу, как и в списке, только индекс приобретает фор
    му ключа, а не смещения относительно начала.
    Неупорядоченные коллекции произвольных объектов
    В отличие от списков, элементы словарей хранятся в неопределен
    ном порядке. В действительности, интерпретатор вносит элемент случайности в порядок следования элементов для обеспечения бо
    лее быстрого поиска. Ключи описывают символическое (не физиче
    ское) местоположение элементов в словаре.
    Переменная длина, гетерогенность и произвольное число уровней
    вложенности
    Подобно спискам словари могут увеличиваться и уменьшаться не
    посредственно (то есть при этом не создаются новые копии). Они могут содержать объекты любых типов и поддерживают возмож
    ность создания произвольного числа уровней вложенности (они мо
    гут содержать списки, другие словари и т. д.).
    Относятся к категории изменяемых отображений
    Словари могут изменяться непосредственно с использованием опе
    рации индексирования (они являются изменяемыми), но они не поддерживают операции над последовательностями, которые под
    держиваются строками и списками. Словари представляют собой неупорядоченные коллекции, поэтому операции, которые основа
    ны на использовании фиксированного порядка следования элемен
    тов (например, конкатенация, извлечение среза), не имеют смысла для словарей. Словари – это единственный встроенный представи
    тель объектовотображений (объекты, которые отображают ключи на значения).

    226
    Глава 8. Списки и словари
    Таблицы ссылок на объекты (хеш+таблицы)
    Если списки – это массивы ссылок на объекты, которые поддержива
    ют возможность доступа к элементам по их позициям, то словари –
    это неупорядоченные таблицы ссылок на объекты, которые поддер
    живают доступ к элементам по ключу. Внутри словари реализованы как хештаблицы (структуры данных, которые обеспечивают очень высокую скорость поиска), изначально небольшого размера и увели
    чивающиеся по мере необходимости. Более того, интерпретатор Py
    thon использует оптимизированные алгоритмы хеширования для обеспечения максимально высокой скорости поиска ключей. Подоб
    но спискам словари хранят ссылки на объекты (а не их копии).
    В табл. 8.2 приводятся некоторые наиболее часто используемые опера
    ции над словарями (опять же, чтобы получить полный перечень опера
    ций, обращайтесь к руководству или воспользуйтесь функцией dir(dict)
    или help(dict), где dict – это имя типа). При определении в виде литералов словари записываются как последовательность пар key:value
    , разделенных запятыми, заключенных в фигурные скобки.
    1
    Пустой словарь в литеральном представлении – это пустая пара ско
    бок. Словари могут вкладываться в литеральном представлении в виде значений внутри других словарей, списков или кортежей.
    Таблица 8.2. Литералы словарей и операции
    1
    Как и в случае со списками, вам нечасто придется встречать словари, сконст
    руированные с использованием литералов. Однако списки и словари увели
    чиваются в размерах поразному. Как будет показано в следующем разделе,
    словари обычно дополняются с помощью операции присваивания по новым ключам во время выполнения программы – такой подход совершенно не го
    дится для списков (списки обычно расширяются с помощью метода append).
    Операция_Интерпретация'>Операция
    Интерпретация
    D1 = {}
    Пустой словарь
    D2 = {'spam': 2, 'eggs': 3}
    Словарь из двух элементов
    D3 = {'food': {'ham': 1, 'egg': 2}}
    Вложение
    D2['eggs']
    D3['food']['ham']
    Доступ к элементу по ключу
    D2.has_key('eggs')
    'eggs' in D2
    D2.keys()
    D2.values()
    D2.copy()
    D2.get(key, default)
    D2.update(D1)
    D2.pop(key)
    Методы: проверка на вхождение, спи
    сок ключей, список значений, копиро
    вание, получение значения по умолча
    нию, слияние, удаление и т. д.
    len(D1)
    Длина (количество элементов)

    Словари в действии
    227
    Словари в действии
    Согласно табл. 8.2 доступ к элементам словарей осуществляется по ключу, а для доступа к элементам вложенных словарей осуществляет
    ся путем объединения серии индексов (ключей в квадратных скобках)
    в цепочку. Когда интерпретатор создает словарь, он сохраняет элемен
    ты в произвольном порядке – чтобы получить значение обратно, необ
    ходимо указать ключ, с которым это значение было ассоциировано.
    Давайте вернемся в интерактивный сеанс работы с интерпретатором и исследуем некоторые операции над словарями из табл. 8.2.
    Базовые операции над словарями
    В обычном случае сначала создается словарь, а затем выполняются опе
    рации сохранения новых ключей и обращения к элементам по ключу:
    % python
    >>> d2 = {'spam': 2, 'ham': 1, 'eggs': 3} # Создание словаря
    >>> d2['spam'] # Извлечение значения по ключу
    2
    >>> d2 # Случайный порядок следования
    {'eggs': 3, 'ham': 1, 'spam': 2}
    Здесь переменной d2 присваивается словарь, в котором ключу 'spam'
    соответствует целочисленное значение 2, и т. д. Для доступа к элемен
    там словаря используется тот же самый синтаксис с квадратными скобками, что и при извлечении элементов списков, но в данном слу
    чае доступ осуществляется по ключу, а не по позиции элемента.
    Обратите внимание на последнюю инструкцию в этом примере: поря
    док следования ключей в словари практически всегда отличается от первоначального. Дело в том, что для обеспечения максимально высо
    кой скорости поиска по ключу (для хеширования) необходимо случай
    ное расположение ключей в памяти. Именно поэтому операции, кото
    рые предполагают наличие установленного порядка следования эле
    ментов слева направо (например, извлечение среза, конкатенация),
    неприменимы к словарям – они позволяют извлекать значения только по ключам, а не по индексам.
    Встроенная функция len может работать и со словарями – она возвра
    щает число элементов в словаре или, что то же самое, длину списка ключей. Метод словаря has_key и оператор проверки вхождения in
    D2[key] = 42
    del D2[key]
    Добавление/изменение ключей, удале
    ние ключей
    D4 = dict.fromvalues(['a', 'b'])
    D5 = dict(zip(keyslist, valslist))
    D6 = dict(name='Bob', age=42)
    Альтернативные способы создания сло
    варей
    Операция
    Интерпретация

    228
    Глава 8. Списки и словари позволяют проверить наличие ключа, а метод keys возвращает все ключи, имеющиеся в словаре, в виде списка. Последний удобно ис
    пользовать для последовательной обработки словарей, но при этом вы не должны делать какиелибо предположения о порядке следования ключей в списке. Поскольку результатом вызова метода keys является список, он всегда может быть отсортирован:
    >>>
    1   ...   25   26   27   28   29   30   31   32   ...   98


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