Books / Coding Games With Pygame Zero & Python / Chapter 2
Python Fundamentals
There are some exercises here. Each exercise will ask you to write a program. The solution is often on the following page - do not turn the page until you have attempted your own solution! Save each program in a separate file.
The REPL
REPL stands for Read Evaluate Print Loop. In Mu you access it via the
REPL
button. It appears at the bottom of the window. It’s a special
mode in which you type an instruction to Python and Python executes it
immediately (no need to click RUN
) and displays the result (no need to
type print()
). It’s useful for doing calculations and trying things
out, but it won’t save what you type, so you will only want to use it
for very short programs.
Image credit: (c) 2022 Nicholas H.Tollervey. Used under Creative Commons by-nc-sa 4.0 International License.
Arithmetic operators
Python understands several operators from maths. You can use them in your programs, or just enter these examples at the REPL to use Python as a calculator, as in the screenshot above.
Operator |
Symbol |
Example |
Result |
---|---|---|---|
Addition |
+ |
20 + 10 |
30 |
Subtraction |
- |
20 - 10 |
10 |
Multiplication |
* |
20 * 10 |
200 |
Division |
/ |
20 / 10 |
2 |
There are some more advanced operators in
code-shortcuts
{.interpreted-text role=”numref”}.
Variables
A variable is a place in the computer’s memory where data is stored. You can name a variable whatever you like; you should try to make the name descriptive. There are many types of variable but Python sets the type for us automatically when we store data in the variable. (Unlike in many other languages, we do not need to specify the type.) The types we will see most often are whole numbers (integers) and strings of text.
We create a variable and assign a value to it using the =
operator.
Note this is different from the ==
operator which is used for
comparisons.
We use the print()
function to print the value of our variables. It
will print any type of data (numbers, strings, both literals and
variables) provided each item is separated with a comma (,
).
my_number = 7
my_string = "hello"
print(my_string, my_number)
Program 2.1 Variable assignment
We can use a variable anywhere we would use a literal number or string. The value of the variable will be retrieved from the computer’s memory and substituted for the variable in any expression.
apples = 27
pears = 33
fruits = apples + pears
print("Number of fruits:", fruits)
Program 2.2 Adding two variables together
Exercise
Copy Program 2.2, but also add 17 bananas to the calculation of fruits.
We can store a new value in the same variable. The old value will be forgotten.
apples = 27
apples = 40
print("Number of apples:", apples)
Program 2.3 Overwriting a variable with a new value
Question
What do you think Program 2.3 will print? If you aren’t sure, type it in.
More usefully, we can take the old value, modify it, then store it back in the same variable.
x = 5
x = x * 10
x = x + 7
print(x)
Program 2.4 Modifying a variable
Exercise
What will Program 2.4 print? Change the numbers in the program. Use a division / operation. Then ask your friend to predict what the new program will print. Was he right?
You will often see this used for counting:
total = 0
total = total + 1
total = total + 1
total = total + 1
print(x)
Program 2.5 Counting
Question
What is the total count of Program 2.5 ?
See Program 2.18 for a quicker way of writing this.
Input
Program 2.2 is not very useful if the number of apples changes. This would require the programmer to change the program. We can improve it by allowing the user of the program to change the numbers. The input()
function allows the user to type a string which can be different every time the program is run.
my_string = input()
print(my_string)
Sometimes we want the user to type in a number rather than a string. We can combine the int() function with the input()
function to convert the string to a number.
Program 2.6 Getting input from user
print("Enter a number")
my_number = int(input())
print("Double your number is", my_number * 2)
Exercise
Copy Program 2.2 but use input()
to ask the user to enter the number of apples and pears.
Booleans
A boolean is another type of variable that is not a string or a number. It can have only two possible values: True
or False
. In some languages and in electronics you may see these represented as 0
and 1
.
Booleans are used by keywords such as if
and while
. In an if
statement, the indented code block is only run if the boolean is True
.
sunny = True
if a:
print("Let's go to the park")
You could write it like this:
sunny = True
if sunny==True:
print("Let's go to the park")
but that would be redundant because if
always tests if the boolean is True
.
If the boolean is not true, and if you write an else
clause, the indented code block under else
is run instead.
sunny = False
if sunny:
print("Let's go to the park")
else:
print("We must stay at home")
Comparison operators
Comparison operators take two numbers, strings or other variables,
compare them, and then return a boolean True
or False
from them.
- Equal: ==
- Not equal: !=
- Less than: <
- Less than or equal: <=
- Greater than: >
- Greater than or equal: >=
if 7 < 9:
print("7 is less than 9")
a = 10
b = 5
if a == b:
print("a is equal to b")
if a < b:
print("a is less than b")
if a > b:
print("a is greater than b")
Program 2.7 Comparisons: greater than, lesser than, equal to
Boolean logic
The and
, or
and not
operators operate on booleans and return new
boolean values.
a = True
b = False
if a:
print("a is true")
if a and b:
print("a and b are both true")
if a or b:
print("either a or b is true")
Change the values of a and b in Program 2.8 and see what output is printed by different combinations of True
and False
.
Or
Only people older than 12 or taller than 150cm are allowed to ride the rollercoaster. This program checks whether people are allowed to ride.
print("How old are you?")
age = int(input())
print("How tall are you?")
height = int(input())
if age > 12:
print("You can ride")
elif height > 150:
print("You can ride")
else:
print("YOU MAY NOT RIDE, GO AWAY!")
Boolean operators combine two truth values together. The or
operator
is True
if either of its operands is true. Try this example:
a = True
b = False
print(a or b)
Exercise
Use the or operator to make the rollercoaster program shorter by combining the two tests into one test.
A possible solution:
print("How old are you?")
age = int(input())
print("How tall are you?")
height = int(input())
if age > 12 or height > 150:
print("You can ride")
else:
print("YOU MAY NOT RIDE, GO AWAY!")
And
The and
operator is True
if both of its operands is true. Try this
example:
a = True
b = False
print(a and b)
Exercise
The rollercoaster is only allowed to run on days when the temperature is
less than 30 degrees. Extend the program to ask the temperature and use
the and
operator to only allow riding when less than 30
degrees.
A possible solution:
print("How old are you?")
age = int(input())
print("How tall are you?")
height = int(input())
print("What is the temperature?")
temp = int(input())
if (age > 12 or height > 150) and temp < 30:
print("You can ride")
else:
print("YOU MAY NOT RIDE, GO AWAY!")
Note that we have put brackets around the or
expression. This ensures
it is calculated first and the result of that calculation is then used
in the and
expression. This is the same way you use the BODMAS rule to
decide the order of operations in maths.
Not
The not
operator is True
if its operand is False
. If its operand
is False
then it is True
. Try this example:
a = True
b = False
print(not a)
print(not b)
We can get a user input and convert it to a boolean like this:
print("Is it raining? Y/N")
if input() == "Y":
raining = True
else:
raining = False
Exercise
Change the program so that you can only ride the rollercoaster if it is not raining.
Possible solution:
print("Is it raining? Y/N")
if input() == "Y":
raining = True
else:
raining = False
print("How old are you?")
age = int(input())
print("How tall are you?")
height = int(input())
print("What is the temperature?")
temp = int(input())
if (age > 12 or height > 150) and temp < 30 and not raining:
print("You can ride")
else:
print("YOU MAY NOT RIDE, GO AWAY!")
For loops
A for
loop repeats a block of code a number of times. A variable is
created which we can use to find the current number within the loop.
Here the variable is called x
but you can name it whatever you like.
Run this program:
for x in range(0, 11):
print(x)
You can also change the step of the loop. Run this program:
for x in range(0, 11, 2):
print(x)
Nested loops
It is often useful to put one loop inside another loop.
for a in range(0, 6):
for b in range(0, 6):
print(a, "times", b, "is", a * b)
Program 2.9 Nested for loop
Exercise
Write a program which prints out the 12 times table.
Incrementing a variable in a loop
A baker has three customers. He asks them each how many cakes they want so he knows how many he must bake. He writes this program.
total = 0
print("Customer", 1, "how many cakes do you want?")
cakes = int(input())
total = total + cakes
print("Customer", 2, "how many cakes do you want?")
cakes = int(input())
total = total + cakes
print("Customer", 3, "how many cakes do you want?")
cakes = int(input())
total = total + cakes
print("I will bake", total, "cakes!")
Exercise
This program is longer than it needs to be. Write your own program that
does the same thing using a for
loop. It should be only 6
(or fewer) lines long.
total=0
for x in range(1, 4):
print("Customer", x, "how many cakes do you want?")
cakes = int(input())
total = total + cakes
print("I will bake", total, "cakes!")
Exercise
The baker gets a fourth customer. Change Program 2.10 so it works for 4 customers.
Exercise
The baker has a different number of customers every day. Change the program so it asks how many customers there are. Store the number typed by the user in a variable called c. Change the loop so it works for c customers rather than 4 customers.
print("How many customers are there today?")
c = int(input())
total=0
for x in range(1, c+1):
print("Customer", x, "how many cakes do you want?")
cakes = int(input())
total = total + cakes
print("I will bake", total, "cakes!")
Program 2.11 Possible solution to variable number of customers exercise
Exercise
If a customer orders 12 cakes, he gets an extra cake for free. Use an if
statement to check cakes > 12
. If so, add one more cake.
Array lists
Variables can be stored together in a list. Most languages call this an array so try to remember that word also.
::: {#code-arrays .literalinclude caption=”Array lists” linenos=””} programs/0C_arrays.py :::
Looping over lists
Rather than the user typing in data, your program might be supplied with data in a list. Here is a list of prices - a shopping list. Note we don’t use a currency symbol except when we print the price.
# a is a list of integers
a = [74, 53, 21]
# b is a list of strings
b = ["hello", "goodbye"]
# You can take a single element from the list.
print(a[2])
# You can use a for loop to print every element.
for x in a:
print(x)
Program 2.12 Array lists
In this program x
is used an index for the array. Note that indices
begin at 0
rather than 1
. If the array contains 4 elements then the
final element will have index 3
, nor 4
.
However, for
can directly give you all the array values without the
need for an index or to specify the size of the range:
prices = [3.49, 9.99, 2.50, 20.00]
for price in prices:
print("item costs £", price)
Program 2.13 A shopping list
Exercise
Change the Program 2.13 so that it prints the total price of all the items added together.
prices = [3.49, 9.99, 2.50, 20.00]
total = 0
for price in prices:
print("item costs £", price)
total = total + price
print("shopping total", total)
There is a problem with solution, can you see what it is when you run it?
The problem is that we are using floating point numbers for the prices
and floating point maths in the computer is not entirely accurate, so
the answer will be very slightly wrong. One way to fix this is to round
the result to two decimal places using the round()
function:
``py print(“shopping total”, round(total,2))
This works for a short list, but if the list was millions of items long
it might not give the right result. Can you think of a better way?
Instead of storing the number of pounds, store the the number of
pennies. Britain no longer has a half-penny, so the numbers will always
be whole numbers - *integers* - and no floating points will be needed
for the addition.
```py
prices = [349, 999, 250, 2000]
total = 0
for price in prices:
print("item costs £", price/100)
total = total + price
print("shopping total", total/100)
Program 2.15 Better way of calculating the total cost of shopping list
Exercise
Conditional discount. Any item that costs more than £10 will be
discounted by 20 percent. Use an if
statement to check if
the price is more than 1000 pennies. If it is, multiply the price by 0.8
to reduce it before you add it to the total.
prices = [349, 999, 250, 2000]
total = 0
for price in prices:
print("item costs £", price/100)
if price > 1000:
price = price * 0.8
print(" item discounted to", price/100)
total = total + price
print("shopping total", total/100)
Program 2.16 Possible way of discounting shopping list
Functions
You may have seen specially named functions that are called by Pygame:
draw()
and update()
. However, you can define a function named
whatever you like and call it yourself.
Functions are useful for many reasons. The simplest is that they make your program look more organized. They also enable you re-use code without needing to copy it and risk making mistakes. When your programs get longer they enable you to create abstractions so you only have to think about what function you want to call and don’t need to remember the details of the code inside the function.
def my_func():
print("This is my function")
print("Imagine there was lots of code here"
" that you didnt want to type 3 times")
my_func()
my_func()
my_func()
Program 2.17 Functions
Shortcuts
Here are quicker ways of doing basic things. You may have noticed some of these being used already.
# f is an easy way to insert variables into strings
score = 56
name = "Richard"
message = f"{name} scored {score} points"
print(message)
# += is an easy way to increase the value of a variable
score = score + 10 # hard way
score += 10 # easy way
print(score)
# double / means whole number division, no decimals
x = 76 // 10
# MODULO is the percent sign %. It means do division and take the remainder.
remainder = 76 % 10
print(f"76 divided by 10 is {x} and the remainder is {remainder}")
WIDTH = 500
a = 502
b = 502
# Modulo is often used as a shortcut to reset a number back
# to zero if it gets too big. So instead of:
if a > WIDTH:
a = a - WIDTH
# You could simply do:
b = b % WIDTH
print(a, b)
# input() takes a string argument which it prints out.
# Instead of:
print("Enter a number")
num = input()
# You can have a single line:
num = input("Enter a number")
Program 2.18 Shortcuts
Indentation
Code is arranged in blocks. For example, a function consists of a
one line declaration followed by a block of several lines of code.
Similarly, all the lines of a loop form one block. A conditional has a
block of code following the if
statement (and optionally blocks after
the elif
and else
. )
Many languages use {}
or ()
to delimit a block. However Python is
unusual: each block begins with :
and then all the lines of the block
are indented by the same amount of whitespace (tabs or spaces). The
block ends when the indentation ends.
Blocks can be nested inside other blocks.
def test():
print("entering function block")
for i in range(0,10):
print("entering for loop block")
if i == 5:
print("in if block")
print("leaving for loop block")
print("leaving function block")
print("not in any block")
test()
Program 2.19 Can you predict what this program will print?
Global variables
A variable defined inside a function has local scope: it cannot be used outside of the function. If you want to use the same variable in different functions then you must define it outside the functions, in the global scope. However, if you attempt to modify the value of the global variable inside a function you will get an error, or - even worse
- you will create a local variable with the same name as the global variable and your changes to the global variable will be silently lost.
You must explicitly tell Python that you want to use a global variable
with the global
keyword.
a = 10
def my_function():
global a
a=20
my_function()
print(a)
Program 2.20 Try removing line 3 and see what happens
Dictionaries
A dictionary (called a HashMap in some languages) stores pairs of values. You can use the first value to look-up the second, just like how you look-up a word in a dictionary to find its meaning. Here is a dictionary of the ages of my friends:
friends = {'richard': 96, 'john': 12, 'paul': 8}
print("What is your name?")
name = input()
age = friends[name]
print("Your age is", age)
Exercise
Change the program so it contains 5 of your friends’ ages.
Counting
Here is a loop that prints out all the ages:
friends = {'richard': 96, 'john': 12, 'paul': 8}
for name, age in friends.items():
print(name, "is age", age)
Exercise
Can you add an if
statement to only print the ages of
friends older than 10?
Possible solution:
friends = {'richard': 96, 'john': 12, 'paul': 8}
for name, age in friends.items():
if age > 10:
print(name, "is age", age)
Exercise
Now add a count
variable that counts how many of the
friends are older than 10. Print the number at the end.
Possible solution:
friends = {'richard': 96, 'john': 12, 'paul': 8}
count = 0
for name, age in friends.items():
if age > 10:
count = count + 1
print("friends older than 10:",count)
Combining tests
Exercise
Use the and operator together with the < and > operators to only count friends between the ages of 11 to 13.
Possible solution:
friends = {'richard': 96, 'john': 12, 'paul': 8}
count = 0
for name, age in friends.items():
if age > 10 and age < 14:
count = count + 1
print("friends age 11 to 13 :",count)
Finding
We make a variable oldest
that will contain the oldest age in the
list.
friends = {'richard': 96, 'john': 12, 'paul': 8}
oldest = 0
for name, age in friends.items():
if age > oldest:
oldest = age
print("oldest age", oldest)
Exercise
Make a variable youngest
that will contain the youngest
age in the list. Print the youngest at the end.
Possible solution:
friends = {'richard': 96, 'john': 12, 'paul': 8}
oldest = 0
youngest = 100
for name, age in friends.items():
if age > oldest:
oldest = age
if age < youngest:
youngest = age
print("oldest age", oldest)
print("youngest age", youngest)
Finding names
Exercise
As well as the ages, print the names of the youngest and oldest friends.
Possible solution:
friends = {'richard': 96, 'john': 12, 'paul': 8}
oldest = 0
youngest = 100
for name, age in friends.items():
if age > oldest:
oldest = age
oldname = name
if age < youngest:
youngest = age
youngname = name
print("oldest friend", oldname)
print("youngest friend", youngname)
Find the average
Exercise
Create a total
variable. Add each age to the total. At the
end, calculate the average by dividing the total by the number of
friends.
Possible solution:
friends = {'richard': 96, 'john': 12, 'paul': 8}
total = 0
for name, age in friends.items():
total = total + age
average = total / 3
print("average age is ", average)
Bugs
Fixing bugs can feel frustrating but all programmers must wrestle with them. The simplest (but still annoying!) are syntax errors. The computer is not very intelligent and is unable to guess what you mean, so you must type the programs in this book exactly as they appear. A single wrong letter or space will prevent them from working.
A particular issue in Python is that indentation must be correct.
x = 10
y = 11
z = 12
print(x,y,z)
Program 2.21 Buggy program
Exercise
Can you spot and fix the bug in Program 2.21?
def myfunction:
print "hello"
myfunction()
Program 2.22 More bugs
Exercise
Program 2.22 has two bugs to fix.