【问题标题】:For Loop Not Breaking (Python)For循环不中断(Python)
【发布时间】:2014-06-18 00:25:02
【问题描述】:

我正在用 Python 编写一个简单的 For 循环。有没有办法在不使用“break”命令的情况下打破循环。我认为通过设置 count = 10 可以满足退出条件并且循环将停止。但情况似乎并非如此。

注意:部分挑战是使用 FOR 循环,而不是 WHILE 循环。

import random

guess_number = 0 
count = 0
rand_number = 0

rand_number = random.randint(0, 10)

print("The guessed number is", rand_number)    

for count in range(0, 5):
    guess_number = int(input("Enter any number between 0 - 10: "))
    if guess_number == rand_number:
        print("You guessed it!")
        count = 10
    else:
        print("Try again...")
        count += 1

我是编程新手,所以刚刚开始涉足。我可以使用“中断”,但我试图弄清楚为什么当您正确输入猜测的数字时循环没有结束。

【问题讨论】:

  • 没有结束因为你不使用break ;-)
  • 在 Python 中跳出循环的正确方法是使用break。 Pythonic 风格通常不鼓励而不是庆祝模糊的解决方法。

标签: python for-loop


【解决方案1】:

这里的for 循环与您在Java 和C 等其他编程语言中看到的不太一样。range(0,5) 生成一个列表,for 循环遍历它。在循环的每次迭代中都不会检查任何条件。因此,您可以根据自己的意愿重新分配循环变量,但在下一次迭代中,它将简单地设置为列表中接下来出现的任何值。

无论如何,这确实没有意义,因为您可以遍历任意列表。如果您的列表不是range(0,5),而是[1, 3, -77, 'Word', 12, 'Hello'],会怎样?没有办法以对打破循环有意义的方式重新分配变量。

我能想到三种合理的方法来打破循环:

  1. 使用break 语句。这样可以使您的代码保持干净且易于理解
  2. 在 try-except 块中包围循环并引发异常。这不适合您在此处显示的示例,但它是一种可以打破一个(或多个!)for 循环的方法。
  3. 将代码放入函数中,并使用return 语句进行突围。这还可以让您跳出多个for 循环。

另一种可以打破循环的方法(至少在 Python 2.7 中)是使用现有列表,然后在迭代期间对其进行修改。 请注意,这是一种非常糟糕的方法,但它确实有效。我不确定这个示例是否适用于 Python 3.x,但它适用于 Python 2.7:

iterlist = [1,2,3,4]
for i in iterlist:
    doSomething(i)
    if i == 2:
        iterlist[:] = []

如果你有doSomething打印出i,它只会打印出1和2,然后退出循环而没有错误。同样,这是一种不好的做法

【讨论】:

  • (言外之意:给循环内的count变量赋值是没有意义的。)
  • 那么我可以改变一些类似这样的东西并让它早点中断:for count in range(0, 5, count2) 然后如果数字匹配,则分配 count2 = 10?
  • 没有。为 count2 分配一个新值不会更改 range(0,5,count2) 创建的生成器所持有的任何值。
【解决方案2】:

你可以使用while:

times = 5
guessed = False
while times and not guessed:
    guess_number = int(input("Enter any number between 0 - 10: "))
    if guess_number == rand_number:
        print("You guessed it!")
        guessed = True
    else:
        print("Try again...")
            times -= 1

【讨论】:

  • 对不起,我应该提到挑战的一部分是继续使用 for 循环。 while 循环确实有效。我确实测试过。
  • 在 Python 中跳出循环的正确方法是使用breakPythonic style 通常不鼓励而不是庆祝模糊的解决方法。这不是 Perl :-P。
【解决方案3】:

Python 中的 For 循环是这样工作的。

您有一个可迭代对象(例如 listtuple),然后查看可迭代对象中的每个元素,将当前值存储在指定变量中

这就是为什么

for i in [0, 1, 2, 3]:
    print item

for j in range(4):
    print alist[j]

工作完全一样。 ij 是您的存储变量,而 [0, 1, 2, 3]range(4) 是您各自的可迭代对象。 range(4) 返回列表 [0, 1, 2, 3] 使其与第一个示例相同。

