如何检查int是否在两个数字之间?

Ave*_*kid 317 python

我正在使用2.3 IDLE而且我遇到了问题.

我需要检查一个数字是否介于两个其他数字10000和30000之间:

if number >= 10000 and number >= 30000:
    print ("you have to pay 5% taxes")
Run Code Online (Sandbox Code Playgroud)

它运作得不好.

Pao*_*tti 884

if 10000 <= number <= 30000:
    pass
Run Code Online (Sandbox Code Playgroud)

  • Python太棒了:).并且是多余的:这被称为"区间比较". (178认同)
  • @MikeC使用区间比较`number`首先与`10000`进行比较.如果它小于"10000",则表达式立即被短路并且不检查第二次比较.复杂性是"O(1)".`in range(0,n)`而是生成整个数字序列,然后遍历它.复杂性是"O(n)".`in((((((((((((( 〜Pattis的/ ICS-33 /讲座/ complexitypython.txt (12认同)
  • @MikeC尝试在你的shell中运行:`> python -m timeit'10000 <= 10 <= 30000'``> python -m timeit '10 in range(10000,30001)'``> python -m timeit '10在集合(范围(10000,30001))'` (5认同)
  • 看起来像在python3.5.2中一样,范围比if语句慢约10倍,并且范围检查值的速度是恒定的……这很可能是由于函数开销引起的差异。 (2认同)

Boh*_*dan 65

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • `r in`给出'False`,即使在3.4.这个答案只适用于整数. (44认同)
  • 重要的是要记住`4 in range(1,4)`是假的.所以最好使用`1> = r <= 4`,因为它避免了新手可能出现的错误 (19认同)
  • @tripplet,你犯了与OP相同的错误!它应该是`1 <= r <= 4` (8认同)
  • (1)糟糕的性能(正如其他人指出的那样,这种语法**看起来很好**但是执行起来需要很长时间,因为它是O(n)操作vs`if a <= x <= b` .. .)(2.)不适用于`float`类型(3.)范围测试不包含......所以许多开发人员可能会引入错误,因为他们期望包含范围 (8认同)
  • 哇我一直认为`range`(或python2中的`xrange`)返回一个生成器,因此你不能重复测试它. (4认同)

Sil*_*Ray 46

您的操作员不正确.应该if number >= 10000 and number <= 30000:.另外,Python有这种东西的简写,if 10000 <= number <= 30000:.

  • ... *这种事情*通常称为[*链式比较*](https://docs.python.org/3/reference/expressions.html#comparisons)。 (5认同)

Car*_*rot 26

你的代码片段,

if number >= 10000 and number >= 30000:
    print ("you have to pay 5% taxes")
Run Code Online (Sandbox Code Playgroud)

实际检查数字是否大于10000和30000.

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

if 10000 <= number <= 30000:
    print ("you have to pay 5% taxes")
Run Code Online (Sandbox Code Playgroud)

Python文档中进一步描述此Python功能.


小智 15

两种方法可以比较三个整数并检查b是否在ac之间:

if a < b < c:
    pass
Run Code Online (Sandbox Code Playgroud)

if a < b and b < c:
    pass
Run Code Online (Sandbox Code Playgroud)

第一个看起来更具可读性,但第二个运行得更快

让我们使用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
>>>
Run Code Online (Sandbox Code Playgroud)

并使用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
Run Code Online (Sandbox Code Playgroud)

此外,您可以使用range,如前所述,但它要慢得多。


小智 13

以下是几种可能的方法,按性能从最好到最差的顺序排列(即第一个性能最好)

     # Old school check
     if 10000 <= b and b <=30000:
        print ("you have to pay 5% taxes")
     # Python range check
     if 10000 <= number <= 30000:
        print ("you have to pay 5% taxes")
     # As suggested by others but only works for integers and is slow
     if number in range(10000,30001):
        print ("you have to pay 5% taxes")
Run Code Online (Sandbox Code Playgroud)


San*_*nda 9

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


Lar*_*erg 9

虽然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!")
Run Code Online (Sandbox Code Playgroud)

请记住,第二个上限参数不包含在范围集中,可以通过以下方式验证:

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

但是,range()仅当该方法未在某些性能关键路径上运行时才更喜欢该方法。单个调用对于大多数要求来说仍然足够快,但如果运行 10,000,000 次,我们清楚地注意到与以下代码相比,性能慢了近 3 倍a <= x < b

> { 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
Run Code Online (Sandbox Code Playgroud)

  • 请注意,“10 &lt;= 10.5 &lt;= 20”为 True,而“10.5 in range(10, 21)”为 False;根据具体情况,这可能是也可能不是您想要的 (3认同)

Joh*_*ooy 8

比较的问题在于,当你放置>=应该有的地方时,它们很难调试<=

#                             v---------- should be <
if number >= 10000 and number >= 30000:
    print ("you have to pay 5% taxes")
Run Code Online (Sandbox Code Playgroud)

Python让你只需在文字中写下你的意思

if number in xrange(10000, 30001): # ok you have to remember 30000 + 1 here :)
Run Code Online (Sandbox Code Playgroud)

在Python3中,您需要使用range而不是xrange.

编辑:人们似乎更关心microbench标记和酷链操作.我的答案是关于防御性(针对错误的攻击面较少)编程.

作为评论中的主张,我在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
Run Code Online (Sandbox Code Playgroud)

如果您担心性能,可以计算一次范围

$ python3.5 -m timeit -s "R=range(10000, 30000)" "5 in R"
10000000 loops, best of 3: 0.0551 usec per loop
Run Code Online (Sandbox Code Playgroud)

  • @JBChouinard,您绝对不正确。Python2中的`xrange`或Python3中的`range`具有成员资格测试。如果您不相信,请自己尝试。“ &lt;=”只会更有效,因为它不会创建范围对象。两种方式都为O(1)。关键是OP _was_ **尝试按照自己的方式进行操作,并最终出现错误**。快速的错误代码会更糟。 (3认同)
  • 不幸的是,xrange在Python 3中已弃用。 (2认同)
  • 在i5上,(i)python 3.5:%timeit 5在range(10000,30000)1000个循环中,最好3:451 µs /循环。%timeit 10000 &lt;= 5 &lt;= 30000 10000000个循环,每个循环最好3:59.4 ns。那是超过7000的系数 (2认同)

小智 6

定义数字之间的范围:

r = range(1,10)
Run Code Online (Sandbox Code Playgroud)

然后使用它:

if num in r:
    print("All right!")
Run Code Online (Sandbox Code Playgroud)

  • 在您的情况下,`range`不计算最后一个值** 10 **。如果您需要在1和10之间进行比较,则range(1,11)是正确的 (3认同)

Ana*_*a 秀 6

假设有 3 个非负整数:ab、 和c。从数学上来说,如果我们想确定 是否c介于a和 之间b(包含 和 ),可以使用以下公式:

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

或者在Python中:

> print((c - a) * (b - c) >= 0)
True
Run Code Online (Sandbox Code Playgroud)

  • 这是执行此操作的最迟钝的方法,同时性能较差 (3认同)