Python while循环混乱
为什么这个while循环会执行try套件,即使输入是0。。。? 我想根据文件,应该马上休息Python while循环混乱,python,python-3.x,Python,Python 3.x,为什么这个while循环会执行try套件,即使输入是0。。。? 我想根据文件,应该马上休息 level = 1 while level != 0: level = int(input("Enter level (1, 2, 3)\n")) % 4 try: g = ply.level_high(level) print("Player with highest level", level, "s
level = 1
while level != 0:
level = int(input("Enter level (1, 2, 3)\n")) % 4
try:
g = ply.level_high(level)
print("Player with highest level", level, "score is", g[0][0], "with", g[0][level])
except:
print("Invalid level")
在while循环开始后,您将收到输入。因此,即使输入为0,循环的其余部分也将执行。在每次迭代开始时检查while循环的条件。因此,发生的情况是,只有在检查该级别后,该级别才会变为0,并且不会立即退出。 事件顺序:
level is set to 1
while loop entered
start of first iteration: exit if level is not 0
set level to (0 in this case)
do your try-except
您可以看到,当while条件被选中时,level不是0,因此第一次迭代仍然执行
解决此问题的一个好方法显示在
在这种情况下,您可以这样做
level = 1
while True: #exiting of the loop is handled with the break
level = int(input("Enter level (1, 2, 3)\n")) % 4
if level==0: #the loop condition is inverted and moved here
break
try:
g = ply.level_high(level)
print("Player with highest level", level, "score is", g[0][0], "with", g[0][level])
except:
print("Invalid level")
如果仅当用户未输入0时才执行try块,则需要在while循环外执行try块: 级别=1
while level != 0:
level = int(input("Enter level (1, 2, 3)\n")) % 4
if level == 0:
print("Invalid level")
try:
g = ply.level_high(level)
print("Player with highest level", level, "score is", g[0][0], "with", g[0][level])
except:
print('An Error Occurred')
虽然有一个裸体例外不是一个好的做法-你真的需要能够准确地确定你感兴趣的例外情况。!!!谢谢你们!帮了大忙
level = 1
while True:
try:
level = int(input("Enter level (1, 2, 3)\n"))
if level == 0:
break
g = ply.level_high(level)
print("Player with highest level", level, "score is", g[0][0], "with", g[0][level])
except ValueError:
print("Invalid value")
except IndexError:
print("Invalid level")
请格式化您的代码。您可以通过将所有内容缩进4个空格或通过标记代码并按下编辑器中的{}按钮来格式化它。因此,我需要将输入放在循环的末尾?@Rob在循环开始之前捕获输入,如果您不希望它执行一次的话。如果你想继续捕获输入,也可以在循环中捕获它。我想继续捕获输入。我把输入放在循环的末尾,这真的让我无法理解逻辑,但它是有效的。@Rob如果这样做,循环仍然会执行一次,因为级别的值最初是1,看起来有点多余,当while循环已经在执行时,检查级别两次是否为0???必须有一种更有效的方法来捕获0输入值…我尝试了Exception ValueError:然后输入了一个字符串值,它仍然崩溃了…?是的-如果输入一个字符串,那么“int”调用将失败并生成一个值错误-通常,您会在另一次尝试中包装它/除了在循环中检查零以生成“无效级别”错误我确实想到了这一点,但我讨厌这种技术,因为如果这是处理器密集型的,那么将进行两次检查,其中应该只有一次。有一个重复的条件退出循环,感觉真的很笨拙。我只是觉得如果我构造得更好,它会自然退出,也就是说,使用它自己的结构条件。@Rob实际上,在==0位的级别上只会进行一次检查。while True直接优化为跳转。因为您使用的是Python3,所以它的速度与执行一次检查一样快。它还提到了PythonWiki链接,我看到了。我不认为它明确表示只进行了一次检查。但我想它可以这样理解,因为它只提到从内部套房的条件爆发。而真正的被优化为相对跳跃是非常好的了解。谢谢你。