Reputation: 101
I'm trying to have a while loop ask a series of question and restart when the last question is asked. The thing is, I want the user to have the ability to quit by typing a specific word at any question. I also want as little code as possible in the loop, so the if/elif statements lays in functions.
My question is: Can I continue or break a loop from a function?
My code:
def check_gender(q):
if q == "f":
number_women = number_women + 1
elif q == "m":
number_men = number_men + 1
elif q == "foo":
#break the loop
else:
print("Please answer M or F: ")
q = input("Are you a male or female (M/F)? ").lower()
check_gender(q)
def check_age(q):
if not(16 <= int(q) <= 25):
print("You are not in the age range for this survey")
#Jump back to first question here
if q == "foo":
#break the loop
while True:
gender = input("Are you a male or female (M/F)? ").lower()
check_gender(gender)
age = input("Please enter your age: ")
check_age(age)
#And so on with questions
Is this possible?
Upvotes: 0
Views: 217
Reputation: 47
You should try this code, is someone put other letter the loop will break
def check_gender(q):
if q == "f":
number_women = number_women + 1
elif q == "m":
number_men = number_men + 1
# elif q == "foo":
#break the loop
else:
print("Please answer M or F: ")
q = input("Are you a male or female (M/F)? ").lower()
check_gender(q)
def check_age(q):
if not(16 <= int(q) <= 25):
print("You are not in the age range for this survey")
#Jump back to first question here
#if q == "foo":
#break the loop
while True:
gender = input("Are you a male or female (M/F)? ").lower()
if gender != "f" and gender != "m":
break
else:
check_gender(gender)
age = input("Please enter your age: ")
try:
ageValue = int(age)
check_age(age)
except ValueError:
print ("You must enter a number")
break
Upvotes: 0
Reputation: 1510
The best way probably is to raise a custom Exception from inside the question functions as follows:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
NUMBER_MEN, NUMBER_WOMEN = 0, 0
class ExitLoop(Exception):
pass
def check_gender(reply):
global NUMBER_WOMEN, NUMBER_MEN
while True:
if reply == "f":
NUMBER_WOMEN += 1
return
elif reply == "m":
NUMBER_MEN += 1
return
elif reply == "foo":
raise ExitLoop
else:
print("Please answer M or F: ")
reply = input("Are you a male or female (M/F)? ").lower()
def check_age(reply):
if reply == "foo":
raise ExitLoop
if not 16 <= int(reply) <= 25:
print("You are not in the age range for this survey")
return False
return True
while True:
try:
gender = input("Are you a male or female (M/F)? ").lower()
check_gender(gender)
age = input("Please enter your age: ")
inrange = check_age(age)
if not inrange:
continue
except ExitLoop:
break
I made a few other changes to your code to make it a bit more pythonic. Be careful by the way, the code above fails when the user enters anything but 'foo' or a number in reply to the age question.
By the way, if you want to ask your user a lot of questions, you might want to check out the excellent Click package.
Hope this helps!
Upvotes: 2
Reputation: 1815
You can return some(for example bool) value from function check_age(q)
and check it.
def check_age(q):
if not(16 <= int(q) <= 25):
print("You are not in the age range for this survey")
#Jump back to first question here
if q == "foo":
return True
else:
return False
while True:
gender = input("Are you a male or female (M/F)? ").lower()
check_gender(gender)
age = input("Please enter your age: ")
if check_age(age):
break
Upvotes: 4