如何确定给定的整数是否在其他两个整数之间(例如,大于/等于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")
Answers:
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)
很重要,这是错误的。最好使用,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")
比较的麻烦在于,当您将一个>=
应该放置在<=
# 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
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
或在Python中:
> print((c - a) * (b - c) >= 0)
True
仅当数字介于10,000和30,000之间时,您才希望输出打印给定语句。
代码应该是;
if number >= 10000 and number <= 30000:
print("you have to pay 5% taxes")