Python中如何检查一个数字是否不在某个范围内

6
我现在有一些Python代码,它做的事情类似于这样:
if plug in range(1, 5):
    print "The number spider has disappeared down the plughole"

但是我实际上想检查数字是否不在范围内。我已经搜索并查看了Python文档,但我找不到任何信息。我该怎么做?

附加数据:运行这段代码时:

if not plug in range(1, 5):
    print "The number spider has disappeared down the plughole"

我收到以下错误信息:
Traceback (most recent call last):
    File "python", line 33, in <module>
IndexError: list assignment index out of range

我也尝试过:

if plug not in range(1,5):
     print "The number spider has disappeared down the plughole"

它返回了相同的错误。


8
这句话的意思是“不在1到5的范围之内”。 - vaultah
另外,请确保 plug 是整数类型,否则检查将无法正常工作。 - karthikr
在范围(-1000,1)内还是在范围(5,10000)内?(开玩笑) - en_Knight
2
“not” 的优先级比 “in” 低,因此 plug not in range(1,5) 可以正常工作。 - Wayne Werner
第33行是什么?您给出了一个IndexError,但这并没有帮助我们。它似乎是您代码的另一部分。在您的额外代码中没有进行列表赋值。您应该提供可运行和能够重现问题的代码,而这现在不是这种情况。 - jusx
显示剩余2条评论
5个回答

35

如果您的范围的step为1,那么使用以下代码可以提高性能:

if not 1 <= plug < 5:

与使用其他人建议的not方法相比,这种方法更容易:

if plug not in range(1, 5)

证明:

>>> import timeit
>>> timeit.timeit('1 <= plug < 5', setup='plug=3')  # plug in range
0.053391717400628654
>>> timeit.timeit('1 <= plug < 5', setup='plug=12')  # plug not in range
0.05137874743129345
>>> timeit.timeit('plug not in r', setup='plug=3; r=range(1, 5)')  # plug in range
0.11037584743321105
>>> timeit.timeit('plug not in r', setup='plug=12; r=range(1, 5)')  # plug not in range
0.05579263413291358

而这还没有考虑到创建 range 所花费的时间。


性能方面总是更快吗?还是有其他可能影响事情的相关因素? - Peter David Carter
1
@PeterDavidCarter 我不能保证什么,但就我所知,这种方法总是更快的。也许如果你正在处理多个变量以确保它们都在范围之外... 一般来说,range()应该用于需要使用范围内所有数字的情况。在这种情况下,您只需要起始点和结束点。 - Markus Meskanen
我有点好奇,是否可能实际查看JavaScript编译器代码以了解为什么它更快?我相信你是对的,只是我想学习更多。所有的JavaScript库我可能只会在Github上找到,但JS本身...我很想从更低的层次开始看东西... - Peter David Carter
@PeterDavidCarter JavaScript?你是说Python吗?你可以使用dis.dis()来查看函数的反汇编。 - Markus Meskanen
为什么会添加 range,如果它的性能不同?对于小数点数字,它是否实际上更高效?如果不是,为什么不总是使用 < 和 >?如果这是真的,为什么 range 不只是 < 和 > 的简写?读到这个我有些 JS PTSD 闪回。 - Bojidar Stanchev
显示剩余2条评论

5
这似乎也可以运作:
if not 2 < 3 < 4:
    print('3 is not between 2 and 4') # which it is, and you will not see this

if not 2 < 10 < 4:
    print('10 is not between 2 and 4')

对于原始问题的确切答案应该是 if not 1 <= 插头 < 5:, 我想。


1
使用:
if plug not in range(1,5):
     print "The number spider has disappeared down the plughole"

每当变量plug超出1到5的范围时,它将打印给定的行。

0
if (int(5.5) not in range(int(3.0), int(6.9))):
    print('False')
else:
    print('True')

该值应强制转换为整数,否则不在范围内会给出奇怪的结果。


-1
if not plug in range(1,5):
     #bla

我正在做“插头不在范围内()”。但是这种方式似乎也不起作用。嗯嗯嗯... - Peter David Carter
@PeterDavidCarter is 是用于检查身份的。虽然 Python 大多数时候看起来像英语,但它实际上并不是英语 ;) - Wayne Werner
为什么它不工作?这非常基础,应该可以工作。你确定那个插头是一个整数吗? - jusx
我不知道。我发布了它给出的错误。我对上面的答案进行了负评,因为它只是代码而且没有起作用,但如果答案被编辑过,我可能会撤销负评,因为现在看起来可能有点不公平...? - Peter David Carter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接