Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python while循环混乱_Python_Python 3.x - Fatal编程技术网

Python while循环混乱

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

为什么这个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, "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链接,我看到了。我不认为它明确表示只进行了一次检查。但我想它可以这样理解,因为它只提到从内部套房的条件爆发。而真正的被优化为相对跳跃是非常好的了解。谢谢你。