How do I check whether an int is between the two numbers?
我用的是2.3空闲,而且我有问题。
我需要检查一个数字是否在另外两个数字之间,10000到30000:
1 2
| if number >= 10000 and number >= 30000:
print ("you have to pay 5% taxes") |
它工作得不太好。
- 检查布尔运算符,如果大于30000,则数字当然大于10000。看看这些小细节,你会发现更多的错误。
- 比较可以链接docs.python.org/2/reference/expressions.html比较
- 请将>=30000更改为<=30000
1 2
| if 10000 <= number <= 30000:
pass |
- Python真漂亮:)。而且是多余的:这被称为"间隔比较"。
- 如其他解决方案所建议的那样,这个和if number in range(10000, 30001)之间的速度差是多少?另外,使用set而不是range时,速度是快还是慢?
- @MIKEC与间隔比较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/schools/completityython.txt。
- @Mikec试着在你的壳里跑:> python -m timeit '10000 <= 10 <= 30000'> python -m timeit '10 in range(10000, 30001)'> python -m timeit '10 in set(range(10000, 30001))'。
- @Sungwoncho,如果你在python2上测试,一定要使用xrange而不是range
- 在python3.5.2中,范围比if语句慢约10倍,范围检查值的速度不变……因此很可能是由于函数开销造成的差异。
- 嗯,SQL和COBOL也有这个功能
- 令人印象深刻的。我和python一起工作了一两年,但我都不知道。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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 |
- 哇,我一直以为EDOCX1(或python2中的xrange)会返回一个生成器,所以你不能重复测试它。
- 如果测试范围很大(如range(1000000000)),那么在python2中使用xrange相当慢。但是,Python3号中的range并没有受到这个问题的影响。
- @yegle range(在python3中)不返回迭代器,它返回range对象。范围对象可以多次迭代。
- 必须记住,4 in range(1,4)是假的。所以最好使用1 >= r <= 4,因为它可以避免新来者可能出现的错误。
- 1.5 in r给了False,即使是在3.4中。这个答案只对整数有效。
- @JPMC26,说得对。另一方面,您可以指定步骤大小,因此range(1, n, 2)允许您测试奇数。
- @特里普莱,你犯了和手术一样的错误!,应该是1 <= r <= 4。
- timeit i=100; i in xrange(1000) 1000000 loops, best of 3: 1.17 µs per loop In [16]: timeit i=100; 1 <=i<=1000 10000000 loops, best of 3: 39.2 ns per loop 加上I越大,工作时间越长。
- (1.)糟糕的性能(正如其他人指出的那样,这种语法看起来不错,但执行起来可能需要很长时间,因为它是O(N)操作,而不是if a <= x <= b类型(2.)不适用于float类型(3.)范围测试不包括…如此多的开发人员可能会引入bug,因为他们期望包含的范围
- 不一定。stackoverflow.com/q/30081275/3878168
你的接线员不正确。应该是if number >= 10000 and number <= 30000:。另外,python有一个这种东西的缩写,if 10000 <= number <= 30000:。
- @Twosnac注意到我是如何在收到答案的同一分钟内发布这个消息的?5年前呢?
你的代码段,
1 2
| if number >= 10000 and number >= 30000:
print ("you have to pay 5% taxes") |
实际检查数字是否大于10000和30000。
假设要检查数字是否在10000-30000范围内,可以使用python间隔比较:
1 2
| if 10000 <= number <= 30000:
print ("you have to pay 5% taxes") |
这个python特性在python文档中有进一步的描述。
1 2
| if number >= 10000 and number <= 30000:
print ("you have to pay 5% taxes") |
比较的问题在于,当您将>=放在应该有<=的地方时,它们可能很难调试。
1 2 3
| # v---------- should be <
if number >= 10000 and number >= 30000:
print ("you have to pay 5% taxes") |
python让你用文字来表达你的意思
1
| if number in xrange(10000, 30001): # ok you have to remember 30000 + 1 here :) |
在python3中,需要使用range而不是xrange。
编辑:人们似乎更关心微生物标记以及链接操作有多酷。我的答案是关于防御性(减少bug的攻击面)编程。
由于评论中的声明,我在这里添加了python3.5.2的微基准。
1 2 3 4
| $ 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 |
如果您担心性能,可以计算一次范围
1 2
| $ python3.5 -m timeit -s"R=range(10000, 30000)""5 in R"
10000000 loops, best of 3: 0.0551 usec per loop |
- 不幸的是,xrange在python 3中已被弃用。
- @Apraetor,是的,在python3中使用range(10000, 30001)。它不会创建列表
- 您的解决方案将迭代超过20000个整数。使用<=和<=更有效。
- @JbChouinard,你绝对是错的。python2中的xrange或python3中的range进行成员资格测试。如果你不相信,你自己试试看。<=只是更有效,因为它不创建范围对象。两种方式均为O(1)。关键是操作人员试图按你的方式来做,结果出现了一个错误。错误的快速代码更糟。
- 在i5上,(i)python 3.5%:timeit 5,范围(10000,30000)1000个循环,每个循环最好是3:451&181;s。%timeit 10000<=5<=30000 10000000个循环,每个循环最好3:59.4 ns。超过7000倍
- @tback,如果有可能它慢了7000倍,我不会建议它。也许您可以尝试再次运行测试。
定义数字之间的范围:
然后使用它:
1 2
| if num in r:
print("All right!") |
- 在您的案例中,range不计算最后一个值10。如果需要比较1和10,那么range(1,11)是正确的。