Документация Python неофициальный перевод

datastructures.md

559 строк · 37.4 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.3/tutorial/datastructures.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 5. Структуры данных89В этой главе более подробно рассматриваются некоторые уже изученные темы, а также добавляются новые.1011## 5.1. Подробнее о списках1213Тип данных list имеет ещё несколько методов. Ниже перечислены все методы объектов list:1415#### `list.append(x)`1617Добавляет элемент в конец списка. Эквивалентно `a[len(a):] = [x]`.1819#### `list.extend(L)`2021Расширяет список, добавляя все элементы из указанного списка. Эквивалентно `a[len(a):] = L`.2223#### `list.insert(i, x)`2425Вставляет элемент в заданную позицию. Первый аргумент – это индекс элемента, перед которым нужно вставить, поэтому `a.insert(0, x)` вставляет в начало списка, а `a.insert(len(a), x)` эквивалентно `a.append(x)`.2627#### `list.remove(x)`2829Удаляет первый элемент из списка, значение которого равно *x*. Если такой элемент отсутствует, возникает ошибка.3031#### `list.pop([i])`3233Удаляет элемент в заданной позиции в списке и возвращает его. Если индекс не указан, `a.pop()` удаляет и возвращает последний элемент списка. (Квадратные скобки вокруг *i* в сигнатуре метода указывают, что параметр является необязательным, а не на то, что нужно вводить квадратные скобки в этой позиции. Эта нотация часто встречается в Справочнике по библиотеке Python.)3435#### `list.clear()`3637Удаляет все элементы из списка. Эквивалентно `del a[:]`.3839#### `list.index(x)`4041Возвращает индекс первого элемента в списке, значение которого равно *x*. Если такого элемента нет, возникает ошибка.4243#### `list.count(x)`4445Возвращает количество вхождений *x* в список.4647#### `list.sort()`4849Сортирует элементы списка на месте.5051#### `list.reverse()`5253Переворачивает элементы списка на месте.5455#### `list.copy()`5657Возвращает поверхностную копию списка. Эквивалентно `a[:]`.5859Пример, использующий большинство методов списка:6061```python62>>> a = [66.25, 333, 333, 1, 1234.5]63>>> print(a.count(333), a.count(66.25), a.count('x'))642 1 065>>> a.insert(2, -1)66>>> a.append(333)67>>> a68[66.25, 333, -1, 333, 1, 1234.5, 333]69>>> a.index(333)70171>>> a.remove(333)72>>> a73[66.25, -1, 333, 1, 1234.5, 333]74>>> a.reverse()75>>> a76[333, 1234.5, 1, 333, -1, 66.25]77>>> a.sort()78>>> a79[-1, 1, 66.25, 333, 333, 1234.5]80```8182Как можно заметить, такие методы, как `insert`, `remove` или `sort`, которые изменяют список, не выводят возвращаемое значение – они возвращают `None`. [\[1\]](https://python-all.ru/3.3/tutorial/datastructures.html#id3) Это принцип проектирования для всех изменяемых структур данных в Python.8384### 5.1.1. Использование списков в качестве стеков8586Методы списков позволяют легко использовать список как стек, где последний добавленный элемент извлекается первым (принцип «последним пришёл – первым вышел»). Чтобы добавить элемент на вершину стека, используйте `append()`. Чтобы извлечь элемент с вершины стека, используйте `pop()` без явного указания индекса. Например:8788```python89>>> stack = [3, 4, 5]90>>> stack.append(6)91>>> stack.append(7)92>>> stack93[3, 4, 5, 6, 7]94>>> stack.pop()95796>>> stack97[3, 4, 5, 6]98>>> stack.pop()996100>>> stack.pop()1015102>>> stack103[3, 4]104```105106### 5.1.2. Использование списков в качестве очередей107108Список также можно использовать как очередь, где первый добавленный элемент извлекается первым (первым пришёл – первым ушёл); однако списки неэффективны для этой цели. Хотя добавление и извлечение элементов с конца списка выполняется быстро, вставка или извлечение с начала списка – медленно (поскольку все остальные элементы приходится сдвигать на одну позицию).109110Для реализации очереди используйте [`collections.deque`](https://python-all.ru/3.3/library/collections.html#collections.deque), который разработан для быстрого добавления и извлечения элементов с обоих концов. Например:111112```python113>>> from collections import deque114>>> queue = deque(["Eric", "John", "Michael"])115>>> queue.append("Terry")           # Терри прибывает116>>> queue.append("Graham")          # Грэм прибывает117>>> queue.popleft()                 # Первый прибывший теперь уходит118'Eric'119>>> queue.popleft()                 # Второй прибывший теперь уходит120'John'121>>> queue                           # Оставшаяся очередь в порядке прибытия122deque(['Michael', 'Terry', 'Graham'])123```124125### 5.1.3. Списковые включения126127Списковые включения предоставляют краткий способ создания списков. Обычно они используются для создания новых списков, где каждый элемент является результатом некоторых операций, применённых к каждому элементу другой последовательности или итерируемого объекта, или для создания подпоследовательности из элементов, удовлетворяющих определённому условию.128129Например, предположим, мы хотим создать список квадратов, как в:130131```python132>>> squares = []133>>> for x in range(10):134...     squares.append(x**2)135...136>>> squares137[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]138```139140Тот же результат можно получить с помощью:141142```python143squares = [x**2 for x in range(10)]144```145146Это также эквивалентно `squares = list(map(lambda x: x**2, range(10)))`, но это более лаконично и читаемо.147148Списочное выражение (list comprehension) состоит из скобок, содержащих выражение, за которым следует предложение [`for`](https://python-all.ru/3.3/reference/compound_stmts.html#for), а затем ноль или более предложений [`for`](https://python-all.ru/3.3/reference/compound_stmts.html#for) или [`if`](https://python-all.ru/3.3/reference/compound_stmts.html#if). Результатом будет новый список, полученный в результате вычисления выражения в контексте предложений [`for`](https://python-all.ru/3.3/reference/compound_stmts.html#for) и [`if`](https://python-all.ru/3.3/reference/compound_stmts.html#if), которые следуют за ним. Например, это списочное выражение объединяет элементы двух списков, если они не равны:149150```python151>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]152[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]153```154155и это эквивалентно:156157```python158>>> combs = []159>>> for x in [1,2,3]:160...     for y in [3,1,4]:161...         if x != y:162...             combs.append((x, y))163...164>>> combs165[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]166```167168Обратите внимание, что порядок операторов [`for`](https://python-all.ru/3.3/reference/compound_stmts.html#for) и [`if`](https://python-all.ru/3.3/reference/compound_stmts.html#if) одинаков в обоих этих фрагментах.169170Если выражение является кортежем (например, `(x, y)` в предыдущем примере), его необходимо заключить в скобки.171172```python173>>> vec = [-4, -2, 0, 2, 4]174>>> # создать новый список с удвоенными значениями175>>> [x*2 for x in vec]176[-8, -4, 0, 4, 8]177>>> # отфильтровать список, чтобы исключить отрицательные числа178>>> [x for x in vec if x >= 0]179[0, 2, 4]180>>> # применить функцию ко всем элементам181>>> [abs(x) for x in vec]182[4, 2, 0, 2, 4]183>>> # вызвать метод для каждого элемента184>>> freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']185>>> [weapon.strip() for weapon in freshfruit]186['banana', 'loganberry', 'passion fruit']187>>> # создать список кортежей из двух элементов вида (число, квадрат)188>>> [(x, x**2) for x in range(6)]189[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]190>>> # кортеж должен быть заключён в скобки, иначе возникнет ошибка191>>> [x, x**2 for x in range(6)]192  File "<stdin>", line 1, in ?193    [x, x**2 for x in range(6)]194               ^195SyntaxError: invalid syntax196>>> # развернуть список с помощью спискового включения с двумя 'for'197>>> vec = [[1,2,3], [4,5,6], [7,8,9]]198>>> [num for elem in vec for num in elem]199[1, 2, 3, 4, 5, 6, 7, 8, 9]200```201202Списковые включения могут содержать сложные выражения и вложенные функции:203204```python205>>> from math import pi206>>> [str(round(pi, i)) for i in range(1, 6)]207['3.1', '3.14', '3.142', '3.1416', '3.14159']208```209210### 5.1.4. Вложенные списковые включения211212Начальное выражение в списковом включении может быть любым произвольным выражением, включая другое списковое включение.213214Рассмотрим следующий пример матрицы 3x4, реализованной в виде списка из 3 списков длиной 4:215216```python217>>> matrix = [218...     [1, 2, 3, 4],219...     [5, 6, 7, 8],220...     [9, 10, 11, 12],221... ]222```223224Следующее списковое включение транспонирует строки и столбцы:225226```python227>>> [[row[i] for row in matrix] for i in range(4)]228[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]229```230231Как мы видели в предыдущем разделе, вложенное списочное выражение вычисляется в контексте [`for`](https://python-all.ru/3.3/reference/compound_stmts.html#for), которое следует за ним, поэтому этот пример эквивалентен:232233```python234>>> transposed = []235>>> for i in range(4):236...     transposed.append([row[i] for row in matrix])237...238>>> transposed239[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]240```241242что, в свою очередь, то же самое, что:243244```python245>>> transposed = []246>>> for i in range(4):247...     # следующие 3 строки реализуют вложенное списковое включение248...     transposed_row = []249...     for row in matrix:250...         transposed_row.append(row[i])251...     transposed.append(transposed_row)252...253>>> transposed254[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]255```256257На практике встроенные функции предпочтительнее сложных составных инструкций. Функция [`zip()`](https://python-all.ru/3.3/library/functions.html#zip) отлично подходит для этого случая:258259```python260>>> list(zip(*matrix))261[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]262```263264Смотрите [*Распаковка списков аргументов*](https://python-all.ru/3.3/tutorial/controlflow.html#tut-unpacking-arguments) для подробностей об звёздочке в этой строке.265266## 5.2. Оператор [`del`](https://python-all.ru/3.3/reference/simple_stmts.html#del)267268Существует способ удалить элемент из списка по его индексу, а не по значению: оператор [`del`](https://python-all.ru/3.3/reference/simple_stmts.html#del). Он отличается от метода `pop()`, который возвращает значение. Оператор [`del`](https://python-all.ru/3.3/reference/simple_stmts.html#del) также можно использовать для удаления срезов из списка или очистки всего списка (что мы делали ранее, присваивая пустой список срезу). Например:269270```python271>>> a = [-1, 1, 66.25, 333, 333, 1234.5]272>>> del a[0]273>>> a274[1, 66.25, 333, 333, 1234.5]275>>> del a[2:4]276>>> a277[1, 66.25, 1234.5]278>>> del a[:]279>>> a280[]281```282283[`del`](https://python-all.ru/3.3/reference/simple_stmts.html#del) также можно использовать для удаления целых переменных:284285```python286>>> del a287```288289Ссылка на имя `a` в дальнейшем приведёт к ошибке (по крайней мере, пока ему не присвоено другое значение). Позже мы найдём другое применение для [`del`](https://python-all.ru/3.3/reference/simple_stmts.html#del).290291## 5.3. Кортежи и последовательности292293Мы видели, что списки и строки имеют много общих свойств, таких как операции индексации и извлечения срезов. Это два примера *последовательных* типов данных (см. [*Типы последовательностей – list, tuple, range*](https://python-all.ru/3.3/library/stdtypes.html#typesseq)). Поскольку Python – развивающийся язык, могут быть добавлены другие типы последовательностей. Существует также ещё один стандартный тип последовательности: *кортеж*.294295Кортеж состоит из нескольких значений, разделенных запятыми, например:296297```python298>>> t = 12345, 54321, 'hello!'299>>> t[0]30012345301>>> t302(12345, 54321, 'hello!')303>>> # Кортежи могут быть вложенными:304... u = t, (1, 2, 3, 4, 5)305>>> u306((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))307>>> # Кортежи неизменяемы:308... t[0] = 88888309Traceback (most recent call last):310  File "<stdin>", line 1, in <module>311TypeError: 'tuple' object does not support item assignment312>>> # но они могут содержать изменяемые объекты:313... v = ([1, 2, 3], [3, 2, 1])314>>> v315([1, 2, 3], [3, 2, 1])316```317318Как видите, при выводе кортежи всегда заключаются в круглые скобки, чтобы вложенные кортежи интерпретировались правильно; их можно вводить как с окружающими скобками, так и без них, хотя скобки часто необходимы (если кортеж является частью более крупного выражения). Присваивать значения отдельным элементам кортежа нельзя, однако можно создавать кортежи, содержащие изменяемые объекты, например списки.319320Хотя кортежи могут казаться похожими на списки, они часто используются в разных ситуациях и для разных целей. Кортежи являются [*неизменяемыми*](https://python-all.ru/3.3/glossary.html#term-immutable) и обычно содержат разнородную последовательность элементов, доступ к которым осуществляется через распаковку (см. далее в этом разделе) или индексацию (или даже по атрибуту в случае [`именованных кортежей`](https://python-all.ru/3.3/library/collections.html#collections.namedtuple)). Списки являются [*изменяемыми*](https://python-all.ru/3.3/glossary.html#term-mutable), и их элементы обычно однородны и доступны при переборе списка.321322Особая проблема – создание кортежей, содержащих 0 или 1 элемент: в синтаксисе есть некоторые дополнительные особенности для таких случаев. Пустые кортежи создаются с помощью пустой пары круглых скобок; кортеж с одним элементом создается путем добавления запятой после значения (недостаточно заключить одно значение в скобки). Некрасиво, но эффективно. Например:323324```python325>>> empty = ()326>>> singleton = 'hello',    # <-- обратите внимание на завершающую запятую327>>> len(empty)3280329>>> len(singleton)3301331>>> singleton332('hello',)333```334335Оператор `t = 12345, 54321, 'hello!'` является примером *упаковки кортежа*: значения `12345`, `54321` и `'hello!'` упаковываются вместе в кортеж. Возможна и обратная операция:336337```python338>>> x, y, z = t339```340341Это называется, что вполне уместно, *распаковкой последовательности* и работает для любой последовательности в правой части. Распаковка последовательности требует, чтобы переменных в левой части знака равенства было столько же, сколько элементов в последовательности. Обратите внимание, что множественное присваивание – это на самом деле комбинация упаковки кортежа и распаковки последовательности.342343## 5.4. Множества344345Python также включает тип данных для *множеств*. Множество – это неупорядоченная коллекция без повторяющихся элементов. Основные применения: проверка принадлежности и удаление дубликатов. Объекты-множества также поддерживают математические операции, такие как объединение, пересечение, разность и симметрическая разность.346347Фигурные скобки или функция [`set()`](https://python-all.ru/3.3/library/stdtypes.html#set) могут использоваться для создания множеств. Примечание: для создания пустого множества нужно использовать `set()`, а не `{}`; последнее создаёт пустой словарь – структуру данных, которую мы обсудим в следующем разделе.348349Вот краткая демонстрация:350351```python352>>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}353>>> print(basket)                      # показать, что дубликаты удалены354{'orange', 'banana', 'pear', 'apple'}355>>> 'orange' in basket                 # быстрая проверка принадлежности356True357>>> 'crabgrass' in basket358False359360>>> # Демонстрация операций над множествами с уникальными буквами из двух слов361...362>>> a = set('abracadabra')363>>> b = set('alacazam')364>>> a                                  # уникальные буквы в a365{'a', 'r', 'b', 'c', 'd'}366>>> a - b                              # буквы, которые есть в a, но нет в b367{'r', 'd', 'b'}368>>> a | b                              # Буквы из a или b369{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}370>>> a & b                              # буквы, которые есть и в a, и в b371{'a', 'c'}372>>> a ^ b                              # буквы, которые есть в a или в b, но не в обоих373{'r', 'd', 'b', 'm', 'z', 'l'}374```375376Аналогично [*списковым включениям*](https://python-all.ru/3.3/tutorial/datastructures.html#tut-listcomps), также поддерживаются множественные включения:377378```python379>>> a = {x for x in 'abracadabra' if x not in 'abc'}380>>> a381{'r', 'd'}382```383384## 5.5. Словари385386Ещё одним полезным типом данных, встроенным в Python, является *словарь* (см. [*Типы отображений – dict*](https://python-all.ru/3.3/library/stdtypes.html#typesmapping)). В других языках словари иногда называются «ассоциативными запоминающими устройствами» или «ассоциативными массивами». В отличие от последовательностей, которые индексируются диапазоном чисел, словари индексируются *ключами*, которые могут быть любого неизменяемого типа; строки и числа всегда могут быть ключами. Кортежи могут использоваться как ключи, если они содержат только строки, числа или кортежи; если кортеж содержит любой изменяемый объект прямо или косвенно, он не может быть использован как ключ. Списки нельзя использовать как ключи, поскольку списки можно изменять на месте с помощью присваиваний по индексу, срезу или методов, таких как `append()` и `extend()`.387388Словарь лучше всего представлять как неупорядоченное множество пар *ключ: значение*, при этом ключи должны быть уникальными (в пределах одного словаря). Пара фигурных скобок создает пустой словарь: `{}`. Размещение внутри скобок списка пар ключ:значение, разделенных запятыми, добавляет начальные пары ключ:значение в словарь; так же словари отображаются при выводе.389390Основные операции над словарём – это сохранение значения по некоторому ключу и извлечение значения по заданному ключу. Также можно удалить пару ключ:значение с помощью `del`. Если сохранить значение по уже используемому ключу, старое значение, связанное с этим ключом, будет забыто. Извлечение значения по несуществующему ключу является ошибкой.391392Выполнение `list(d.keys())` над словарём возвращает список всех ключей, используемых в словаре, в произвольном порядке (если требуется отсортированный список, используйте вместо этого `sorted(d.keys())`). [\[2\]](https://python-all.ru/3.3/tutorial/datastructures.html#id4) Чтобы проверить, находится ли отдельный ключ в словаре, используйте ключевое слово [`in`](https://python-all.ru/3.3/reference/expressions.html#in).393394Вот небольшой пример использования словаря:395396```python397>>> tel = {'jack': 4098, 'sape': 4139}398>>> tel['guido'] = 4127399>>> tel400{'sape': 4139, 'guido': 4127, 'jack': 4098}401>>> tel['jack']4024098403>>> del tel['sape']404>>> tel['irv'] = 4127405>>> tel406{'guido': 4127, 'irv': 4127, 'jack': 4098}407>>> list(tel.keys())408['irv', 'guido', 'jack']409>>> sorted(tel.keys())410['guido', 'irv', 'jack']411>>> 'guido' in tel412True413>>> 'jack' not in tel414False415```416417Конструктор [`dict()`](https://python-all.ru/3.3/library/stdtypes.html#dict) создаёт словари непосредственно из последовательностей пар ключ-значение:418419```python420>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])421{'sape': 4139, 'jack': 4098, 'guido': 4127}422```423424Кроме того, словарные включения можно использовать для создания словарей из произвольных выражений ключа и значения:425426```python427>>> {x: x**2 for x in (2, 4, 6)}428{2: 4, 4: 16, 6: 36}429```430431Когда ключи являются простыми строками, иногда проще указать пары с помощью именованных аргументов:432433```python434>>> dict(sape=4139, guido=4127, jack=4098)435{'sape': 4139, 'jack': 4098, 'guido': 4127}436```437438## 5.6. Техники циклов439440При переборе словарей ключ и соответствующее значение можно получить одновременно с помощью метода `items()`.441442```python443>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}444>>> for k, v in knights.items():445...     print(k, v)446...447gallahad the pure448robin the brave449```450451При переборе последовательности индекс позиции и соответствующее значение можно получить одновременно с помощью функции [`enumerate()`](https://python-all.ru/3.3/library/functions.html#enumerate).452453```python454>>> for i, v in enumerate(['tic', 'tac', 'toe']):455...     print(i, v)456...4570 tic4581 tac4592 toe460```461462Для одновременного перебора двух или более последовательностей элементы можно объединить в пары с помощью функции [`zip()`](https://python-all.ru/3.3/library/functions.html#zip).463464```python465>>> questions = ['name', 'quest', 'favorite color']466>>> answers = ['lancelot', 'the holy grail', 'blue']467>>> for q, a in zip(questions, answers):468...     print('What is your {0}?  It is {1}.'.format(q, a))469...470What is your name?  It is lancelot.471What is your quest?  It is the holy grail.472What is your favorite color?  It is blue.473```474475Чтобы перебрать последовательность в обратном порядке, сначала укажите последовательность в прямом порядке, а затем вызовите функцию [`reversed()`](https://python-all.ru/3.3/library/functions.html#reversed).476477```python478>>> for i in reversed(range(1, 10, 2)):479...     print(i)480...48194827483548434851486```487488Чтобы перебрать последовательность в отсортированном порядке, используйте функцию [`sorted()`](https://python-all.ru/3.3/library/functions.html#sorted), которая возвращает новый отсортированный список, не изменяя исходный.489490```python491>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']492>>> for f in sorted(set(basket)):493...     print(f)494...495apple496banana497orange498pear499```500501Чтобы изменить последовательность, по которой выполняется итерация внутри цикла (например, чтобы продублировать определённые элементы), рекомендуется сначала сделать её копию. Циклический перебор последовательности не создаёт копию неявно. Синтаксис среза делает это особенно удобным:502503```python504>>> words = ['cat', 'window', 'defenestrate']505>>> for w in words[:]:  # Выполнить итерацию по копии среза всего списка.506...     if len(w) > 6:507...         words.insert(0, w)508...509>>> words510['defenestrate', 'cat', 'window', 'defenestrate']511```512513## 5.7. Подробнее об условиях514515Условия, используемые в операторах `while` и `if`, могут содержать любые операторы, а не только сравнения.516517Операторы сравнения `in` и `not in` проверяют, встречается ли значение в последовательности (или не встречается). Операторы `is` и `is not` сравнивают, являются ли два объекта действительно одним и тем же объектом; это важно только для изменяемых объектов, таких как списки. Все операторы сравнения имеют одинаковый приоритет, который ниже приоритета всех числовых операторов.518519Сравнения могут быть объединены в цепочку. Например, `a < b == c` проверяет, `a` меньше ли `b` и, более того, `b` равно `c`.520521Сравнения могут объединяться с помощью логических операторов `and` и `or`, а результат сравнения (или любого другого логического выражения) может быть инвертирован с помощью `not`. Эти операторы имеют более низкий приоритет, чем операторы сравнения; среди них `not` имеет самый высокий приоритет, а `or` – самый низкий, так что `A and not B or C` эквивалентно `(A and (not B)) or C`. Как всегда, для выражения желаемой группировки можно использовать круглые скобки.522523Логические операторы `and` и `or` являются так называемыми *short-circuit* операторами: их аргументы вычисляются слева направо, и вычисление прекращается, как только результат становится определённым. Например, если `A` и `C` истинны, а `B` ложно, то `A and B and C` не вычисляет выражение `C`. При использовании в качестве общего значения, а не логического, возвращаемым значением оператора короткого замыкания является последний вычисленный аргумент.524525Результат сравнения или другого логического выражения можно присвоить переменной. Например,526527```python528>>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance'529>>> non_null = string1 or string2 or string3530>>> non_null531'Trondheim'532```533534В Python, в отличие от C, присваивание не может использоваться внутри выражений. Программисты на C могут ворчать по этому поводу, но это позволяет избежать распространённого класса проблем, встречающихся в программах на C: ввод `=` в выражении, когда подразумевался `==`.535536## 5.8. Сравнение последовательностей и других типов537538Объекты последовательностей можно сравнивать с другими объектами того же типа последовательности. Сравнение использует *лексикографический* порядок: сначала сравниваются первые два элемента, и если они различаются, это определяет результат сравнения; если они равны, сравниваются следующие два элемента, и так далее, пока одна из последовательностей не закончится. Если два сравниваемых элемента сами являются последовательностями того же типа, лексикографическое сравнение выполняется рекурсивно. Если все элементы двух последовательностей равны, последовательности считаются равными. Если одна последовательность является начальной подпоследовательностью другой, более короткая последовательность считается меньшей (меньшей). Лексикографический порядок для строк использует номер кодовой точки Unicode для упорядочивания отдельных символов. Некоторые примеры сравнений между последовательностями одного типа:539540```python541(1, 2, 3)              < (1, 2, 4)542[1, 2, 3]              < [1, 2, 4]543'ABC' < 'C' < 'Pascal' < 'Python'544(1, 2, 3, 4)           < (1, 2, 4)545(1, 2)                 < (1, 2, -1)546(1, 2, 3)             == (1.0, 2.0, 3.0)547(1, 2, ('aa', 'ab'))   < (1, 2, ('abc', 'a'), 4)548```549550Обратите внимание, что сравнение объектов разных типов с помощью `<` или `>` допустимо при условии, что объекты имеют соответствующие методы сравнения. Например, смешанные числовые типы сравниваются по их числовому значению, поэтому 0 равно 0.0 и т.д. В противном случае, вместо того чтобы давать произвольный порядок, интерпретатор вызовет исключение [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError).551552Сноски553554| [\[1\]](https://python-all.ru/3.3/tutorial/datastructures.html#id1) | В других языках может возвращаться изменённый объект, что позволяет выполнять цепочки методов, например `d->insert("a")->remove("b")->sort();`. |555| --- | --- |556557| [\[2\]](https://python-all.ru/3.3/tutorial/datastructures.html#id2) | Вызов `d.keys()` вернёт объект *представления словаря*. Он поддерживает такие операции, как проверка принадлежности и итерация, но его содержимое не является независимым от исходного словаря – это всего лишь *представление*. |558| --- | --- |559