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

400

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

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

if number >= 10000 and number >= 30000:
    print ("you have to pay 5% taxes")
Средний ребенок
источник
20
Проверьте свои логические операторы, конечно, число будет больше 10000, если оно больше 30000. Посмотрите на мелкие детали, и вы поймете гораздо больше ошибок.
Кайли
2
Сравнения можно связать в цепочку docs.python.org/2/reference/expressions.html#comparisons
theBuzzyCoder
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 .) тест на дальность не является всеобъемлющим ... поэтому многие разработчики могут вносить ошибки, потому что ожидают, что диапазон будет исчерпывающим
Тревор Бойд Смит,
52

Ваш оператор неверен. Должно быть if number >= 10000 and number <= 30000:. Кроме того, Python имеет сокращение для такого рода вещей if 10000 <= number <= 30000:.

Сайлас Рэй
источник
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 .

Карл Экерот
источник
9
if number >= 10000 and number <= 30000:
    print ("you have to pay 5% taxes")
Сандро Мунда
источник
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!")
joandiar91
источник
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

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

a_bridges
источник
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условие будет выполнено, а это не то, что вы хотите.

Sadaf
источник
Это не удастся, например, для 10001. Он хочет числа от 10000 до 30000. Ваше состояние будет работать только для числа == 10000.
Геррейро