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

datastructures.md

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

1> **Источник:** https://python-all.ru/3.10/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(iterable)`2021Расширяет список, добавляя все элементы из итерируемого объекта. Эквивалентно `a[len(a):] = iterable`.2223#### `list.insert(i, x)`2425Вставляет элемент на указанную позицию. Первый аргумент – это индекс элемента, перед которым нужно вставить, поэтому `a.insert(0, x)` вставляет в начало списка, а `a.insert(len(a), x)` эквивалентно `a.append(x)`.2627#### `list.remove(x)`2829Удаляет из списка первый элемент, значение которого равно *x*. Если такого элемента нет, возникает исключение [`ValueError`](https://python-all.ru/3.10/library/exceptions.html#ValueError).3031#### `list.pop([i])`3233Удаляет элемент по указанной позиции в списке и возвращает его. Если индекс не указан, `a.pop()` удаляет и возвращает последний элемент списка. (Квадратные скобки вокруг *i* в сигнатуре метода указывают, что параметр является необязательным, а не то, что нужно вводить квадратные скобки в этой позиции. Эта нотация часто встречается в Справочнике по библиотеке Python.)3435#### `list.clear()`3637Удаляет все элементы из списка. Эквивалентно `del a[:]`.3839#### `list.index(x[, start[, end]])`4041Возвращает индекс в списке (начиная с нуля) первого элемента, значение которого равно *x*. Если такого элемента нет, возникает исключение [`ValueError`](https://python-all.ru/3.10/library/exceptions.html#ValueError).4243Необязательные аргументы *start* и *end* интерпретируются как в нотации срезов и используются для ограничения поиска определённой подпоследовательностью списка. Возвращаемый индекс вычисляется относительно начала полной последовательности, а не аргумента *start*.4445#### `list.count(x)`4647Возвращает количество вхождений *x* в список.4849#### `list.sort(*, key=None, reverse=False)`5051Сортирует элементы списка на месте (аргументы можно использовать для настройки сортировки; пояснения см. в [`sorted()`](https://python-all.ru/3.10/library/functions.html#sorted)).5253#### `list.reverse()`5455Переворачивает элементы списка на месте.5657#### `list.copy()`5859Возвращает поверхностную копию списка. Эквивалентно `a[:]`.6061Пример, использующий большинство методов списка:6263```python64>>> fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']65>>> fruits.count('apple')66267>>> fruits.count('tangerine')68069>>> fruits.index('banana')70371>>> fruits.index('banana', 4)  # Найти следующий банан, начиная с позиции 472673>>> fruits.reverse()74>>> fruits75['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange']76>>> fruits.append('grape')77>>> fruits78['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange', 'grape']79>>> fruits.sort()80>>> fruits81['apple', 'apple', 'banana', 'banana', 'grape', 'kiwi', 'orange', 'pear']82>>> fruits.pop()83'pear'84```8586Вы могли заметить, что методы `insert`, `remove` или `sort`, которые только изменяют список, не возвращают печатаемого значения – они возвращают `None` по умолчанию. [1](https://python-all.ru/3.10/tutorial/datastructures.html#id2) Это принцип проектирования для всех изменяемых структур данных в Python.8788Ещё можно заметить, что не все данные поддаются сортировке или сравнению. Например, `[None, 'hello', 10]` не отсортируется, так как целые числа нельзя сравнивать со строками, а *None* – с другими типами. Также для некоторых типов не определено отношение порядка. Например, `3+4j < 5+7j` – это некорректное сравнение.8990### 5.1.1. Использование списков в качестве стеков9192Методы списка позволяют легко использовать список как стек, где последний добавленный элемент извлекается первым (последним пришёл – первым ушёл). Чтобы добавить элемент на вершину стека, используйте `append()`. Чтобы извлечь элемент с вершины стека, используйте `pop()` без явного индекса. Например:9394```python95>>> stack = [3, 4, 5]96>>> stack.append(6)97>>> stack.append(7)98>>> stack99[3, 4, 5, 6, 7]100>>> stack.pop()1017102>>> stack103[3, 4, 5, 6]104>>> stack.pop()1056106>>> stack.pop()1075108>>> stack109[3, 4]110```111112### 5.1.2. Использование списков в качестве очередей113114Список также можно использовать как очередь, где первый добавленный элемент извлекается первым (первым пришёл – первым ушёл); однако списки неэффективны для этой цели. Хотя добавление и извлечение элементов с конца списка выполняется быстро, вставка или извлечение с начала списка – медленно (поскольку все остальные элементы приходится сдвигать на одну позицию).115116Для реализации очереди используйте [`collections.deque`](https://python-all.ru/3.10/library/collections.html#collections.deque), который разработан для быстрого добавления и извлечения элементов с обоих концов. Например:117118```python119>>> from collections import deque120>>> queue = deque(["Eric", "John", "Michael"])121>>> queue.append("Terry")           # Терри прибывает122>>> queue.append("Graham")          # Грэм прибывает123>>> queue.popleft()                 # Первый прибывший теперь уходит124'Eric'125>>> queue.popleft()                 # Второй прибывший теперь уходит126'John'127>>> queue                           # Оставшаяся очередь в порядке прибытия128deque(['Michael', 'Terry', 'Graham'])129```130131### 5.1.3. Списковые включения132133Списковые включения предоставляют краткий способ создания списков. Обычно они используются для создания новых списков, где каждый элемент является результатом некоторых операций, применённых к каждому элементу другой последовательности или итерируемого объекта, или для создания подпоследовательности из элементов, удовлетворяющих определённому условию.134135Например, предположим, мы хотим создать список квадратов, как в:136137```python138>>> squares = []139>>> for x in range(10):140...     squares.append(x**2)141...142>>> squares143[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]144```145146Обратите внимание, что этот способ создаёт (или перезаписывает) переменную с именем `x`, которая продолжает существовать после завершения цикла. Мы можем вычислить список квадратов без побочных эффектов, используя:147148```python149squares = list(map(lambda x: x**2, range(10)))150```151152или, что то же самое:153154```python155squares = [x**2 for x in range(10)]156```157158что более кратко и читаемо.159160Списковое включение состоит из квадратных скобок, содержащих выражение, за которым следует предложение `for`, а затем ноль или более предложений `for` или `if`. Результатом будет новый список, полученный вычислением выражения в контексте следующих за ним предложений `for` и `if`. Например, это списковое включение объединяет элементы двух списков, если они не равны:161162```python163>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]164[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]165```166167и это эквивалентно:168169```python170>>> combs = []171>>> for x in [1,2,3]:172...     for y in [3,1,4]:173...         if x != y:174...             combs.append((x, y))175...176>>> combs177[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]178```179180Обратите внимание, что порядок операторов [`for`](https://python-all.ru/3.10/reference/compound_stmts.html#for) и [`if`](https://python-all.ru/3.10/reference/compound_stmts.html#if) одинаков в обоих фрагментах.181182Если выражение является кортежем (например, `(x, y)` в предыдущем примере), оно должно быть взято в скобки.183184```python185>>> vec = [-4, -2, 0, 2, 4]186>>> # создать новый список с удвоенными значениями187>>> [x*2 for x in vec]188[-8, -4, 0, 4, 8]189>>> # отфильтровать список, чтобы исключить отрицательные числа190>>> [x for x in vec if x >= 0]191[0, 2, 4]192>>> # применить функцию ко всем элементам193>>> [abs(x) for x in vec]194[4, 2, 0, 2, 4]195>>> # вызвать метод для каждого элемента196>>> freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']197>>> [weapon.strip() for weapon in freshfruit]198['banana', 'loganberry', 'passion fruit']199>>> # создать список кортежей из двух элементов вида (число, квадрат)200>>> [(x, x**2) for x in range(6)]201[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]202>>> # кортеж должен быть заключён в скобки, иначе возникнет ошибка203>>> [x, x**2 for x in range(6)]204  File "<stdin>", line 1205    [x, x**2 for x in range(6)]206     ^^^^^^^207SyntaxError: did you forget parentheses around the comprehension target?208>>> # развернуть список с помощью спискового включения с двумя 'for'209>>> vec = [[1,2,3], [4,5,6], [7,8,9]]210>>> [num for elem in vec for num in elem]211[1, 2, 3, 4, 5, 6, 7, 8, 9]212```213214Списковые включения могут содержать сложные выражения и вложенные функции:215216```python217>>> from math import pi218>>> [str(round(pi, i)) for i in range(1, 6)]219['3.1', '3.14', '3.142', '3.1416', '3.14159']220```221222### 5.1.4. Вложенные списковые включения223224Начальное выражение в списковом включении может быть любым произвольным выражением, включая другое списковое включение.225226Рассмотрим следующий пример матрицы 3x4, реализованной в виде списка из 3 списков длиной 4:227228```python229>>> matrix = [230...     [1, 2, 3, 4],231...     [5, 6, 7, 8],232...     [9, 10, 11, 12],233... ]234```235236Следующее списковое включение транспонирует строки и столбцы:237238```python239>>> [[row[i] for row in matrix] for i in range(4)]240[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]241```242243Как мы видели в предыдущем разделе, вложенное списковое включение вычисляется в контексте [`for`](https://python-all.ru/3.10/reference/compound_stmts.html#for), которое следует за ним, поэтому этот пример эквивалентен:244245```python246>>> transposed = []247>>> for i in range(4):248...     transposed.append([row[i] for row in matrix])249...250>>> transposed251[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]252```253254что, в свою очередь, то же самое, что:255256```python257>>> transposed = []258>>> for i in range(4):259...     # следующие 3 строки реализуют вложенное списковое включение260...     transposed_row = []261...     for row in matrix:262...         transposed_row.append(row[i])263...     transposed.append(transposed_row)264...265>>> transposed266[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]267```268269На практике следует предпочитать встроенные функции сложным управляющим конструкциям. Функция [`zip()`](https://python-all.ru/3.10/library/functions.html#zip) отлично подойдёт для этого случая:270271```python272>>> list(zip(*matrix))273[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]274```275276Смотрите [Распаковка списков аргументов](https://python-all.ru/3.10/tutorial/controlflow.html#tut-unpacking-arguments) для подробностей об звёздочке в этой строке.277278## 5.2. Инструкция `del`279280Существует способ удалить элемент из списка по его индексу, а не по значению: оператор [`del`](https://python-all.ru/3.10/reference/simple_stmts.html#del). Он отличается от метода `pop()`, который возвращает значение. Оператор `del` также можно использовать для удаления срезов из списка или очистки всего списка (что мы делали ранее, присваивая срезу пустой список). Например:281282```python283>>> a = [-1, 1, 66.25, 333, 333, 1234.5]284>>> del a[0]285>>> a286[1, 66.25, 333, 333, 1234.5]287>>> del a[2:4]288>>> a289[1, 66.25, 1234.5]290>>> del a[:]291>>> a292[]293```294295[`del`](https://python-all.ru/3.10/reference/simple_stmts.html#del) также можно использовать для удаления целых переменных:296297```python298>>> del a299```300301После этого обращение к имени `a` вызовет ошибку (по крайней мере, пока ему не будет присвоено другое значение). Мы найдём другие применения [`del`](https://python-all.ru/3.10/reference/simple_stmts.html#del) позднее.302303## 5.3. Кортежи и последовательности304305Мы видели, что списки и строки имеют много общих свойств, таких как операции индексации и извлечения срезов. Это два примера *последовательных* типов данных (см. [Типы последовательностей – list, tuple, range](https://python-all.ru/3.10/library/stdtypes.html#typesseq)). Поскольку Python – развивающийся язык, могут быть добавлены другие типы последовательностей. Существует также ещё один стандартный тип последовательности: *кортеж*.306307Кортеж состоит из нескольких значений, разделенных запятыми, например:308309```python310>>> t = 12345, 54321, 'hello!'311>>> t[0]31212345313>>> t314(12345, 54321, 'hello!')315>>> # Кортежи могут быть вложенными:316... u = t, (1, 2, 3, 4, 5)317>>> u318((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))319>>> # Кортежи неизменяемы:320... t[0] = 88888321Traceback (most recent call last):322  File "<stdin>", line 1, in <module>323TypeError: 'tuple' object does not support item assignment324>>> # но они могут содержать изменяемые объекты:325... v = ([1, 2, 3], [3, 2, 1])326>>> v327([1, 2, 3], [3, 2, 1])328```329330Как видите, при выводе кортежи всегда заключаются в круглые скобки, чтобы вложенные кортежи интерпретировались правильно; их можно вводить как с окружающими скобками, так и без них, хотя скобки часто необходимы (если кортеж является частью более крупного выражения). Присваивать значения отдельным элементам кортежа нельзя, однако можно создавать кортежи, содержащие изменяемые объекты, например списки.331332Хотя кортежи могут казаться похожими на списки, они часто используются в разных ситуациях и для разных целей. Кортежи являются [неизменяемыми](https://python-all.ru/3.10/glossary.html#term-immutable) и обычно содержат гетерогенную последовательность элементов, доступ к которым осуществляется через распаковку (см. далее в этом разделе) или индексацию (или даже по атрибуту в случае [`namedtuples`](https://python-all.ru/3.10/library/collections.html#collections.namedtuple)). Списки являются [изменяемыми](https://python-all.ru/3.10/glossary.html#term-mutable), и их элементы обычно однородны и доступны при переборе списка.333334Особая проблема – создание кортежей, содержащих 0 или 1 элемент: в синтаксисе есть некоторые дополнительные особенности для таких случаев. Пустые кортежи создаются с помощью пустой пары круглых скобок; кортеж с одним элементом создается путем добавления запятой после значения (недостаточно заключить одно значение в скобки). Некрасиво, но эффективно. Например:335336```python337>>> empty = ()338>>> singleton = 'hello',    # <-- обратите внимание на завершающую запятую339>>> len(empty)3400341>>> len(singleton)3421343>>> singleton344('hello',)345```346347Оператор `t = 12345, 54321, 'hello!'` является примером *упаковки кортежа*: значения `12345`, `54321` и `'hello!'` упаковываются вместе в кортеж. Возможна и обратная операция:348349```python350>>> x, y, z = t351```352353Это называется, что вполне уместно, *распаковкой последовательности* и работает для любой последовательности в правой части. Распаковка последовательности требует, чтобы переменных в левой части знака равенства было столько же, сколько элементов в последовательности. Обратите внимание, что множественное присваивание – это на самом деле комбинация упаковки кортежа и распаковки последовательности.354355## 5.4. Множества356357Python также включает тип данных для *множеств*. Множество – это неупорядоченная коллекция без повторяющихся элементов. Основные применения: проверка принадлежности и удаление дубликатов. Объекты-множества также поддерживают математические операции, такие как объединение, пересечение, разность и симметрическая разность.358359Фигурные скобки или функция [`set()`](https://python-all.ru/3.10/library/stdtypes.html#set) могут использоваться для создания множеств. Примечание: для создания пустого множества нужно использовать `set()`, а не `{}`; последнее создает пустой словарь – структуру данных, которую мы обсудим в следующем разделе.360361Вот краткая демонстрация:362363```python364>>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}365>>> print(basket)                      # показать, что дубликаты удалены366{'orange', 'banana', 'pear', 'apple'}367>>> 'orange' in basket                 # быстрая проверка принадлежности368True369>>> 'crabgrass' in basket370False371372>>> # Демонстрация операций над множествами с уникальными буквами из двух слов373...374>>> a = set('abracadabra')375>>> b = set('alacazam')376>>> a                                  # уникальные буквы в a377{'a', 'r', 'b', 'c', 'd'}378>>> a - b                              # буквы, которые есть в a, но нет в b379{'r', 'd', 'b'}380>>> a | b                              # буквы, которые есть в a, в b или в обоих381{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}382>>> a & b                              # буквы, которые есть и в a, и в b383{'a', 'c'}384>>> a ^ b                              # буквы, которые есть в a или в b, но не в обоих385{'r', 'd', 'b', 'm', 'z', 'l'}386```387388Аналогично [списковым включениям](https://python-all.ru/3.10/tutorial/datastructures.html#tut-listcomps), также поддерживаются множественные включения:389390```python391>>> a = {x for x in 'abracadabra' if x not in 'abc'}392>>> a393{'r', 'd'}394```395396## 5.5. Словари397398Еще один полезный тип данных, встроенный в Python, – это *словарь* (см. [Типы отображений – dict](https://python-all.ru/3.10/library/stdtypes.html#typesmapping)). Словари в других языках иногда называют «ассоциативными массивами» или «ассоциативной памятью». В отличие от последовательностей, которые индексируются диапазоном чисел, словари индексируются *ключами*, которые могут быть любого неизменяемого типа; строки и числа всегда могут быть ключами. Кортежи можно использовать в качестве ключей, если они содержат только строки, числа или кортежи; если кортеж содержит любой изменяемый объект прямо или косвенно, его нельзя использовать в качестве ключа. Списки нельзя использовать в качестве ключей, поскольку их можно изменять на месте с помощью присваивания по индексу, присваивания среза или методов типа `append()` и `extend()`.399400Лучше всего думать о словаре как о наборе пар *ключ: значение*, причем ключи должны быть уникальными (в пределах одного словаря). Пара фигурных скобок создает пустой словарь: `{}`. Размещение разделенного запятыми списка пар ключ:значение внутри скобок добавляет начальные пары ключ:значение в словарь; именно так словари выводятся на экран.401402Основные операции со словарём – сохранение значения по ключу и извлечение значения по ключу. Также можно удалить пару ключ:значение с помощью `del`. Если сохранить значение по уже существующему ключу, старое значение, связанное с этим ключом, будет забыто. Попытка извлечь значение по несуществующему ключу приводит к ошибке.403404Выполнение `list(d)` для словаря возвращает список всех ключей, используемых в словаре, в порядке вставки (если нужен отсортированный список, используйте `sorted(d)`). Чтобы проверить, есть ли конкретный ключ в словаре, используйте ключевое слово [`in`](https://python-all.ru/3.10/reference/expressions.html#in).405406Вот небольшой пример использования словаря:407408```python409>>> tel = {'jack': 4098, 'sape': 4139}410>>> tel['guido'] = 4127411>>> tel412{'jack': 4098, 'sape': 4139, 'guido': 4127}413>>> tel['jack']4144098415>>> del tel['sape']416>>> tel['irv'] = 4127417>>> tel418{'jack': 4098, 'guido': 4127, 'irv': 4127}419>>> list(tel)420['jack', 'guido', 'irv']421>>> sorted(tel)422['guido', 'irv', 'jack']423>>> 'guido' in tel424True425>>> 'jack' not in tel426False427```428429Конструктор [`dict()`](https://python-all.ru/3.10/library/stdtypes.html#dict) создает словари непосредственно из последовательностей пар ключ-значение:430431```python432>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])433{'sape': 4139, 'guido': 4127, 'jack': 4098}434```435436Кроме того, словарные включения можно использовать для создания словарей из произвольных выражений ключа и значения:437438```python439>>> {x: x**2 for x in (2, 4, 6)}440{2: 4, 4: 16, 6: 36}441```442443Когда ключи являются простыми строками, иногда проще указать пары с помощью именованных аргументов:444445```python446>>> dict(sape=4139, guido=4127, jack=4098)447{'sape': 4139, 'guido': 4127, 'jack': 4098}448```449450## 5.6. Техники циклов451452При переборе словарей ключ и соответствующее значение можно получить одновременно с помощью метода `items()`.453454```python455>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}456>>> for k, v in knights.items():457...     print(k, v)458...459gallahad the pure460robin the brave461```462463При переборе последовательности индекс позиции и соответствующее значение можно получить одновременно с помощью функции [`enumerate()`](https://python-all.ru/3.10/library/functions.html#enumerate).464465```python466>>> for i, v in enumerate(['tic', 'tac', 'toe']):467...     print(i, v)468...4690 tic4701 tac4712 toe472```473474Чтобы перебрать две или более последовательности одновременно, элементы можно объединить в пары с помощью функции [`zip()`](https://python-all.ru/3.10/library/functions.html#zip).475476```python477>>> questions = ['name', 'quest', 'favorite color']478>>> answers = ['lancelot', 'the holy grail', 'blue']479>>> for q, a in zip(questions, answers):480...     print('What is your {0}?  It is {1}.'.format(q, a))481...482What is your name?  It is lancelot.483What is your quest?  It is the holy grail.484What is your favorite color?  It is blue.485```486487Чтобы перебрать последовательность в обратном порядке, сначала укажите последовательность в прямом направлении, а затем вызовите функцию [`reversed()`](https://python-all.ru/3.10/library/functions.html#reversed).488489```python490>>> for i in reversed(range(1, 10, 2)):491...     print(i)492...49394947495549634971498```499500Чтобы перебрать последовательность в отсортированном порядке, используйте функцию [`sorted()`](https://python-all.ru/3.10/library/functions.html#sorted), которая возвращает новый отсортированный список, оставляя исходный без изменений.501502```python503>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']504>>> for i in sorted(basket):505...     print(i)506...507apple508apple509banana510orange511orange512pear513```514515Использование [`set()`](https://python-all.ru/3.10/library/stdtypes.html#set) для последовательности удаляет повторяющиеся элементы. Использование [`sorted()`](https://python-all.ru/3.10/library/functions.html#sorted) в сочетании с [`set()`](https://python-all.ru/3.10/library/stdtypes.html#set) для последовательности является идиоматическим способом перебора уникальных элементов последовательности в отсортированном порядке.516517```python518>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']519>>> for f in sorted(set(basket)):520...     print(f)521...522apple523banana524orange525pear526```527528Иногда возникает соблазн изменить список во время его перебора; однако часто проще и безопаснее создать новый список.529530```python531>>> import math532>>> raw_data = [56.2, float('NaN'), 51.7, 55.3, 52.5, float('NaN'), 47.8]533>>> filtered_data = []534>>> for value in raw_data:535...     if not math.isnan(value):536...         filtered_data.append(value)537...538>>> filtered_data539[56.2, 51.7, 55.3, 52.5, 47.8]540```541542## 5.7. Подробнее об условиях543544Условия, используемые в операторах `while` и `if`, могут содержать любые операторы, а не только сравнения.545546Операторы сравнения `in` и `not in` являются проверками принадлежности, определяющими, находится ли значение в контейнере (или не находится). Операторы `is` и `is not` сравнивают, являются ли два объекта действительно одним и тем же объектом. Все операторы сравнения имеют одинаковый приоритет, который ниже, чем у всех числовых операторов.547548Сравнения можно объединять в цепочку. Например, `a < b == c` проверяет, меньше ли `a` `b` и равно ли `b` `c`.549550Сравнения можно комбинировать с помощью логических операторов `and` и `or`, а результат сравнения (или любого другого логического выражения) можно инвертировать с помощью `not`. Они имеют более низкий приоритет, чем операторы сравнения; среди них `not` имеет наивысший приоритет, а `or` – наинизший, так что `A and not B or C` эквивалентно `(A and (not B)) or C`. Как всегда, круглые скобки можно использовать для явного указания порядка вычислений.551552The Boolean operators `and` and `or` are so-called *short-circuit* operators: their arguments are evaluated from left to right, and evaluation stops as soon as the outcome is determined. For example, if `A` and `C` are true but `B` is false, `A and B and C` does not evaluate the expression `C`. When used as a general value and not as a Boolean, the return value of a short-circuit operator is the last evaluated argument.553554Результат сравнения или другого логического выражения можно присвоить переменной. Например,555556```python557>>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance'558>>> non_null = string1 or string2 or string3559>>> non_null560'Trondheim'561```562563Обратите внимание, что в Python, в отличие от C, присваивание внутри выражений должно выполняться явно с помощью [оператора морж](https://python-all.ru/3.10/faq/design.html#why-can-t-i-use-an-assignment-in-an-expression) `:=`. Это позволяет избежать целого класса проблем,常见的ных в программах на C: ввод `=` в выражении, когда подразумевалось `==`.564565## 5.8. Сравнение последовательностей и других типов566567Sequence objects typically may be compared to other objects with the same sequence type. The comparison uses *lexicographical* ordering: first the first two items are compared, and if they differ this determines the outcome of the comparison; if they are equal, the next two items are compared, and so on, until either sequence is exhausted. If two items to be compared are themselves sequences of the same type, the lexicographical comparison is carried out recursively. If all items of two sequences compare equal, the sequences are considered equal. If one sequence is an initial sub-sequence of the other, the shorter sequence is the smaller (lesser) one. Lexicographical ordering for strings uses the Unicode code point number to order individual characters. Some examples of comparisons between sequences of the same type:568569```python570(1, 2, 3)              < (1, 2, 4)571[1, 2, 3]              < [1, 2, 4]572'ABC' < 'C' < 'Pascal' < 'Python'573(1, 2, 3, 4)           < (1, 2, 4)574(1, 2)                 < (1, 2, -1)575(1, 2, 3)             == (1.0, 2.0, 3.0)576(1, 2, ('aa', 'ab'))   < (1, 2, ('abc', 'a'), 4)577```578579Обратите внимание, что сравнение объектов разных типов с помощью `<` или `>` допустимо при условии, что объекты имеют соответствующие методы сравнения. Например, смешанные числовые типы сравниваются по их числовому значению, поэтому 0 равно 0,0 и т.д. В противном случае, вместо того чтобы давать произвольный порядок, интерпретатор вызовет исключение [`TypeError`](https://python-all.ru/3.10/library/exceptions.html#TypeError).580581Сноски582583**[1](https://python-all.ru/3.10/tutorial/datastructures.html#id1)**584585В других языках может возвращаться изменённый объект, что позволяет выстраивать цепочки вызовов методов, например `d->insert("a")->remove("b")->sort();`.586