Exit while loop in Python
Solution 1
The while
loop will match the condition only when the control returns back to it, i.e when the for
loops are executed completely. So, that's why your program doesn't exits immediately even though the condition was met.
But, in case the condition was not met for any values of a
,b
,c
then your code will end up in an infinite loop.
You should use a function here as the return
statement will do what you're asking for.
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)
Apart from @Sukrit Kalra's answer, where he used exit flags you can also use sys.exit()
if your program doesn't have any code after that code block.
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
help on 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).
Solution 2
If you don't want to make a function ( which you should and refer to Ashwini's answer in that case), here is an alternate implementation.
>>> 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
Solution 3
You could use a break statement:
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
Solution 4
You can refactor the inner code into a function and use return to exit:
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
Have a look at this question.
Solution 5
The problem is, even though you set x=1 when a+b+c==1000, you do not break out of the two for loops when that condition is met, and so the while loop doesn't know that x==1 until both for loops finish. To avoid this problem, you can add explicit break statements to the for loops (and as Sukrit Kalra points out, the while loop becomes unnecessary).
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
caadrider
Middle school media and technology teacher in Colorado.
Updated on January 26, 2020Comments
-
caadrider over 4 years
In the code below, I'd like the
while
loop to exit as soon asa
+b
+c
=1000
. However, testing withprint
statements shows that it just continues until thefor
loops are done. I've triedwhile True
and then in theif
statement setFalse
but that results in an infinite loop. I thought usingx = 0
and then settingx = 1
might work but that too just runs until thefor
loops finish. What is the most graceful and fastest way to exit? Thanks.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
-
Sukrit Kalra almost 11 yearsYou won't actually need the
while
loop in this case. -
caadrider almost 11 yearsThank you. If I use a function I don't really need the
while
loop at all. As I understand, the function would run until the condition toreturn
is met and then it would exit. That works fine, but doesn't really help me understand why my originalwhile
loop won't exit. -
Sukrit Kalra almost 11 yearsIt exits. It just does some extra
for
loops. -
pascalhein almost 11 yearsyour code will stop executing when the
for
loops are finished. In the OP's post, however, if theif
condition was not met in any case, the loops will start over from the beginning. -
caadrider almost 11 yearsThat's the issue, I'd like it to exit without doing the extra
for
loops. Basically, I'm trying to figure out how to make awhile
loop exit early once a condition is met. Doing it outside a function doesn't seem to work. Maybe I should be using functions more, but seems like it should work. -
pascalhein almost 11 years@caadrider then why did you use a
while
loop? -
Sukrit Kalra almost 11 yearsSince the same things are being done in the
while
loop everytime, wouldn't it actually be better to just exit if the condition is not satisfied in the first time, since it never will be satisfied? -
caadrider almost 11 years@csharpler - I used the
while
loop because I don't know when the condition will be met but I do know it will eventually and beforea=500
so for efficiency I just want to end asap and not keep running. Is there a better way to do it that I'm not seeing? -
Sukrit Kalra almost 11 yearsYou could have broken out of the innermost loop using
break
and set a flag value which you would check in the outer loop andbreak
that loop as well as soon as that flag is set to true. (Similar to the implementation of other answers) -
caadrider almost 11 yearsI'll have to wait until my Python gets a lot better for this one. Thanks for the tip though. I'll look into
try
statements. Haven't learned those yet. -
caadrider almost 11 yearsThat works. I wish there was a way to break out of nested loops in one fell swoop. I thought the
while
loop would provide that option but so far I can't figure out how to make it work. -
Sukrit Kalra almost 11 yearsYou won't be able to swiftly break out of all the nested loops. If you're in a script however, you can use
sys.exit()
which will break out of the complete execution of the file and execute nothing after it. -
Ashwini Chaudhary almost 11 years@caadrider Python doesn't have a
goto
statement likeC
, so you can't just jump out of nested loops suddenly. So a good option here is to use functions. -
caadrider almost 11 years@Ashwini - thanks for the clarification. Looks like functions are the best way to do this. Time to embrace them. :)
-
Sukrit Kalra almost 11 yearsThis PEP might be a useful read.
-
caadrider almost 11 yearsThanks for the link. Looks useful and educational.