Выход из цикла while в Python

в коде ниже, я хотел бы while цикл для выхода, как только a + b + c = 1000. Однако тестирование с помощью print заявления показывают, что он просто продолжается до for петли сделали. Я пытался while True а потом в if заявлением False но это приводит к бесконечному циклу. Я думал, используя x = 0 и потом x = 1 может работать, но это тоже просто работает до for петли закончить. Какой самый изящный и быстрый способ выйти? Спасибо.

a = 3
b = 4
c = 5
x = 0
while x != 1:
    for a in range(3,500):
        for b in range(a+1,500):
            c = (a**2 + b**2)**0.5
            if a + b + c == 1000:
                print a, b, c
                print a*b*c
                x = 1

6 ответов


на while loop будет соответствовать условию только тогда, когда элемент управления вернется к нему, i.e когда for циклы выполняются полностью. Так вот почему ваша программа не выходит сразу, даже если условие было выполнено.

но, в случае, если условие не было выполнено для любых значений a,b,c тогда ваш код окажется в бесконечном цикле.

вы должны использовать функцию здесь как return заявление сделает то, что вы просите для.

def func(a,b,c):
    for a in range(3,500):
        for b in range(a+1,500):
            c = (a**2 + b**2)**0.5
            if a + b + c == 1000:
                print a, b, c
                print a*b*c
                return # causes your function to exit, and return a value to caller

func(3,4,5)

помимо @Sukrit Калра это ответ, где он использовал флаги выхода, вы также можете использовать sys.exit() если ваша программа не имеет никакого кода после этого блока кода.

import sys
a = 3
b = 4
c = 5
for a in range(3,500):
    for b in range(a+1,500):
        c = (a**2 + b**2)**0.5
        if a + b + c == 1000:
            print a, b, c
            print a*b*c
            sys.exit()     #stops the script

помощь sys.exit:

>>> print sys.exit.__doc__
exit([status])

Exit the interpreter by raising SystemExit(status).
If the status is omitted or None, it defaults to zero (i.e., success).
If the status is numeric, it will be used as the system exit status.
If it is another kind of object, it will be printed and the system
exit status will be one (i.e., failure).

Если вы не хотите создавать функцию ( которую вы должны и ссылаться на ответ Эшвини в этом случае), вот альтернативная реализация.

>>> x = True
>>> for a in range(3,500):
        for b in range(a+1, 500):
            c = (a**2 + b**2)**0.5
            if a + b + c == 1000:
                 print a, b, c
                 print a*b*c
                 x = False
                 break
         if x == False:
            break
200 375 425.0
31875000.0

вы можете преобразовать внутренний код в функцию и использовать return для выхода:

def inner():
    for a in range(3,500):
        for b in range(a+1,500):
            c = (a**2 + b**2)**0.5
            if a + b + c == 1000:
                print a, b, c
                print a*b*c
                return False
    return True

while inner():
    pass

посмотреть этой вопрос.


проблема в том, что, хотя вы устанавливаете x=1, Когда a+b+c==1000, вы не выходите из двух для циклов, когда это условие выполнено, и поэтому цикл while не знает, что x==1, пока оба для циклов не закончатся. Чтобы избежать этой проблемы, вы можете добавить явные операторы break в циклы for (и, как указывает Сукрит Калра, цикл while становится ненужным).

a = 3
b = 4
c = 5
x = 0
for a in range(3,500):
  for b in range(a+1,500):
     c = (a**2 + b**2)**0.5
     if a + b + c == 1000:
        print a, b, c
        print a*b*c
        x = 1
        break
  if x==1:
     break

вы можете обернуть с try/excep и raise когда условие выполняется.

class FinitoException(Exception):
    pass

a = 3
b = 4
c = 5
x = 0
try:
  for a in range(3,500):
      for b in range(a+1,500):
          c = (a**2 + b**2)**0.5
          if a + b + c == 1000:
              print a, b, c
              print a*b*c
              raise FinitoException()
except FinitoException:
    return # or whatever

вы можете использовать оператор break:

a = 3
b = 4
c = 5
x = 0
while x != 1:
    for a in range(3,500):
        for b in range(a+1,500):
            c = (a**2 + b**2)**0.5
            if a + b + c == 1000:
                print a, b, c
                print a*b*c
                break