我如何确定一个给定的整数是否在另外两个整数之间(例如大于/等于10000和小于/等于30000)?
到目前为止,我的尝试并没有奏效:
if number >= 10000 and number >= 30000:
print ("you have to pay 5% taxes")
我如何确定一个给定的整数是否在另外两个整数之间(例如大于/等于10000和小于/等于30000)?
到目前为止,我的尝试并没有奏效:
if number >= 10000 and number >= 30000:
print ("you have to pay 5% taxes")
当前回答
假设有3个非负整数:a、b和c。从数学上讲,如果我们想确定c是否在a和b之间,可以使用以下公式:
(c - a) * (b - c) >= 0
或者在Python中:
> print((c - a) * (b - c) >= 0)
True
其他回答
if number >= 10000 and number <= 30000:
print ("you have to pay 5% taxes")
有两种方法比较三个整数并检查b是否在a和c之间:
if a < b < c:
pass
and
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,正如之前建议的那样,但是它要慢得多。
if 10000 <= number <= 30000:
pass
详情请参见文档。
我添加了一个没有人提到的解决方案,使用symphony库中的Interval类:
from sympy import Interval
lower_value, higher_value = 10000, 30000
number = 20000
# to decide whether your interval shhould be open or closed use left_open and right_open
interval = Interval(lower_value, higher_value, left_open=False, right_open=False)
if interval.contains(number):
print("you have to pay 5% taxes")
比较的问题是,当您在应该是<=的地方放置了>=时,它们可能很难调试
# 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