Определить, есть ли целое число между двумя другими целыми числами?


400

Как определить, находится ли данное целое число между двумя другими целыми числами (например, больше / равно 10000и меньше / равно 30000)?

Я использую 2.3 IDLE, и то, что я пытался до сих пор, не работает:

if number >= 10000 and number >= 30000:
    print ("you have to pay 5% taxes")

20
Проверьте свои логические операторы, конечно, число будет больше 10000, если оно больше 30000. Посмотрите на мелкие детали, и вы поймете гораздо больше ошибок.
— Кайли


7
Пожалуйста, измените> = 30000 на <= 30000
— Badiboy

Ответы:


1048
if 10000 <= number <= 30000:
    pass

209
Питон так хорош :). И быть избыточным: это называется «интервальным сравнением».
— Мэтт Монтег

Какая разница в скорости между этим и if number in range(10000, 30001)предложенным другим решением? Кроме того, быстрее или медленнее при использовании setвместо range?
— Сон Чо

15
@MikeC С интервалом сравнения numberсначала сравнивается с 10000. Если оно меньше, чем 10000выражение, оно сразу замыкается и второе сравнение не проверяется. Сложность есть O(1). in range(0, n)вместо этого генерирует всю последовательность чисел, а затем перебирает ее. Сложность есть O(n). Сложность по- in set(range(0, n))прежнему заключается в том, O(n)что создание набора имеет временную сложность: O(n) ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt
— Паоло Моретти,

5
@MikeC Попробуй запустить в своей оболочке:> python -m timeit '10000 <= 10 <= 30000' > python -m timeit '10 in range(10000, 30001)' > python -m timeit '10 in set(range(10000, 30001))'
— Паоло Моретти

3
выглядит как в python3.5.2, диапазон в ~ 10 раз медленнее, чем оператор if, с константой скорости относительно значения проверки диапазона ... таким образом, наиболее вероятная разница из-за служебной нагрузки.
— Амор

78
>>> r = range(1, 4)
>>> 1 in r
True
>>> 2 in r
True
>>> 3 in r
True
>>> 4 in r
False
>>> 5 in r
False
>>> 0 in r
False

4
Вау, я всегда думал range(или xrangeв python2) возвращает генератор, поэтому вы не можете повторно протестировать его.
— yegle

24
Важно помнить, что 4 in range(1,4)это Неверно. Так что лучше используйте, 1 >= r <= 4поскольку это позволяет избежать возможных ошибок новичков
— tripplet

50
1.5 in rдает Falseдаже в 3.4. Этот ответ хорош только для целых чисел.
— jpmc26

9
@tripplet, вы сделали ту же ошибку, что и OP !, должно быть1 <= r <= 4
— Джон Ла Руи

8
(1.) плохая производительность (как уже отмечали другие, этот синтаксис выглядит хорошо, но выполнение может занять много времени, потому что это O (n) операций против if a <= x <= b...) (2.) не работает для floatтипов (3 .) тест на дальность не является всеобъемлющим ... поэтому многие разработчики могут вносить ошибки, потому что ожидают, что диапазон будет исчерпывающим
— Тревор Бойд Смит,


30

Ваш фрагмент кода,

if number >= 10000 and number >= 30000:
    print ("you have to pay 5% taxes")

фактически проверяет, больше ли число, чем 10000 и 30000.

Предполагая, что вы хотите проверить, что число находится в диапазоне 10000 - 30000, вы можете использовать сравнение интервалов Python:

if 10000 <= number <= 30000:
    print ("you have to pay 5% taxes")

Эта функция Python более подробно описана в документации по Python .



8

Проблема сравнений в том, что их трудно отладить, когда вы помещаете туда, >=где должно быть<=

#                             v---------- should be <
if number >= 10000 and number >= 30000:
    print ("you have to pay 5% taxes")

Python позволяет просто написать то, что вы имеете в виду словами

if number in xrange(10000, 30001): # ok you have to remember 30000 + 1 here :)

В Python3 вам нужно использовать rangeвместо xrange.

редактировать: люди, кажется, больше заботятся о микробенчмарках и о том, как классно работают цепочки. Мой ответ - о защитном (менее уязвимом для ошибок) программировании.

В результате претензии в комментариях я добавил микро-тест для Python3.5.2

$ python3.5 -m timeit "5 in range(10000, 30000)"
1000000 loops, best of 3: 0.266 usec per loop
$ python3.5 -m timeit "10000 <= 5 < 30000"
10000000 loops, best of 3: 0.0327 usec per loop

