주어진 정수가 다른 두 정수 사이에 있는지 어떻게 알 수 있습니까 (예 :보다 크거나 같고 10000
보다 작거나 같습니다 30000
)?
2.3 IDLE을 사용하고 있으며 지금까지 시도한 것이 작동하지 않습니다.
if number >= 10000 and number >= 30000:
print ("you have to pay 5% taxes")
주어진 정수가 다른 두 정수 사이에 있는지 어떻게 알 수 있습니까 (예 :보다 크거나 같고 10000
보다 작거나 같습니다 30000
)?
2.3 IDLE을 사용하고 있으며 지금까지 시도한 것이 작동하지 않습니다.
if number >= 10000 and number >= 30000:
print ("you have to pay 5% taxes")
답변:
if 10000 <= number <= 30000:
pass
if number in range(10000, 30001)
다른 솔루션에서 제안한 속도 차이는 무엇입니까 ? 또한 set
대신에 사용할 때 더 빠르거나 느립 range
니까?
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을
> python -m timeit '10000 <= 10 <= 30000'
> python -m timeit '10 in range(10000, 30001)'
> python -m timeit '10 in set(range(10000, 30001))'
>>> 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
range
(또는 xrange
python2에서) 생성기를 반환하므로 반복적으로 테스트 할 수 없다고 생각했습니다.
4 in range(1,4)
False 라는 점을 명심해야합니다 . 1 >= r <= 4
초보자가 발생할 수있는 오류를 피할 수
1.5 in r
False
심지어 3.4 에서조차 준다 . 이 답변은 정수에만 좋습니다.
1 <= r <= 4
if a <= x <= b
... 이기 때문에 실행하는 데 시간이 오래 걸릴 수 있습니다 ...) (2.)는 float
유형 (3)에서 작동하지 않습니다 .) 범위 테스트는 포함되지 않습니다 ... 그래서 많은 개발자들이 포함 범위를 기대하기 때문에 버그를 도입 할 수 있습니다
코드 스 니펫
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 설명서에 자세히 설명 되어 있습니다 .
비교의 문제는 당신 >=
이 있어야 할 곳에 넣을 때 디버깅하기가 어렵다는 것입니다.<=
# 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
range(10000, 30001)
. Python3에서 사용 하십시오. 그것은 목록을 만들지 않습니다
xrange
Python2 또는 range
Python3에서는 멤버쉽 테스트가 있습니다. 당신이 믿지 않으면 직접 시도하십시오. <=
범위 객체를 만들지 않기 때문에 더 효율적입니다. O (1)과 같은 두 가지 방법. 요점은 OP 가 당신의 길을하려고했고 버그로 끝났다는 것입니다 . 잘못된 빠른 코드가 더 나쁩니다.
숫자 사이의 범위를 정의하십시오.
r = range(1,10)
그런 다음 사용하십시오.
if num in r:
print("All right!")
range
귀하의 경우 마지막 값 10 을 계산하지 않습니다 . range(1,11)
당신이 1과 10 사이에 비교해야하는 경우, 올
세 정수를 비교하고 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
또한 이전에 제안한대로 range를 사용할 수 있지만 훨씬 느립니다.
이 가정 3 음이 아닌 정수는 다음과 같습니다 a
, b
그리고 c
. 우리가 있는지 확인하려면 수학적으로 말하면 c
사이 a
와 b
, 포괄적으로, 하나는이 공식을 사용할 수 있습니다 :
(c-a) * (b-c)> = 0
또는 파이썬에서 :
> print((c - a) * (b - c) >= 0)
True
숫자가 10,000과 30,000 사이 인 경우에만 주어진 명령문을 출력하기를 원합니다.
코드는되어야합니다.
if number >= 10000 and number <= 30000:
print("you have to pay 5% taxes")