정수가 다른 두 정수 사이에 있는지 확인


397

주어진 정수가 다른 두 정수 사이에 있는지 어떻게 알 수 있습니까 (예 :보다 크거나 같고 10000보다 작거나 같습니다 30000)?

2.3 IDLE을 사용하고 있으며 지금까지 시도한 것이 작동하지 않습니다.

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

20
부울 연산자를 확인하십시오. 물론 30000보다 크면 숫자가 10000보다 큽니다. 작은 세부 사항을 보면 훨씬 더 많은 실수를 잡을 수 있습니다.
Kaili

2
비교는 체인으로 연결될 수 있습니다. docs.python.org/2/reference/expressions.html#comparisons
theBuzzyCoder

6
Pls 변경> = 30000에서 <= 30000
Badiboy

답변:


1044
if 10000 <= number <= 30000:
    pass

207
파이썬은 너무 좋습니다 :). 그리고 중복됩니다 : 이것을 "간격 비교"라고합니다.
Matt Montag

이것과 if number in range(10000, 30001)다른 솔루션에서 제안한 속도 차이는 무엇입니까 ? 또한 set대신에 사용할 때 더 빠르거나 느립 range니까?
Sung Cho

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))'
Paolo Moretti

3
python3.5.2와 같이 범위는 if 문보다 ~ 10 배 느리고 범위 검사 값과 관련하여 속도가 일정합니다 ... 따라서 함수 오버 헤드로 인한 차이가 가장 큽니다.
amohr

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(또는 xrangepython2에서) 생성기를 반환하므로 반복적으로 테스트 할 수 없다고 생각했습니다.
yegle

24
4 in range(1,4)False 라는 점을 명심해야합니다 . 1 >= r <= 4초보자가 발생할 수있는 오류를 피할 수
있으므로을

50
1.5 in rFalse심지어 3.4 에서조차 준다 . 이 답변은 정수에만 좋습니다.
jpmc26

9
@tripplet, OP!와 같은 오류가 발생했습니다1 <= r <= 4
John La Rooy

8
(1.) 나쁜 성능 (다른 사람들이 지적 했듯이이 구문 은 좋아 보이지만 O (n) 연산 대 if a <= x <= b... 이기 때문에 실행하는 데 시간이 오래 걸릴 수 있습니다 ...) (2.)는 float유형 (3)에서 작동하지 않습니다 .) 범위 테스트는 포함되지 않습니다 ... 그래서 많은 개발자들이 포함 범위를 기대하기 때문에 버그를 도입 할 수 있습니다
Trevor Boyd Smith

52

운영자가 잘못되었습니다. 이어야 if number >= 10000 and number <= 30000:합니다. 또한 파이썬에는 이런 종류의 줄임말이 if 10000 <= number <= 30000:있습니다.


3
... 이런 종류의 것을 일반적으로 연쇄 비교 라고 합니다.
Wolf

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")

파이썬은 당신 이 말로 의미하는 것을 수있게합니다.

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, 당신은 절대적으로 틀 렸습니다. xrangePython2 또는 rangePython3에서는 멤버쉽 테스트가 있습니다. 당신이 믿지 않으면 직접 시도하십시오. <=범위 객체를 만들지 않기 때문에 더 효율적입니다. O (1)과 같은 두 가지 방법. 요점은 OP 당신의 길을하려고했고 버그로 끝났다는 것입니다 . 잘못된 빠른 코드가 더 나쁩니다.
John La Rooy

2
i5에서, (i) python 3.5 : % timeit 5 in range (10000, 30000) 1000 루프, 루프 당 3 : 451 µs 최고. % timeit 10000 <= 5 <= 30000 10000000 루프, 루프 당 3 : 59.4ns 중 최고. 그 7000 배의
tback

1
@tback, 7000 배 더 느릴 가능성이 있다면 제안하지 않았을 것입니다. 아마도 테스트를 다시 시도해 볼 수 있습니다.
John La Rooy

8

숫자 사이의 범위를 정의하십시오.

r = range(1,10)

그런 다음 사용하십시오.

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

3
range귀하의 경우 마지막 값 10 을 계산하지 않습니다 . range(1,11)당신이 1과 10 사이에 비교해야하는 경우, 올
benabdessamad ikbel

6

세 정수를 비교하고 bac 사이에 있는지 확인하는 두 가지 방법 이 있습니다 .

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

또한 이전에 제안한대로 range를 사용할 수 있지만 훨씬 느립니다.


0

이 가정 3 음이 아닌 정수는 다음과 같습니다 a, b그리고 c. 우리가 있는지 확인하려면 수학적으로 말하면 c사이 ab, 포괄적으로, 하나는이 공식을 사용할 수 있습니다 :

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

또는 파이썬에서 :

> 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 사이
Richard Ardelean

내가 실수 한 것에 대해 죄송합니다. 내 답변 @RichardArdelean을 편집했습니다.
아나스타샤-로마 노바 秀

0

숫자가 10,000과 30,000 사이 인 경우에만 주어진 명령문을 출력하기를 원합니다.

코드는되어야합니다.

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

3
이 답변은 이미 제안되었습니다. 당신의 대답은 질문에 무엇을 추가합니까?
Jaideep Shekhar

0

조건은

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

사용하는 이유 number == 10000는 숫자 값이 50000이고 number >= 10000조건을 사용 하면 조건이 통과 하기 때문에 원하는 것이 아닙니다.


예를 들어 10001에서는 실패합니다. 그는 10000에서 30000 사이의 숫자를 원합니다. 조건은 숫자 == 10000에 대해서만 작동합니다.
guerreiro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.