在您的示例中,您尝试将存储变量 count 分配给某个新数字(这在某些语言中可以使用)。然而,在 python 中,count 将被重新分配给range 中的下一个变量并继续。如果你想跳出一个循环

  1. 使用break。这是最pythonic的方式
  2. 在中间创建一个函数和 return 一个值(我不确定这是否是您想要对您的特定程序执行的操作)
  3. 使用try/except 阻止并引发Exception,尽管这不合适

附带说明一下,如果您总是/经常会提前退出列表,您可能需要考虑使用 xrange()

xrange() 相对于 range() 的优势是微乎其微的……除非…… 从不使用范围的所有元素(例如当循环 通常以 break 结束)

正如下面的 cmets 所指出的,xrange 仅适用于 python 2.x。在 python 3 中,所有ranges 的功能都类似于xrange

【讨论】:

  • 注意xrange只适用于Python 2。在Python 3中,没有xrange
【解决方案4】:

在 Python 中,for 循环意味着“为每个项目执行此操作”。要提前结束此循环,您需要使用 break。 while 循环对谓词值起作用。当您想做某事直到您的测试为假时,请使用它们。例如:

tries = 0
max_count = 5
guessed = False

while not guessed and tries < max_count:
    guess_number = int(input("Enter any number between 0 - 10: "))
    if guess_number == rand_number:
        print("You guessed it!")
        guessed = True
    else:
        print("Try again...")
    tries += 1

【讨论】:

    【解决方案5】:

    @Rob Watts 所说的:Python for 循环不像 Java 或 C for 循环那样工作。更明确一点...

    C 的“等价物”是:

    for (count=0; count<5; count++) {
       /* do stuff */
       if (want_to_exit)
         count=10;
    }
    

    ...这会起作用,因为在循环的每次迭代开始之前都会检查 count 的值 (count&lt;5)。

    在 Python 中,range(5) 创建一个列表 [0, 1, 2, 3, 4],然后使用 for 迭代该列表的元素,将它们一一复制到 count 变量中,并将它们传递给循环体。如果您修改主体中的循环变量,Python for 循环不会“关心”。

    因此,Python 的 for 循环实际上比 C 的 for 循环灵活得多。

    【讨论】:

      【解决方案6】:

      您可能想要的是使用 break 并避免分配给 count 变量。

      请看以下内容,我用一些 cmets 对其进行了编辑:

      import random
      
      guess_number = 0 
      count = 0
      rand_number = 0
      
      rand_number = random.randint(0, 10)
      
      print("The guessed number is", rand_number)    
      
      # for count in range(0, 5): instead of count, use a throwaway name
      for _ in range(0, 5): # in Python 2, xrange is the range style iterator
          guess_number = int(input("Enter any number between 0 - 10: "))
          if guess_number == rand_number:
              print("You guessed it!")
              # count = 10 # instead of this, you want to break
              break
          else:
              print("Try again...")
              # count += 1 also not needed
      

      【讨论】:

        【解决方案7】:

        正如其他人所说,Python for 循环更像是 traditional foreach loop,因为它在不检查条件的情况下迭代项目集合。只要集合中有某些东西,Python 就会接受它们,并且如果您重新分配循环变量,循环将不会知道或关心。

        对于您正在做的事情,请考虑使用for ... break ... else 语法,因为它更“Pythonic”:

        for count in range(0, 5):
            guess_number = int(input("Enter any number between 0 - 10: "))
            if guess_number == rand_number:
                print("You guessed it!")
                break
            else:
                print("Try again...")
        else:
            print "You didn't get it."
        

        【讨论】:

          【解决方案8】:

          正如您的问题所述注意:部分挑战是使用 FOR 循环,而不是 WHILE 循环并且您不想使用 break,您可以将其放入函数中并在猜到正确数字时返回以打破循环。

          import random
          
          
          def main():
              guess_number = 0
              count = 0
              rand_number = 0
          
              rand_number = random.randint(0, 10)
          
              print("The guessed number is", rand_number)
          
              for count in range(0, 5):
                  guess_number = int(input("Enter any number between 0 - 10: "))
                  if guess_number == rand_number:
                      print ("You guessed it!")
                      return
                  else:
                      print("Try again...")
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-03-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多