Выход из цикла 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