Операции сравнения в 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.
Строки и двоичные последовательности напрямую сравнивать нельзя.
- Чтобы две коллекции были равными, они должны быть одного типа, иметь одинаковую длину и каждая пара соответствующих элементов должна быть равной. Например [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: полезные советы и примеры кода
В первом примере мы создаем список чисел, а затем используем генератор списка и функцию all(), чтобы проверить, что каждое число меньше или равно следующему числу. Если это верно для всех чисел, то список считается упорядоченным по возрастанию. Во втором примере мы делаем то же самое, но проверяем, что каждое число больше или равно следующему числу, чтобы определить, является ли список упорядоченным по убыванию.
Детальный ответ
Как проверить упорядоченность чисел в Python
Порой нам нужно проверить, упорядочены ли числа в списке в определенном порядке. В Python есть несколько способов, которые помогут нам выполнить эту задачу.
1. Сравнение соседних элементов
Один из способов проверить упорядоченность чисел в списке — это сравнение каждого элемента с его соседним. Если все соседние элементы удовлетворяют условию упорядоченности, то можно сделать вывод о том, что числа упорядочены.
numbers = [1, 2, 3, 4, 5] def is_ordered(numbers): for i in range(1, len(numbers)): if numbers[i] < numbers[i-1]: return False return True if is_ordered(numbers): print("Числа упорядочены") else: print("Числа не упорядочены")
В данном примере мы создаем функцию is_ordered , которая принимает список чисел и возвращает True , если числа упорядочены, и False в противном случае. Мы используем цикл for , чтобы проверить каждый элемент списка на условие упорядоченности, сравнивая его с предыдущим элементом.
2. Использование встроенной функции
Python предоставляет встроенную функцию sorted , которая может использоваться для проверки упорядоченности чисел. Функция sorted сортирует список чисел в порядке возрастания по умолчанию. Если отсортированный список совпадает с исходным, то можно сделать вывод о том, что числа упорядочены.
numbers = [1, 2, 3, 4, 5] def is_ordered(numbers): return numbers == sorted(numbers) if is_ordered(numbers): print("Числа упорядочены") else: print("Числа не упорядочены")
В этом примере мы опять используем функцию is_ordered для проверки упорядоченности списка чисел. Мы сравниваем отсортированный список с исходным с помощью оператора сравнения == .
3. Использование функции all
В Python у нас также есть функция all , которая может быть полезна для проверки упорядоченности чисел. Функция all принимает итерируемый объект и возвращает True , если все элементы в этом объекте истинны, и False в противном случае.
numbers = [1, 2, 3, 4, 5] def is_ordered(numbers): return all(numbers[i]
Здесь мы используем генераторное выражение внутри функции all , чтобы проверить условие упорядоченности для каждой пары соседних элементов в списке чисел.
Заключение
В этой статье мы рассмотрели три способа проверки упорядоченности чисел в Python. Вы можете выбрать любой из них в зависимости от ваших предпочтений и требований. Используя сравнение соседних элементов, встроенную функцию sorted или функцию all , вы сможете быстро и легко проверить, упорядочены ли числа в списке.
Как проверить упорядочены ли числа в Python?
Для проверки, упорядочены ли числа в Python, вы можете использовать функцию sorted() . Она возвращает отсортированную копию списка, не изменяя исходный список.
numbers = [5, 2, 8, 1, 9] sorted_numbers = sorted(numbers) if numbers == sorted_numbers: print("Числа упорядочены.") else: print("Числа не упорядочены.")
В этом примере, мы создали список numbers с числами [5, 2, 8, 1, 9]. Затем, мы отсортировали его, присвоив результат переменной sorted_numbers . Затем, мы сравнили исходный список numbers с отсортированным списком sorted_numbers . Если они равны, значит числа уже упорядочены. Если он не равны, значит числа не упорядочены.
Детальный ответ
Как проверить, упорядочены ли числа в Python?
При работе с числами в Python иногда может возникнуть необходимость проверить, являются ли они упорядоченными. Например, вы можете хотеть узнать, отсортирован ли список чисел в порядке возрастания или убывания. В этой статье мы рассмотрим несколько способов проверки упорядоченности чисел в Python.
1. Проверка с использованием встроенных функций Python
Python предоставляет функции, которые позволяют проверить упорядоченность чисел. Одной из таких функций является функция sorted() . Она принимает список чисел и возвращает отсортированную копию этого списка. Далее мы можем сравнить полученный отсортированный список с исходным.
numbers = [1, 2, 3, 4, 5] sorted_numbers = sorted(numbers) if numbers == sorted_numbers: print("Числа упорядочены.") else: print("Числа не упорядочены.")
В этом примере мы проверяем, является ли список numbers упорядоченным. Мы сортируем его с помощью функции sorted() и сохраняем результат в переменной sorted_numbers . Затем мы сравниваем исходный список и отсортированный список с помощью оператора сравнения == . Если они равны, значит список упорядочен, и мы выводим сообщение "Числа упорядочены.". Если они не равны, значит список не упорядочен, и мы выводим сообщение "Числа не упорядочены."
2. Проверка с использованием цикла
Еще один способ проверки упорядоченности чисел - использование цикла. В этом случае мы будем последовательно сравнивать каждую пару чисел в списке и проверять, что они упорядочены.
numbers = [5, 4, 3, 2, 1] ordered = True for i in range(len(numbers) - 1): if numbers[i] > numbers[i + 1]: ordered = False break if ordered: print("Числа упорядочены.") else: print("Числа не упорядочены.")
В этом примере мы инициализируем переменную ordered со значением True . Затем мы используем цикл for для последовательного сравнения каждой пары чисел. Если мы находим пару чисел, где первое число больше второго, мы устанавливаем значение ordered в False и выходим из цикла с помощью оператора break . После цикла мы проверяем значение ordered . Если оно равно True , значит все числа упорядочены, и мы выводим сообщение "Числа упорядочены.". Если значение ordered равно False , значит числа не упорядочены, и мы выводим сообщение "Числа не упорядочены."
3. Проверка с использованием функции all()
Третий способ проверки упорядоченности чисел состоит в использовании функции all() . Она принимает итерируемый объект, например список, и возвращает True , если все элементы объекта удовлетворяют определенному условию. В нашем случае условием будет то, что каждое следующее число больше предыдущего.
numbers = [1, 2, 3, 4, 5] ordered = all(numbers[i]
В этом примере мы используем генератор списка для создания списка булевых значений. Каждое значение в списке будет True , если следующее число больше или равно предыдущему, и False в противном случае. Мы передаем этот список в функцию all() , которая возвращает True , если все значения в списке равны True . Затем мы проверяем результирующее значение и выводим соответствующее сообщение. Теперь у вас есть несколько способов для проверки упорядоченности чисел в Python. Вы можете выбрать тот, который наиболее удобен для вас и вашего конкретного случая.
Проверка на целое число
На ввод дается два чилса в одной строчке через пробел, Нужно проверить целые они или нет, если нет, то вывести:"Неправильный формат ввода". Вот мой код:
a, b = map(int, input().split()) if int(a)/float(a)==1.0: print('является целым числом') else: print('не целое число.') if int(b)/float(b)==1.0: print('является целым числом') else: print('не целое число.')
Отслеживать
77.2k 6 6 золотых знаков 58 58 серебряных знаков 126 126 бронзовых знаков
задан 14 дек 2020 в 12:41
333 5 5 серебряных знаков 15 15 бронзовых знаков
И что с твоим кодом?
14 дек 2020 в 12:44
float(a) - int(a) == 0
14 дек 2020 в 12:51
@Anton Nikolaev, 2.0 и 2 ?
14 дек 2020 в 12:53
@Zhihar 2.0 это с точки зрения математики не целое?
14 дек 2020 в 12:55
а это целое или с правающей запятой в рамках python?
14 дек 2020 в 12:58
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Не такая простая задача если решать её полностью. Есть три с половиной варианта:
- целое число (0, -33, 16, 1_000_000)
-
- вещественное число (0.1, -123.4, 12e-1, 12.345e2).
- вещественное число c целым значением (1.0, -16.0, 12.34e2)
- непонятно что (123s, abracadabra, 1O0).
Целое число распознает int(s) . Если s строка с целым числом внутри, то вернётся его значение, иначе будет выброшено исключение ValueError .
Вещественное число распознает float(s) . И тоже выбросит исключение в случае неправильного формата.
Для проверки целочисленного значения вещественного числа пригодится метод is_integer .
В третий пункт попадает всё что вообще не выглядит как число.
Проверка на целое число должна идти до проверки на вещественное, иначе все целые числа будут записаны в вещественные.
def as_int(s): try: return int(s) except ValueError: return None def as_float(s): try: return float(s) except ValueError: return None def main(): s = input() i = as_int(s) if i is not None: print('int', repr(s), i) return f = as_float(s) if f is not None: print('float', repr(s), f) if f.is_integer(): print('. of integer value') return print('. ', repr(s)) main()
$ python is_integer.py 1_000_000 int '1_000_000' 1000000 $ python is_integer.py 0 int '0' 0 $ python is_integer.py -33 int '-33' -33 $ python is_integer.py 16 int '16' 16 $ python is_integer.py 0.1 float '0.1' 0.1 $ python is_integer.py -123.4 float '-123.4' -123.4 $ python is_integer.py 12e-1 float '12e-1' 1.2 $ python is_integer.py 12.345e2 float '12.345e2' 1234.5 $ python is_integer.py 1.0 float '1.0' 1.0 . of integer value $ python is_integer.py -16.0 float '-16.0' -16.0 . of integer value $ python is_integer.py 12.34e2 float '12.34e2' 1234.0 . of integer value $ python is_integer.py 123s . '123s' $ python is_integer.py abracadabra . 'abracadabra' $ python is_integer.py 1O0 . '1O0'