Если вы беспокоитесь о производительности, вы можете вычислить диапазон один раз

$ python3.5 -m timeit -s "R=range(10000, 30000)" "5 in R"
10000000 loops, best of 3: 0.0551 usec per loop

2
xrange устарела в Python 3, к сожалению.
— apraetor

1
@apraetor, да, используйте range(10000, 30001)в Python3. Это не создает список
— John La Rooy

3
@JBChouinard, вы абсолютно не правы. xrangeв Python2 или rangeв Python3 есть тесты членства. Попробуйте сами, если не верите. <=только более эффективно, потому что это не создает объект диапазона. В обоих направлениях как O (1). Дело в том , что ОП был пытается сделать это по- своему и в конечном итоге с ошибкой . Быстрый код, который не так, хуже.
— Джон Ла Рой

2
на i5, (i) python 3.5:% timeit 5 в диапазоне (10000, 30000) 1000 циклов, лучшее из 3: 451 мкс на цикл. % timeit 10000 <= 5 <= 30000 10000000 циклов, лучше всего 3: 59,4 нс на цикл. это фактор более 7000
— тэб

1
@tback, если бы был шанс, что это было бы в 7000 раз медленнее, я бы не предложил это. Возможно, вы могли бы попробовать запустить тест снова.
— Джон Ла Рой

8

Определите диапазон между числами:

r = range(1,10)

Тогда используйте это:

if num in r:
    print("All right!")

3
rangeне считается последнее значение 10 в вашем случае. range(1,11)правильно, если вам нужно сравнить между 1 и 10
— ikbel benabdessamad

6

Есть два способа сравнить три целых числа и проверить, находится ли b между a и c :

if a < b < c:
    pass

а также

if a < b and b < c:
    pass

Первый выглядит более читабельным, но второй работает быстрее .

Давайте сравним использование dis.dis :

    >>> dis.dis('a < b and b < c')
  1           0 LOAD_NAME                0 (a)
              2 LOAD_NAME                1 (b)
              4 COMPARE_OP               0 (<)
              6 JUMP_IF_FALSE_OR_POP    14
              8 LOAD_NAME                1 (b)
             10 LOAD_NAME                2 (c)
             12 COMPARE_OP               0 (<)
        >>   14 RETURN_VALUE
>>> dis.dis('a < b < c')
  1           0 LOAD_NAME                0 (a)
              2 LOAD_NAME                1 (b)
              4 DUP_TOP
              6 ROT_THREE
              8 COMPARE_OP               0 (<)
             10 JUMP_IF_FALSE_OR_POP    18
             12 LOAD_NAME                2 (c)
             14 COMPARE_OP               0 (<)
             16 RETURN_VALUE
        >>   18 ROT_TWO
             20 POP_TOP
             22 RETURN_VALUE
>>>

и используя timeit :

~$ python3 -m timeit "1 < 2 and 2 < 3"
10000000 loops, best of 3: 0.0366 usec per loop

~$ python3 -m timeit "1 < 2 < 3"
10000000 loops, best of 3: 0.0396 usec per loop

Кроме того, вы можете использовать диапазон , как предлагалось ранее, однако он намного медленнее.


0

Предположим , что существует 3 неотрицательные целые числа: a, b, и c. Математически говоря, если мы хотим , чтобы определить , есть ли cмежду aи b, включительно, можно использовать следующую формулу:

(с-а) * (б-с)> = 0

или в Python:

> print((c - a) * (b - c) >= 0)
True

Это неправильно, возьмем простой пример: a = 1, b = 2, c = 3 ba = 1 ca = 2 (ba) * (ca) = 1 * 2> = 0 True => 3 от 1 до 2
— Ричард Ardelean

Извините за ошибку, которую я сделал. Я отредактировал свой ответ @RichardArdelean.
— Анастасия-Романова 秀

0

Вы хотите, чтобы выходные данные печатали данный оператор, если и только если число находится в пределах от 10000 до 30000.

Код должен быть;

if number >= 10000 and number <= 30000:
    print("you have to pay 5% taxes")

3
Этот ответ уже был предложен. Что ваш ответ добавляет к вопросу?
— Джайдип Шекхар

0

Условие должно быть,

if number == 10000 and number <= 30000:
     print("5% tax payable")

Причиной использования number == 10000является то, что если число равно 50000, и если мы используем, number >= 10000условие будет выполнено, а это не то, что вы хотите.


Это не удастся, например, для 10001. Он хочет числа от 10000 до 30000. Ваше состояние будет работать только для числа == 10000.
— Геррейро
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.