判断一个整数是否在另外两个整数之间

我如何确定一个给定的整数是否在两个其他整数之间(例如大于/等于10000和小于/等于30000)?

到目前为止,我的尝试并没有奏效:

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

你的接线员不正确。它应该是if number >= 10000 and number <= 30000:。此外,Python对这类事情有一个简写:if 10000 <= number <= 30000:

if 10000 <= number <= 30000:
pass

具体操作请参见文档

你的代码片段,

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

实际上检查number是否大于10000和30000。

假设你想检查数字是否在10000 - 30000范围内,你可以使用Python的间隔比较:

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

这个Python特性将在在Python文档中中进一步描述。

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

比较的问题是,当您将>=放在应该是<=的地方时,它们可能很难调试

#                             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

定义数字之间的范围:

r = range(1,10)

然后使用它:

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

两种方式来比较三个整数,检查b是否在一个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
>>>

然后使用时间:

~$ 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

此外,您也可以使用范围,正如之前建议的那样,但是它要慢得多。

假设有3个非负整数:abc。从数学上讲,如果我们想确定c是否在ab之间,可以使用这个公式:

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

条件应该是,

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

使用number == 10000的原因是,如果number的值是50000,如果我们使用number >= 10000,条件将通过,这不是你想要的。

试试这个简单的函数;它检查A是否在BC之间(BC可能不是在正确的顺序):

def isBetween(A, B, C):
Mi = min(B, C)
Ma = max(B, C)
return Mi <= A <= Ma

所以isBetween(2, 10, -1)isBetween(2, -1, 10)是一样的。

你使用了>=30000,所以如果number是45000,它将进入循环,但我们需要它大于10000但小于30000。把它改成<=30000就可以了!

虽然10 <= number <= 20在Python中工作,但我发现使用range()的符号更易于阅读:

if number in range(10, 21):
print("number is between 10 (inclusive) and 21 (exclusive)")
else:
print("outside of range!")

请记住,第二个上限参数不包括在范围设置中,可以通过以下方法验证:

>>> list(range(10, 21))
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

但是,只有当它不在某些性能关键路径上运行时,才建议使用range()方法。对于大多数需求来说,单个调用仍然足够快,但是如果运行10,000,000次,我们清楚地注意到与a <= x < b相比,性能要慢近3倍:

> { time python3 -c "for i in range(10000000): x = 50 in range(1, 100)"; } 2>&1 | sed -n 's/^.*cpu \(.*\) total$/\1/p'
1.848


> { time python3 -c "for i in range(10000000): x = 1 <= 50 < 100"; } 2>&1 | sed -n 's/^.*cpu \(.*\) total$/\1/p'
0.630

下面是一些可能的方法,从最好到最差的表现(即第一个将表现最好)

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


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


if number in range(10000,30001):
print ("you have to pay 5% taxes")