使用多个类似的"while"语句缩短代码

4

可能是非常基础的问题,但是我正在编写我的第一个程序,不知道要搜索什么来找到答案。

我有一个类似于以下代码的 while 语句:

while number > 9999 or number < 0 or number == 1111 or number == 2222 or number == 3333...

一直执行到9999。有很多代码可能可以缩短,我说的对吗?不确定在哪里能够阅读有关此语法的信息,希望有人能够提供相关链接!

如果有人能够帮助我就太好了!:)

2个回答

9

使用取模运算符:modulo

while number > 9999 or number < 0 or (number % 1111 == 0 and number != 0):

3
对于 number = 0 的情况,原文存在问题。按照你的逻辑会返回 True,但是问题中的逻辑应该返回 False。请修改。 - root
谢谢!我尝试在文档中查找取模运算符,但我不太理解它的工作原理以及为什么要在这种情况下使用它。能否解释一下? - David Hasselberg
@root 我认为现在它应该符合问题的逻辑了,对吧? - Mohammed Aouf Zouag
1
@DavidHasselberg 请查看此链接:http://www.tutorialspoint.com/python/python_basic_operators.htm 一般来说,模运算符将第一个操作数除以第二个操作数,并返回除法的余数。在这种情况下,number % 1111 == 0 意味着 number 可以被 1111 整除,也就是说,number 可以是 111122223333 等等。 - Mohammed Aouf Zouag

3
你可以将前两个语句合并。
number > 9999 or number < 0

通过使用集合理论将它们合并成一个。
number not in range(0,9999)

剩下的部分可以通过简单的模运算来检查:
not number % 1111

每次在number上调用上述操作时,它都将返回0或非零值。例如,1%3 = 1(我们将较小的数字除以较大的数字,因此只得到较小的数字作为结果),4%2 = 0(因为4/2 = 2*2,所以没有余数留下,因此末尾是0)等。
在Python中,True1相同,False0相同。我们希望循环继续进行,直到number具有可以被1111整除而不产生任何余数的值,因此我们必须否定该语句。让我们看一个示例,了解其工作原理:
假设number = 53。在这种情况下,由于模参数1111,我们有number/1111 = 53/1111 = 53。这意味着我们得到True(因为True == 53 != 0 == False),并且在使用not运算符否定它后,我们得到False(因为not True始终为False,反之亦然)。当其语句变为True时,while循环停止。
由于我们想要检查是否有一个是True,因此我们可以执行以下操作:
while (number not in range(0,9999)) or (not number % 1111):
  # do something

如果你想从范围中排除0,可以简单地使用not in range(1,9999)

2
[0, 9999] 是一个包含两个元素的列表,而不是介于0和9999之间的整数范围。请使用 range(0,1000)(或在Python2中使用 xrange(0,1000))。 - chepner
谢谢!我本来想把这个数学公式写成普通文本的,但后来决定将其包含在代码中,然后忘记相应地更改它。我已经更新了我的答案。 - rbaleksandar

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