Операции сравнения в Python, цепочки сравнений
В Python есть шесть операций сравнения. Все они имеют одинаковый приоритет, который выше, чем у логических операций.
Разрешенные операции сравнения:
- x < y - строго x меньше y ,
- x
- x > y — строго x больше y ,
- x >= y — x больше или равно y ,
- x == y — x равно y ,
- x != y — x не равно y .
Сравнения могут быть связаны произвольно и записаны в цепочки сравнений, в которых для соединения сравнений используются неявные логические операторы and .
x y z # эквивалентно x y and y z
a b c d # эквивалентно a b and b c and c d
В такой форме сравнения легче читаются, и каждое подвыражение вычисляется по крайней мере один раз.
Объекты разных типов, за исключением различных числовых типов, никогда не будут равными.
Оператор == всегда определен, но для некоторых типов объектов, например объектов класса, эквивалентен оператору идентичности is .
Операторы < , и >= применяются только там, где они имеют смысл, например они вызывают исключение TypeError , когда один из аргументов является комплексным числом.
Неидентичные экземпляры класса обычно при сравнении будут неравны, если только класс не определяет метод __eq__() .
Экземпляры класса не могут быть упорядочены относительно других экземпляров того же класса или других типов объектов, если класс не определяет достаточное количество методов __lt__() , __le__() , __gt__() и __ge__() . В общем случае определение методов __lt__() и __eq__() для этих целей бывает достаточно.
Важно! Числа типа float не являются десятичными дробями (decimal.Decimal) и используют двоичную арифметику, поэтому иногда выражения могут вычисляться с ничтожно малыми погрешностями. Из-за этих погрешностей операции сравнения работают не так как ожидается.
>>> 0.8 - 0.5 == 0.3 # False >>> 0.8 - 0.5 - 0.3 == 0 # False >>> 0.8 - 0.5 - 0.3 # 5.551115123125783e-17 >>> from decimal import Decimal >>> Decimal('0.8') - Decimal('0.5') - Decimal('0.3') == 0 # True >>> Decimal('0.8') - Decimal('0.5') - Decimal('0.3') # Decimal('0.0')
Поведение встроенных типов в операциях сравнения:
- Числа встроенных числовых типов int , float , complex и стандартных библиотечных типов fractions.Fraction и decimal.Decimal можно сравнивать внутри и между их типами, с ограничением, что комплексные числа не поддерживают сравнение порядка. В пределах задействованных типов они сравнивают математически (алгоритмически) правильно без потери точности. Нечисловые значения float(‘NaN’) и decimal.Decimal(‘NaN’) являются особыми. Любое упорядоченное сравнение числа с нечисловым значением неверно. Нечисловые значения не равны самим себе. Например, если x = float(‘NaN’) , 3 < x , x < 3 и x == x все ложны, а x! = X истинно. Это поведение соответствует стандарту IEEE 754.
- None и NotImplemented являются одиночными. PEP 8 советует, что сравнения для одиночных экземпляров всегда должны выполняться с использованием или нет, а не с операторами равенства.
- Двоичные последовательности (экземпляры bytes или bytearray ) можно сравнивать внутри и между их типами. Они сравнивают лексикографически, используя числовые значения своих элементов.
- Строки (экземпляры str ) сравниваются лексикографически с использованием числовых кодовых точек Unicode (результат встроенной функции ord() ) их символов.
Строки и двоичные последовательности напрямую сравнивать нельзя.
- Чтобы две коллекции были равными, они должны быть одного типа, иметь одинаковую длину и каждая пара соответствующих элементов должна быть равной. Например [1,2] == (1,2) ложно, потому что типы последовательностей разные.
- Коллекции, поддерживающие сравнение порядка (сортировку), упорядочиваются также, как их первые неравные элементы, например [1,2, x]
Подводные камни (ловушки цепочек сравнения).
Несмотря на то, что цепочки сравнения выглядят очень разумно, есть пара подводных камней, на которые необходимо обратить внимание.
Нетранзитивные операторы.
Чтобы проверить, совпадают ли a , b и c , можно использовать цепочку сравнения a == b == c . А как проверить, ВСЕ ли они разные? Первое, что приходит в голову — это a != b != c , и попадаем в первую ловушку!
>>> a = c = 1 >>> b = 2 >>> a != b != c # True
Но это не так. Они не все разные, ведь a == c . Проблема здесь в том, что a != b != c — это a != b and b != c , т.е. проверяет, что b отличается от a и от c , но ничего не говорит о том, как связаны a и c .
С математической точки зрения, != не является транзитивным, т. е. знание того, как a относится к b , и знание того, как b относится к c , не говорит о том, как a относится к c . Что касается транзитивного примера, можно взять оператор равенства == . Если a == b and b == c , то также верно, что a == c .
Непостоянное значение в выражении.
Если b содержит что-то непостоянное или выражение с побочными эффектами, то эти два выражения не эквивалентны.
Этот пример показывает разницу в количестве оценок значения в середине выражения:
def f(): print("run") return 3 >>> 1 f() 5 # run # True >>> 1 f() and f() 5 # run # run # True
lst = [-2, 2] def f(): global lst lst = lst[::-1] return lst[0] >>> 1 f() and f() 0 # True >>> 1 f() 0 # False
Синтаксис lst[::-1] — это срез, который переворачивает список.
Плохо читаемые цепочки сравнения.
Цепочки сравнения выглядят действительно естественно, но в некоторых конкретных случаях она не так хороша. Это довольно субъективный вопрос, но лучше избегать цепочки, в которых операторы не «выровнены«, например:
Можно утверждать, например, что a < b >c читается как «проверим, b больше, чем a и c ?«, но лучше эту цепочку записать так max(a, c) < b или b >max(a, c) .
Есть некоторые другие цепочки, которые просто сбивают с толку:
В Python операторы is , is not , in и not in являются операторами сравнения, следовательно их также можно связать с другими операторами. Это создает странные ситуации, такие как:
>>> a = 3 >>> lst = [3, 5] >>> a in lst == True # False
Примеры использования цепочек сравнения.
>>> a = 1 >>> b = 2 >>> c = 3 >>> a b c # True
Другой пример использования — когда необходимо убедиться, что все три значения одинаковы:
>>> a = b = 1 >>> c = 2 >>> if a == b == c: . print("все равны") . else: . print("некоторые отличаются") # некоторые отличаются >>> c = 1 >>> if a == b == c: . print("все равны") . else: . print("некоторые отличаются") # все равны
На самом деле можно связать произвольное количество операторов сравнения в цепочку? Например, a == b == c == d == e проверяет, совпадают ли все пять переменных, в то время как a < b < c < d < e проверяет, есть ли строго возрастающая последовательность.
Операторы сравнения Python
Что такое оператор и операнды? Это можно объяснить простым примером: 10 > 5 . В этом выражении 10 и 5 — левый и правый операнды. Знак > — оператор.
Пусть переменная a = 10 , а переменная b = 5
| Оператор | Описание | Пример | Результат |
|---|---|---|---|
| == | Проверяет, равны ли значение операндов. Если равны, то условие является истиной | a == b | False |
| != | Проверяет, равны ли значение операндов. Если НЕ равны, то условие является истиной | a != b | True |
| > | Проверяет значение левого операнда. Если оно больше, чем значение правого, то условие является истиной | a > b | True |
| Проверяет значение левого операнда. Если оно меньше, чем значение правого, то условие является истиной | a < b | False | |
| >= | Проверяет значение левого операнда. Если оно больше, либо равно значению правого, то условие является истиной | a >= b | True |
| Проверяет значение левого операнда. Если оно меньше, либо равно значению правого, то условие является истиной | a | False |
©2024 Letpy
Мы используем файлы cookie
Наш сайт использует файлы cookie для улучшения пользовательского опыта, сбора статистики и обеспечения доступа к обучающим материалам. Мы также передаем информацию об использовании вами нашего сайт партерам по социальным сетям, рекламе и аналитике. В свою очередь, наши партнеры могут объединять ее с другой предоставленной вами информацией, или с информацией, которую они собрали в результате использования вами их услуг.
6. Python – Основные операторы языка
Python – это универсальный язык, который можно использовать для создания всевозможных приложений. Мы рассмотрим основные операторы в Python. Вы должны хорошо понимать, как использовать основные операторы в Python.
Давайте разберёмся, что такое операторы. Операторы – это конструкции, которые могут управлять значением операндов.
Рассмотрим выражение «4 + 5 = 9». Здесь «4» и «5» называются операндами, а «+» называется оператором.
Типы операторов
В Python есть множество операторов, которые можно использовать для выполнения операций над переменными и значениями. Наиболее распространенными операторами являются арифметические операторы, которые используются для выполнения математических операций, таких как сложение, вычитание, умножение и деление. Существуют также операторы сравнения, которые используются для сравнения двух значений, и логические операторы, которые используются для объединения нескольких условий.
Язык Python поддерживает следующие типы операторов:
- Арифметические операторы.
- Операторы сравнения (отношения).
- Операторы присваивания.
- Логические операторы.
- Побитовые операторы.
- Операторы членства.
- Операторы идентификации.
Давайте посмотрим все операторы Python один за другим.
Оглавление
- 1. Python – Самоучитель для начинающих
- 2. Python – Обзор
- 3. Python – Установка среды
- 4. Python – Базовый синтаксис
- 4.1. Python – Аргументы командной строки
- 5. Python – Типы переменных
- 6. Python – Основные операторы
- 6.1. Python – Арифметические операторы
- 6.2. Python – Операторы сравнения
- 6.3. Python – Операторы присваивания: примеры
- 6.4. Python – Побитовые операторы
- 6.5. Python – Логические операторы
- 6.6. Python – Операторы членства
- 6.7. Python – Операторы идентификации
- 6.8. Python – Приоритет операторов
- 7. Python – Условные операторы
- 7.1. Python – Условие if
- 7.2. Python – Условные операторы if. else и elif
- 7.3. Python – Вложенные операторы if
- 8. Python – Циклы
- 8.1. Python – Цикл while
- 8.2. Python – Цикл for
- 8.3. Python – Вложенные циклы
- 8.4. Python – Оператор break
- 8.5. Python – Оператор continue
- 8.6. Python – Оператор pass
- 9. Python – Числа
- 9.1. Python – Метод abs()
- 9.2. Python – Метод ceil()
- 9.3. Python – Метод cmp()
- 9.4. Python – Метод exp()
- 9.5. Python – Метод fabs()
- 9.6. Python – Метод floor()
- 9.7. Python – Метод log()
- 9.8. Python – Метод log10()
- 9.9. Python – Метод max()
- 9.10. Python – Метод min()
- 9.11. Python – Метод modf()
- 9.12. Python – Метод pow()
- 9.13. Python – Метод round()
- 9.14. Python – Метод sqrt()
- 9.15. Python – Метод choice()
- 9.16. Python – Метод randrange()
- 9.17. Python – Метод random()
- 9.18. Python – Метод seed()
- 9.19. Python – Метод shuffle()
- 9.20. Python – Метод uniform()
- 9.21. Python – Метод acos()
- 9.22. Python – Метод asin()
- 9.23. Python – Метод atan()
- 9.24. Python – Метод atan2()
- 9.25. Python – Метод cos()
- 9.26. Python – Метод hypot()
- 9.27. Python – Метод sin()
- 9.28. Python – Метод tan()
- 9.29. Python – Метод degrees()
- 9.30. Python – Метод radians()
Условный оператор
Все ранее рассматриваемые программы имели линейную структуру: все инструкции выполнялись последовательно одна за одной, каждая записанная инструкция обязательно выполняется.
Допустим мы хотим по данному числу x определить его абсолютную величину (модуль). Программа должна напечатать значение переменной x, если x>0 или же величину -x в противном случае. Линейная структура программы нарушается: в зависимости от справедливости условия x>0 должна быть выведена одна или другая величина. Соответствующий фрагмент программы на Питоне имеет вид:
x = int(input())
if x > 0:
print(x)
else:
print(-x)
В этой программе используется условная инструкция if (если). После слова if указывается проверяемое условие (x > 0), завершающееся двоеточием. После этого идет блок (последовательность) инструкций, который будет выполнен, если условие истинно, в нашем примере это вывод на экран величины x. Затем идет слово else (иначе), также завершающееся двоеточием, и блок инструкций, который будет выполнен, если проверяемое условие неверно, в данном случае будет выведено значение -x.
Итак, условная инструкция в Питоне имеет следующий синтаксис:
if Условие:
Блок инструкций 1
else:
Блок инструкций 2
Блок инструкций 1 будет выполнен, если Условие истинно. Если Условие ложно, будет выполнен Блок инструкций 2.
В условной инструкции может отсутствовать слово else и последующий блок. Такая инструкция называется неполным ветвлением. Например, если дано число x и мы хотим заменить его на абсолютную величину x, то это можно сделать следующим образом:
if x < 0:
x = -x
print(x)
В этом примере переменной x будет присвоено значение -x, но только в том случае, когда x
Для выделения блока инструкций, относящихся к инструкции if или else в языке Питон используются отступы. Все инструкции, которые относятся к одному блоку, должны иметь равную величину отступа, то есть одинаковое число пробелов в начале строки. Рекомендуется использовать отступ в 4 пробела и не рекомедуется использовать в качестве отступа символ табуляции.
Это одно из существенных отличий синтаксиса Питона от синтаксиса большинства языков, в которых блоки выделяются специальными словами, например, нц. кц в Кумире, begin. end в Паскале или фигурными скобками в Си.