To start this guide, download this zip file.
Input loops
When writing interactive programs, you often will want to loop while receiving input. The basic structure of an input is:
- while some condition is True
- read input
- check the input and either
- do something with the input
- break or return from the loop
This is an event stream pattern!
The examples below will illustrate how to do this.
Road Trip
We are going to write a small program that checks helps you on a road trip:
- loop forever
- ask the driver “Are we there yet?”
- if the answer is yes, break out of the loop
The code in road_trip.py
shows a program that does this:
def is_yes(response: str) -> bool:
return response == "yes" or response == "Yes"
def road_trip():
while True:
response = input("Are we there yet? ")
if is_yes(response):
print("Hurray!")
break
if __name__ == '__main__':
road_trip()
The most important thing to notice here is that the road_trip()
function uses
while True
to loop. This will loop literally forever unless you include some
way of breaking out of the loop when a condition is met. In this case, we use
break
to leave the loop whenever the user types yes
or Yes
as input. The
keyword break
does exactly what it sounds like — it leaves the while loop it
is inside of and goes to the next line of code that is outside of the loop. In
this example, there is no other code in the road_trip()
function, so once the
code uses break, it leaves the function and then ends the program.
Notice also that the is_yes()
function checks a response string to see if it
is ‘yes’ or ‘Yes’, so we can handle different ways a person types a response.
The correct way to write this code is:
return response == "yes" or response == "Yes"
Do NOT write:
return response == 'yes' or 'Yes'
This will ALWAYS return true. Imagine a person types ‘no’. Then Python will
check response == 'yes'
, and this is False
. However it then checks Yes
,
which by itself evaluates to True
, and the function will return True
. This
is not what you want.
Run the program and you will see something like this:
Are we there yet? no
Are we there yet? no
Are we there yet? nyet
Are we there yet? nope
Are we there yet? sorry
Are we there yet? sigh
Are we there yet? yes
Hurray!
Bigger
Let’s write a program to check whether one number is bigger than another. The idea is to do this:
- have the person enter number1
- have the person enter number2
- tell the person which number is bigger
Remember, input()
always returns a string! If a person enters '5'
and
'10'
, then you don’t want to compare the string ‘5’ to the string ‘10’! You
will be checking which string comes first alphabetically, which is not what you
want.
So whenever you use input()
to enter numbers, you need to convert the string
that a person enters into an integer. You do this with int()
:
response = input('Enter a number: ')
number = int(response)
When you use input() to ask for a number, be sure to use int() to convert the string a person types into a number
The code in bigger.py
contains a program that checks two numbers:
def get_number() -> int:
response = input("Enter a number: ")
return int(response)
def main():
number1 = get_number()
number2 = get_number()
if number1 > number2:
print(f"{number1} is bigger than {number2}")
elif number1 < number2:
print(f"{number1} is smaller than {number2}")
else:
print(f"You entered {number1} twice.")
if __name__ == '__main__':
main()
If you run this program, you will see something like this:
Enter a number: 5
Enter a number: 10
5 is smaller than 10
Guessing game
Let’s put these two concepts together. Write a program that asks a person to guess a secret number:
- loop forever
- get a guess
- if the guess is too high, tell them to go lower
- if the guess is too low, tell them to go higher
- if the guess is correct, tell them they won and break
This combines both an input loop and converting strings to integers with
int()
. Work with a friend to see if you can solve this problem.
The code in guessing_game.py
contains a solution:
def play(secret_number: int):
while True:
response = int(input('Guess a number: '))
if response > secret_number:
print('Lower!')
elif response < secret_number:
print('Higher!')
else:
print('You got it!')
return
if __name__ == '__main__':
play(37)
In this program we use return
to break out of the while loop. This works just
as well as break
. The only difference is that break
would continue to
execute code in the play()
function if there was more code after the while
loop.
Notice that we “hard code” the answer to 37
. Later we will show you how to
choose a random number instead. If you run this program, you should see
something like this:
Guess a number: 50
Lower!
Guess a number: 20
Higher!
Guess a number: 30
Higher!
Guess a number: 35
Higher!
Guess a number: 37
You got it!