Python Tutorial: Lesson 1 Lesson 2 Lesson 3 Lesson 4 Lesson 5 Lesson 6 Lesson 7 Lesson 8 Lesson 9 Lesson 10 Lesson 11
Python Tutorial: Lesson 1 Lesson 2 Lesson 3 Lesson 4 Lesson 5 Lesson 6 Lesson 7 Lesson 8 Lesson 9 Lesson 10 Lesson 11
1 - Installing Python
What is python?
If you don't understand this, don't worry. Just skip it and move on.
Python is an interpreted programming language. For those who don't know, a programming
language is what you write down to tell a computer what to do. However, the computer doesn't
read the language directly - there are hundreds of programming languages, and it couldn't
understand them all. So, when someone writes a program, they will write it in their language of
choice, and then compile it - that is, turn it in to lots of 0s and 1s, that the computer can easily and
quickly understand. A windows program that you buy is already compiled for windows - if you
opened the program file up, you'd just get a mass of weird characters and rectangles. Give it a go -
find a small windows program, and open it up in notepad or wordpad. See what garbled mess you
get.
But that windows program is compiled for windows - no other machine can run that program,
unless it has windows. What Python is, is a language which is never actually compiled in full -
instead, an interpreter turns each line of code into 0s and 1s that your computer can understand
this. And it is done on the fly - it compiles the bits of the program you are using as you are using
them. If you were to quit the program and come back another day, it would compile the bits you
are using, as you are using them, again. Seems a waste of time? Maybe, but the fact is that when
you come back another day, you might be using a Windows instead of a Mac. You might send the
program to a friend, who uses another type of computer. Or you might post your program on the
internet, where everyone using all different types of systems might download it. That is the
wonder of an interpreted programming language - it is like a language that EVERYONE can
understand.
Remember that garbled mess that you got when opening a program in notepad? Not much use to
anyone, apart from the computer. And there is no reliable (or legal) way of turning that program
back in to a programming language that you or I could understand.
The same is with Civ3 AI - it is compiled into a garbled mess. Nobody can understand it, and
most of all, nobody can change it. Only Firaxis can change the AI, and they can't share the logic
behind it with anyone.
With cIV, they decided to change that - they would leave the AI uncompiled in the language of
Python, and have it compiled on-the-fly by an interpreter. This is so that Joe modder can look at
the AI and change it, yet when it is needed to be used, the python interpreter turns it into 0s and 1s
for your computer to understand. And it isn't permanently compiled into a garbled mess - you are
still left with python code, that you can read, understand, and MODIFY!!!!!
1. First download Python-2.4.1.exe by following this link. If you are a dialup user, keep in
mind that the file is around 10MB
2. Run the file you just downloaded, and follow the prompts.
OK! Hopefully now everything is good! Now, to test if that just worked, type this in your DOS
window:
If you forgot a CAPITAL V, you will accidently load python in verbose mode. Give it a go, see
what happens. Just press CTRL-D to quit, or type 'quit' for quit instructions.
conclusion
Good work! Lesson 1 over! Next lesson, we learn our way around Python Interactive Mode, and
write simple one-line pieces of code. I'll also have a lesson plan drawn up by then, so you can see
where you are going. If any of our more experienced members have suggestions for the lesson
plan, tell me!
Thanks to all,
And it is that simple (at least for now). Python makes it easy to run single lines of code - one-liner
programs. Lets give it a go.
Opening IDLE
Go to the start menu, find Python, and run the program labelled 'IDLE' (Stands for Integrated
Development Environment.
Now you are in the IDLE environment. This is the place you will be spending most time in. Here
you can open a new window to write a program, or you can simply mess around with single lines
of code, which is what we are going to do. Type the following and press enter: (don't type >>> as
it should already be there)
What happened? You just created a program, that prints the words 'Hello, World'. The IDLE
environment that you are in immediately compiles whatever you have typed in. This is useful for
testing things, e.g. define a few variables, and then test to see if a certain line will work. That will
come in a later lesson, though.
Math in Python
Now try typing the stuff in bold. You should get the output shown in blue. I've given explainations
in brackets.
>>> 20+80
100
>>> 18294+449566
467860
(These are additions)
>>> 6-5
1
(Subtraction)
>>> 2*5
10
(Multiply, rabbits!)
>>> 5**2
25
(Exponentials e.g. this one is 5 squared)
>>> 21/3
7
>>> 23/3
7
>>> 23.0/3.0
7.6666...
(division, 2nd time ignoring remainder/decimals,
3rd time including decimals)
>>> 23%3
2
>>> 49%10
9
(the remainder from a division)
As you see, there is the code, then the result of that code. I then explain them in brackets. These
are the basic commands of python, and what they do. Here is a table to clarify them (because
tables look cool, and make you feel smarter ;) ):
Remember that thing called order of operation that they taught in maths? Well, it applies in
python, too. Here it is, if you need reminding:
1. parentheses ()
2. exponents **
3. multiplication *, division \, and remainder %
4. addition + and subtraction -
Order of Operations
Here are some examples that you might want to try, if you're rusty on this:
In the first example, the computer calculates 2 * 3 first, then adds 1 to it. This is because
multiplication has the higher priority (at 3) and addition is below that (at lowly 4).
In the second example, the computer calculates 1 + 2 first, then multiplies it by 3. This is because
parentheses (brackets, like the ones that are surrounding this interluding text ;) ) have the higher
priority (at 1) and addition comes in later than that.
Also remember that the math is calculated from left to right, UNLESS you put in parentheses. The
innermost parentheses are calculated first. Watch these examples:
Comments, Please
The final thing you'll need to know to move on to multi-line programs is the comment. Type the
following (and yes, the output is shown):
>>>
A comment is a piece of code that is not run. In python, you make something a comment by
putting a hash in front of it. A hash comments everything after it in the line, and nothing before it.
So you could type this:
Comments are important for adding necessary information for another programmer to read, but
not the computer. For example, an explanation of a section of code, saying what it does, or what is
wrong with it. You can also comment bits of code by putting a # in front of it - if you don't want it
to compile, but cant delete it because you might need it later.
Conclusion
There you go! Lesson 2 Completed. That was even shorter than lesson 1!
Next lesson, we make programs with many lines of code, and save them, so we can actually send
them to people. That's right, you don't have to retype every program you run! What an amazing
innovation!
Thanks to all,
Well, we can make one-liner programs. So What? You want to send programs to other people, so
that they can use them, without knowing how to write them.
Editing in Notepad
Writing programs in python to a file is VERY easy. Python programs are simply text documents -
you can open them up in notepad, and have a look at them, just like that. So, go and open notepad.
Type the following:
Keep this exactly the same, down to where the commas are placed. Save the file as 'mary.py' - and
make sure notepad doesn't add .txt to the end of the filename - You will have to tell it to save as
any file, to avoid this. Turn off 'Hide known file extensions' in Windows Explorer, if it makes it
easier.
Now, open up the Python IDLE program (should be in your start menu). Click 'File > Open' and
find mary.py and open it. if you cant find mary.py, set the open dialogue to 'Files of type: All Files
(*)'. A new window will open, showing the program you just wrote. To run your program, click
'Run>Run Module' (or just press F5). Your program will now run in the main Python screen
(Titled *Python Shell*) and will look like this:
You can also use IDLE to create Python programs, like what you did in notepad. Simply click
'File > New'. We will be writing all of our programs now in the python IDLE program - the
notepad thing is just a demonstration to tell you that a .py file is just a simple text file, which
anyone can see.
• First of all, the comment wasn't shown. That is good, because remember - comments aren't
compiled. (try compiling it after removing the # - it comes out messy)
• Second, is that the 3rd and 4th line got joined. This is because there is a comma just
outside the inverted commas that surround the text. In the 'print' command, this stops the
program from starting a new line on the screen when showing text.
• You can also run the program from your command line program (e.g. MSDOS) - Open the
prompt up, type 'cd path\to\your\file' then type 'python mary.py'. Your program will now
execute in the command line.
Variables
Now lets start introducing variables. Variables store a value, that can be looked at or changed at a
later time. Let's make a program that uses variables. Open up IDLE, click 'File>New Window' - a
new window now appears, and it is easy to type in programs. Type the following (or just copy and
paste - just read very carefully, and compare the code to the output that the program will make):
Strings
As you can see, variables store values, for use at a later time. You can change them at any time.
You can put in more than numbers, though. Variables can hold things like text. A variable that
holds text is called a string. Try this program:
As you see, the variables above were holding text. Variable names can also be longer than one
letter - here, we had word1, word2, and word3. As you can also see, strings can be added together
to make longer words or sentences. However, it doesn't add spaces in between the words - hence
me putting in the " " things (there is one space between those).
Conclusion
Well done! We now understand longer programs, and know the use of variables. Next lesson, we
look at functions, what they are, and how to use them.
Thanks to all,
(Our final lesson before we get into interacting with human input. Can't wait, can you?)
Just imagine you needed a program to do something 20 times. What would you do? You could
copy and paste the code 20 times, and have a virtually unreadable program, not to mention slow
and pointless. Or, you could tell the computer to repeat a bit of code between point A and point B,
until the time comes that you need it to stop. Such a thing is called a loop.
The following are examples of a type of loop, called the 'while' loop:
What does this do? Lets go through what the computer would be 'thinking' when it is in the 'while'
loop:
Is 'a' less than 10? NO (its 10, therefore isn't less than 10)
Don't do the loop
There's no code left to do, so the program ends
So in short, try to think of it that way when you write 'while' loops. This is how you write them,
by the way (and a couple of examples:
#EXAMPLE
#Type this in, see what it does
x = 10
while x != 0:
print x
x = x - 1
print "wow, we've counted x down, and now it equals", x
print "And now the loop has ended."
Remember, to make a program, you open IDLE, click File > New Window, type your program in
the new window, then press F5 to run.
What do you type in the area marked {conditions that the loop continues}? The answer is a
boolean expression.
What? A forgotten concept for the non-math people here. Never mind, boolean expression just
means a question that can be answered with a TRUE or FALSE response. For example, if you
wanted to say your age is the same as the person next to you, you would type:
And the statement would be TRUE. If you were younger than the person opposite, you'd say:
And the statement would be TRUE. If, however, you were to say the following, and the person
opposite of you was younger than you:
The statement would be FALSE - the truth is that it is the other way around. This is how a loop
thinks - if the expression is true, keep looping. If it is false, don't loop. With this in mind, lets have
a look at the operators (symbols that represent an action) that are involved in boolean expressions:
Dont get '=' and '==' mixed up - the '=' operator makes what is on the left equal to what is on the
right. the '==' operator says whether the thing on the left is the same as what is on the right, and
returns true or false.
Conditional Statements
OK! We've (hopefully) covered 'while' loops. Now let's look at something a little different -
conditionals.
Conditionals are where a section of code is only run if certain conditions are met. This is similar
to the 'while' loop you just wrote, which only runs when x doesn't equal 0. However, Conditionals
are only run once. The most common conditional in any program language, is the 'if' statement.
Here is how it works:
#EXAMPLE 1
y = 1
if y == 1:
print "y still equals 1, I was just checking"
#EXAMPLE 2
print "We will show the even numbers up to 20"
n = 1
while n <= 20:
if n % 2 == 0:
print n
n = n + 1
print "there, done."
Example 2 there looks tricky. But all we have done is run an 'if' statement every time the 'while'
loop runs. Remember that the % just means the remainder from a division - just checking that
there is nothing left over if the number is divided by two - showing it is even. If it is even, it prints
what 'n' is.
There are many ways you can use the 'if' statement, do deal with situations where your boolean
expression ends up FALSE. They are 'else' and 'elif'.
'else' simply tells the computer what to do if the conditions of 'if' arent met. For example, read the
following:
'a' is not greater than five, therefore what is under 'else' is done.
'elif' is just a shortened way of saying 'else if'. When the 'if' statement fails to be true, 'elif' will do
what is under it IF the conditions are met. For example:
The 'if' statement, along with 'else' and 'elif' follow this form:
One of the most important points to remember is that you MUST have a colon : at the end of
every line with an 'if', 'elif', 'else' or 'while' in it. I forgot that, and as a result a stack of people got
stumped at this lesson (sorry ;) ).
Indentation
One other point is that the code to be executed if the conditions are met, MUST BE INDENTED.
That means that if you want to loop the next five lines with a 'while' loop, you must put a set
number of spaces at the beginning of each of the next five lines. This is good programming
practice in any language, but python requires that you do it. Here is an example of both of the
above points:
1. Each line in the first level starts with no spaces. It is the main program, and will always
execute.
2. Each line in the second level starts with four spaces. When there is an 'if' or loop on the
first level, everything on the second level after that will be looped/'ifed', until a new line
starts back on the first level again.
3. Each line in the third level starts with eight spaces. When there is an 'if' or loop on the
second level, everything on the third level after that will be looped/'ifed', until a new line
starts back on the second level again.
4. This goes on infinitely, until the person writing the program has an internal brain
explosion, and cannot understand anything he/she has written.
There is another loop, called the 'for' loop, but we will cover that in a later lesson, after we have
learnt about lists.
Conclusion
And that is lesson 4! In lesson 5, we get into user interaction, and writing programs that actually
serve a purpose. Can't wait!
Thanks to all,
5 - Functions
Introduction
Last lesson I said that we would delve into purposefull programming. That involves user input,
and user input requires a thing called functions.
What are functions? Well, in effect, functions are little self-contained programs that perform a
specific task, which you can incorporate into your own, larger programs. After you have created a
function, you can use it at any time, in any place. This saves you the time and effort of having to
retell the computer what to do every time it does a common task, for example getting the user to
type something in.
Using a function
Python has lots of pre-made functions, that you can use right now, simply by 'calling' them.
'Calling' a function involves you giving a function input, and it will return a value (like a variable
would) as output. Don't understand? Here is the general form that calling a function takes:
See? Easy.
• Function_name identifies which function it is you want to use (You'd figure...). For
example, the function raw_input, which will be the first function that we will use.
• Parameters are the values you pass to the function to tell it what is should do, and how to
do it.. for example, if a function multiplied any given number by five, the stuff in
parameters tells the function which number it should multiply by five. Put the number 70
into parameters, and the function will do 70 x 5.
Well, that's all well and good that the program can multiply a number by five, but what does it
have to show for it? A warm fuzzy feeling? Your program needs to see the results of what
happened, to see what 70 x 5 is, or to see if there is a problem somewhere (like you gave it a letter
instead of a number). So how does a function show what is does?
Well, in effect, when a computer runs a function, it doesn't actually see the function name, but the
result of what the function did. Variables do the exact same thing - the computer doesn't see the
variable name, it sees the value that the variable holds. Lets call this program that multiplied any
number by five, multiply(). You put the number you want multiplied in the brackets. So if you
typed this:
note: don't bother typing in this code - multiply() isn't a real function, unless you create it.
The function ran itself, then returned a number to the main program, based on what parameters it
was given.
Now let's try this with a real function, and see what it does. The function is called raw_input, and
asks the user to type in something. It then turns it into a string of text. Try the code below:
Say in the above program, you typed in 'hello' when it asked you to type something in. To the
computer, this program would look like this:
Code Example 5 - What the computer sees
a = "hello"
print "hello"
Remember, a variable is just a stored value. To the computer, the variable 'a' doesn't look like 'a' -
it looks like the value that is stored inside it. Functions are similar - to the main program (that is,
the program that is running the function), they look like the value of what they give in return of
running.
A Calculator Program
Lets write another program, that will act as a calculator. This time it will do something more
adventerous than what we have done before. There will be a menu, that will ask you whether you
want to multiply two numbers together, add two numbers together, divide one number by another,
or subtract one number from another. Only problem - the raw_input function returns what you
type in as a string - we want the number 1, not the letter 1 (and yes, in python, there is a
difference.).
Luckily, somebody wrote the function input, which returns what you typed in, to the main
program - but this time, it puts it in as a number. If you type an integer (a whole number), what
comes out of input is an integer. And if you put that integer into a variable, the variable will be an
integer-type variable, which means you can add and subtract, etc.
Now, lets design this calculator properly. We want a menu that is returned to every time you finish
adding, subtracting, etc. In other words, to loop (HINT!!!) while (BIG HINT!!!) you tell it the
program should still run.
We want it to do an option in the menu if you type in that number. That involves you typing in a
number (a.k.a input) and an if loop.
loop = 1
choice = 0
while loop == 1:
#print what options you have
print "Welcome to calculator.py"
Well, it is all well and good that you can use other people's functions, but what if you want to
write your own functions, to save time, and maybe use them in other programs? This is where the
'def' operator comes in. (An operator is just something that tells python what to do, e.g. the '+'
operator tells python to add things, the 'if' operator tells python to do something if conditions are
met.)
function_name is the name of the function. You write the code that is in the function below that
line, and have it indented. (We will worry about parameter_1 and parameter_2 later, for now
imagine there is nothing between the parentheses.
Functions run completely independent of the main program. Remember when I said that when the
computer comes to a function, it doesn't see the function, but a value, that the function returns?
Here's the quote:
Functions run completely independent of the main program. Remember when I said that when the
computer comes to a function, it doesn't see the function, but a value, that the function returns?
Here's the quote:
To the computer, the variable 'a' doesn't look like 'a' - it looks like the value that is stored inside it.
Functions are similar - to the main program (that is, the program that is running the function),
they look like the value of what they give in return of running.
A function is like a miniture program that some parameters are given to - it then runs itself, and
then returns a value. Your main program sees only the returned value. If that function flew to the
moon and back, and then at the end had:
then all your program would see is the string "hello", where the name of the function was. It
would have no idea what else the program did.
Because it is a seperate program, a function doesn't see any of the variables that are in your main
program, and your main program doesn't see any of the variables that are in a function. For
example, here is a function that prints the words "hello" onscreen, and then returns the number
'1234' to the main program:
Think about the last line of code above. What did it do? Type in the program (you can skip the
comments), and see what it does. The output looks like this:
So what happened?
1. when 'def hello()' was run, a function called 'hello' was created
2. When the line 'print hello()' was run, the function 'hello' was executed (The code inside it
was run)
3. The function 'hello' printed "hello" onscreen, then returned the number '1234' back to the
main program
4. The main program now sees the line as 'print 1234' and as a result, printed '1234
That accounts for everything that happened. remember, that the main program had NO IDEA that
the words "hello" were printed onscreen. All it saw was '1234', and printed that onscreen.
There is one more thing we will cover in this (monsterously huge) lesson - passing parameters to
a function. Think back to how we defined functions:
Where parameter_1 and parameter_2 are (between the parentheses), you put the names of
variables that you want to put the parameters into. Put as many as you need, just have them
seperated by commas. When you run a function, the first value you put inside the parentheses
would go into the variable where parameter_1 is. The second one (after the first comma) would go
to the variable where parameter_2 is. This goes on for however many parameters there are in the
function (from zero, to the sky) For example:
A final program
Think back to that calculator program. Did it look a bit messy to you? I think it did, so lets re-
write it, with functions.
To design - First we will define all the functions we are going to use with the 'def' operator (still
remember what an operator is ;) ). Then we will have the main program, with all that messy code
replaced with nice, neat functions. This will make it so much easier to look at again in the future.
The initial program had 34 lines of code. The new one actually had 35 lines of code! It is a little
longer, but if you look at it the right way, it is actually simpler.
You defined all your functions at the top. This really isn't part of your main program - they are just
lots of little programs, that you will call upon later. You could even re-use these in another
program if you needed them, and didn't want to tell the computer how to add and subtract again.
If you look at the main part of the program (between the line 'loop = 1' and 'print "Thankyou
for..."'), it is only 15 lines of code. That means that if you wanted to write this program differently,
you would only have to write 15 or so lines, as opposed to the 34 lines you would normally have
to without functions.
Finally, as a bit of an interlude, I will explain what the line add(input("Add this:
"),input("to this: ")) means.
I wanted to fit everything onto one line, with as few variables as possible. Remember what
functions look like to the main program? Whatever value they return. If the numbers you passed
to the add() function were 2 and 30, the main program would see this:
The add program would then run, adding 2 and 30, then printing the result. The add program has
no 'return' operator - it doesn't return anything to the main program. It simply adds two numbers
and prints them onscreen, and the main program doesn't see anything of it.
Instead of (input("Add this: "),input("to this: ")) as the parameters for the add
program you could have variables. E.g.
For the above, remember that the function you are passing the variables to cannot change the
variables themselves - they are simply used as values. You could even put the values straight into
the function:
This is because the only thing the function sees are the values that are passed on as parameters.
Those values are put into the variables that are mentioned when 'add' is defined (the line 'def
add(a,b)' ). The function then uses those parameters to do it's job.
In short:
• The only thing functions see of the main program is the parameters that are passed to it
• the only thing the main program seens of functions is the returned value that it passes back
Conclusion
WHOA!!!! WHAT A KILLER LESSON!!! But we got through it, and I made minimal typos.
Great!
I haven't decided what will happen in lesson 6. All I can say is I am having a BIG breather,
because this lesson took me many hours to write.
Thanks to all,
Your brain still hurting from the last lesson? Never worry, this one will require a little less
thought. We're going back to something simple - variables - but a little more in depth.
Think about it - variables store one bit of information. They may regurgitate (just not on the
carpet...) that information at any point, and their bit of information can be changed at any time.
Variables are great at what they do - storing a piece of information that may change over time.
But what if you need to store a long list of information, which doesn't change over time? Say, for
example, the names of the months of the year. Or maybe a long list of information, that does
change over time? Say, for example, the names of all your cats. You might get new cats, some
may die, some may become your dinner (we should trade recipies!). What about a phone book?
For that you need to do a bit of referencing - you would have a list of names, and attached to each
of those names, a phone number. How would you do that?
For these three problems, Python uses three different solutions - Tuples, lists, and dictionaries:
• Lists are what they seem - a list of values. Each one of them is numbered, starting from
zero - the first one is numbered zero, the second 1, the third 2, etc. You can remove values
from the list, and add new values to the end. Example: Your many cats' names.
• Tuples are just like lists, but you can't change their values. The values that you give it first
up, are the values that you are stuck with for the rest of the program. Again, each value is
numbered starting from zero, for easy reference. Example: the names of the months of the
year.
• Dictionaries are similar to what their name suggests - a dictionary. In a dictionary, you
have an 'index' of words, and for each of them a definition. In python, the word is called a
'key', and the definition a 'value'. The values in a dictionary aren't numbered - tare similar
to what their name suggests - a dictionary. In a dictionary, you have an 'index' of words,
and for each of them a definition. In python, the word is called a 'key', and the definition a
'value'. The values in a dictionary aren't numbered - they aren't in any specific order, either
- the key does the same thing. You can add, remove, and modify the values in dictionaries.
Example: telephone book.
Tuples
Tuples are pretty easy to make. You give your tuple a name, then after that the list of values it will
carry. For example, the months of the year:
• Note that the '\' thingy at the end of sthurlow.comthe first line carries over that line of code
to the next line. It is usefull way of making big lines more readable.
• Technically you don't have to put those parentheses there (the '(' and ')' thingies) but it
stops python from getting things confused.
• You may have spaces after the commas if you feel it necessary - it doesn't really matter.
Python then organises those values in a handy, numbered index - starting from zero, in the order
that you entered them in. It would be organised like this:
Lists
Lists are extremely similar to tuples. Lists are modifiable (or 'mutable', as a programmer may
say), so their values can be changed. Most of the time we use lists, not tuples, because we want to
easily change the values of things if we need to.
Lists are defined very similarly to tuples. Say you have FIVE cats, called Tom, Snappy, Kitty,
Jessie and Chester. To put them in a list, you would do this:
You recall values from lists exactly the same as you do with tuples. For example, to print the
name of your 3rd cat you would do this:
You can also recall a range of examples, like above, for example - cats[0:2] would recall your 1st
and 2nd cats.
Where lists come into their own is how they can be modified. To add a value to a list, you use the
'append()' function. Let's say you got a new cat called Catherine. To add her to the list you'd do
this:
That's a little weird, isn't it? I'll explain. That function is in a funny spot - after a period (the '.'
kind of period, not otherwise), after the list name. You'll get to see those things more in a later
lesson. For the meanwhile, this is the form of the function that adds a new value to a list:
Now to a sad situation - Snappy was shot by a neighbour, and eaten for their dinner (good on
'em!). You need to remove him (or her) from the list. Removing that sorry cat is an easy task,
thankfully, so you have to wallow in sadness for as short a time as possible:
You've just removed the 2nd cat in your list - poor old Snappy.
Dictionaries
Ok, so there is more to life than the names of your cats. You need to call your sister, mother, son,
the fruit man, and anyone else who needs to know that their favourite cat is dead. For that you
need a telephone book.
Now, the lists we've used above aren't really suitable for a telephone book. You need to know a
number based on someone's name - not the other way around, like what we did with the cats. In
the examples of months and cats, we gave the computer a number, and it gave us a name. This
time we want to give the computer a name, and it give us a number. For this we need
Dictionaries.
So how do we make a dictionary? Put away your binding equipment, it isn't that advanced.
Remember, dictionaries have keys, and values. In a phone book, you have people's names, then
their numbers. See a similarity?
When you initially create a dictionary, it is very much like making a tuple or list. Tuples have
( and ) things, lists have [ and ] things. Guess what! dictionaries have { and } things - curly
braces. Here is an example below, showing a dictionary with four phone numbers in it:
the program would then print Lewis Lame's number onscreen. Notice how instead of identifying
the value by a number, like in the cats and months examples, we identify the value, using another
value - in this case the person's name.
Ok, you've created a new phone book. Now you want to add new numbers to the book. What do
you do? A very simple line of code:
All that line is saying is that there is a person called Gingerbread Man in the phone book, and his
number is 1234567. In other words - the key is 'Gingerbread Man', and the value is 1234567.
You delete entries in a dictionary just like in a list. Let's say Andrew Parson is your neighbour,
and shot your cat. You never want to talk to him again, and therefore don't need his number. Just
like in a list, you'd do this:
Again, very easy. the 'del' operator deletes any function, variable, or entry in a list or dictionary
(An entry in a dictionary is just a variable with a number or text string as a name. This comes in
handy later on.)
remember that append function that we used with the list? Well, there are quite a few of those that
can be used with dictionaries. Below, I will write you a program, and it will incorporate some of
those functions in. It will have comments along the way explaining what it does.
Type this program into Python IDLE (you can skip the comments). Experiment as much as you
like with it. Type it where you see the lines beginning with >>>
else:
print "Sue is not in the dictionary"
#Put it in a list:
values = ages.values()
print values
values.sort()
print values
There are many other functions you can use to work with lists and dictionaries - too many to go
through right now. We'll leave the lesson at this point - you have learnt enough for one lesson.
Thanks to all
Well, in the first lesson about loops, I said I would put off teaching you the for loop, until we had
reached lists. Well, here it is!
Basically, the for loop does something for every value in a list. The way it is set out is a little
confusing, but otherwise is very basic. Here is an example of it in code:
As you see, when the loop executes, it runs through all of the values in the list mentioned after
'in'. It then puts them into value, and executes through the loop, each time with value being
worth something different. Let's see it a again, in a classic cheerleading call that we all know:
• As you see, strings (remember - strings are lines of text) are just lists with lots of
characters.
• The program went through each of the letters (or values) in word, and it printed them
onscreen.
Now to the business end of the lesson. Lets start writing programs. So far we have learnt
variables, lists, loops, and functions. That is pretty much all we need for quite a bit of
programming. So let's set ourselves a task.
return input(question) - 1
# print ") " + entry prints a bracket, and then the entry name
That wasn't very difficult, was it? the actual program only took up five lines - this is the wonder of
how much we have learnt so far! All my comments take up sixteen lines - more than three times
the program length. It is a good idea to comment your programs extensively. Remember that if
you are going to be publishin gyour code open-source, there are going to be a lot of people
checking out the code that you have written. We'll see the function we just wrote in our first
example program.
What will our first example program be? How about a (very) simple text adventure game? Sounds
like fun! It will only encompass one room of a house, and will be extremely simple. There will be
five things, and a door. In one of the five things, is a key to the door. You need to find the key,
then open the door. I will give a plain-english version first, then do it in python:
Give the player a well done message, for completing the game.
From this, we can write a real program. Ready? Here it is (skip typing the comments):
return input(question) - 1
#The key is in the vase (or entry number 2 in the list above):
keylocation = 2
loop = 1
print "Now, you find yourself locked in a room. You don't know how"
print "you got there, or what time it is. In the room you can see"
print len(items), "things:"
for x in items:
print x
print ""
print "The door is locked. Could there be a key somewhere?"
#Get your menu working, and the program running until you find the key:
while loop == 1:
choice = menu(items,"What do you want to inspect? ")
if choice == 0:
if choice == keylocation:
print "You found a small key in the pot plant."
print ""
keyfound = 1
else:
print "You found nothing in the pot plant."
print ""
elif choice == 1:
if choice == keylocation:
print "You found a small key behind the painting."
print ""
keyfound = 1
else:
print "You found nothing behind the painting."
print ""
elif choice == 2:
if choice == keylocation:
print "You found a small key in the vase."
print ""
keyfound = 1
else:
print "You found nothing in the vase."
print ""
elif choice == 3:
if choice == keylocation:
print "You found a small key in the lampshade."
print ""
keyfound = 1
else:
print "You found nothing in the lampshade."
print ""
elif choice == 4:
if choice == keylocation:
print "You found a small key in the shoe."
print ""
keyfound = 1
else:
print "You found nothing in the shoe."
print ""
elif choice == 5:
if keyfound == 1:
loop = 0
print "You put in the key, turn it, and hear a click"
print ""
else:
print "The door is locked, you need to find a key."
print ""
Well, a very simple, but fun, game. Don't get daunted by the amount of code there, 53 of the lines
are just the 'if' statements, which is the easiest thing to read there (Once you comprehend all the
indentation. Soon you'll make your own game, and you can make it as simple (or as complex) as
you like. I'll post quite a few, later.
Making the game better
The fist question you should ask is "does this program work?". The answer here is yes. Then you
should ask "does this program work well?" - not quite. The menu() function is great - it reduces a
lot of typing. The 'while' loop that we have, however, is a little messy - four levels of indents, for a
simple program. We can do better!
Now, this will become much MUCH more straightforward when we introduce classes. But that
will have to wait. Until then, let's make a function that reduces our mess. It we will pass two
things to it - the menu choice we made, and the location of the key. It will return one thing -
whether or not the key has been found. Lets see it:
Now the main program can be a little simpler. Let's take it from the while loop, and change things
around:
Now the program becomes massively shorter - from a cumbersome 83 lines, to a very shapely 50
lines! Of course, you lose quite a bit of versatility - all the items in the room do the same thing.
You automatically open the door when you find the key. The game becomes a little less
interesting. It also becomes a little harder to change.
conclusion
Now I said you would write some programs now. Here is your chance! Your task, if you chose to
accept it, is to post a better text adventure game. You can use any of the code I have given you
here. Remember to check back on previous lessons we have done - they are priceless tools. Do a
search for some simple text adventure games - if you find some nice, fun text adventure games,
have a look at them.
Thanks to all,
8 - Classes
Introduction
One thing that you will get to know about programming, is that programmers like to be lazy. If
something has been done before, why should you do it again?
That is what functions cover in python. You've already had your code do something special. Now
you want to do it again. You put that special code into a function, and re-use it for all it is worth.
You can refer to a function anywhere in your code, and the computer will always know what you
are talking about. Handy, eh?
Of course, functions have their limitations. Functions don't store any information like variables do
- every time a function is run, it starts afresh. However, certain functions and variables are related
to each other very closely, and need to interact with each other a lot. For example, imagine you
have a golf club. It has information about it (i.e. variables) like the length of the shaft, the material
of the grip, and the material of the head. It also has functions associated with it, like the function
of swinging your golf club, or the function of breaking it in pure frustration. For those functions,
you need to know the variables of the shaft length, head material, etc.
That can easily be worked around with normal functions. Parameters affect the effect of a
function. But what if a function needs to affect variables? What happens if each time you use your
golf club, the shaft gets weaker, the grip on the handle wears away a little, you get that little more
frustrated, and a new scratch is formed on the head of the club? A function cannot do that. A
function only makes one output, not four or five, or five hundred. What is needed is a way to
group functions and variables that are closely related into one place so that they can interact with
each other.
Chances are that you also have more than one golf club. Without classes, you need to write a
whole heap of code for each different golf club. This is a pain, seeing that all clubs share common
features, it is just that some have changed properties - like what the shaft is made of, and it's
weight. The ideal situation would be to have a design of your basic golf club. Each time you
create a new club, simply specify its attributes - the length of its shaft, its weight, etc.
Or what if you want a golf club, which has added extra features? Maybe you decide to attach a
clock to your golf club (why, I don't know - it was your idea). Does this mean that we have to
create this golf club from scratch? We would have to write code first for our basic golf club, plus
all of that again, and the code for the clock, for our new design. Wouldn't it be better if we were to
just take our existing golf club, and then tack the code for the clock to it?
These problems that a thing called object-oriented-programming solves. It puts functions and
variables together in a way that they can see each other and work together, be replicated, and
altered as needed, and not when unneeded. And we use a thing called a 'class' to do this.
Creating a Class
What is a class? Think of a class as a blueprint. It isn't something in itself, it simply describes how
to make something. You can create lots of objects from that blueprint - known technically as an
instance.
So how do you make these so-called 'classes'? very easily, with the class operator:
Code Example 1 - defining a class
# Defining a class
class class_name:
[statement 1]
[statement 2]
[statement 3]
[etc]
Makes little sense? Thats ok, here is an example, that creates the definition of a Shape:
What you have created is a description of a shape (That is, the variables) and what operations you
can do with the shape (That is, the fuctions). This is very important - you have not made an actual
shape, simply the description of what a shape is. The shape has a width (x), a height (y), and an
area and perimeter (area(self) and perimeter(self)). No code is run when you define a class - you
are simply making functions and variables.
The function called __init__ is run when we create an instance of Shape - that is, when we create
an actual shape, as opposed to the 'blueprint' we have here, __init__ is run. You will understand
how this works later.
self is how we refer to things in the class from within itself. self is the first parameter in any
function defined inside a class. Any function or variable created on the first level of indentation
(that is, lines of code that start one TAB to the right of where we put class Shape is
automatically put into self. To access these functions and variables elsewhere inside the class,
their name must be preceeded with self and a full-stop (e.g. self.variable_name).
Using a class
Its all well and good that we can make a class, but how do we use one? Here is an example, of
what we call creating an instance of a class. Assume that the code example 2 has already been run:
Think of our class instance, rectangle, as a self-contained collection of variables and functions.
In the same way that we used self to access functions and variables of the class instance from
within itself, we use the name that we assigned to it now (rectangle) to access functions and
variables of the class instance from outside of itself. Following on from the code we ran above,
we would do this:
As you see, where self would be used from within the class instance, its assigned name is used
when outside the class. We do this to view and change the variables inside the class, and to access
the functions that are there.
We aren't limited to a single instance of a class - we could have as many instances as we like. I
could do this:
and both longrectangle and fatrectangle have their own functions and variables contained
inside them - they are totally independent of each other. There is no limit to the number of
instances I could create.
Lingo
Object-oriented-programming has a set of lingo that is associated with it. Its about time that we
have this all cleared up:
Inheritance
Lets have a look back at the introduction. We know how classes group together variables and
functions, known as attributes and methods, so that both the data and the code to process it is in
the same spot. We can create any number of instances of that class, so that we don't have to write
new code for every new object we create. But what about adding extra features to our golf club
design? This is where inheritance comes into play.
Python makes inheritance really easily. We define a new class, based on another, 'parent' class.
Our new class brings everything over from the parent, and we can also add other things to it. If
any new attributes or methods have the same name as an attribute or method in our parent class, it
is used instead of the parent one. Remember the Shape class?
If we wanted to define a new class, lets say a square, based on our previous Shape class, we
would do this:
It is just like normally defining a class, but this time we put in brackets after the name, the parent
class that we inherited from. As you see, we described a square really quickly because of this.
That's because we inherited everything from the shape class, and changed only what needed to be
changed. In this case we redefined the __init__ function of Shape so that the X and Y values are
the same.
Let's take from what we have learnt, and create another new class, this time inherited from
Square. It will be two squares, one immediately left of the other:
class DoubleSquare(Square):
def __init__(self,y):
self.x = 2 * y
self.y = y
def perimeter(self):
return 2 * self.x + 3 * self.y
This time, we also had to redefine the perimeter function, as there is a line going down the
middle of the shape. Try creating an instance of this class. As a helpful hint, the idle command
line starts where your code ends - so typing a line of code is like adding that line to the end of the
program you have written.
Thinking back, when you say that one variable equals another, e.g. variable2 = variable1, the
variable on the left-hand side of the equal-sign takes on the value of the variable on the right. With
class instances, this happens a little differently - the name on the left becomes the class instance
on the right. So in instance2 = instance1, instance2 is 'pointing' to instance1 - there are
two names given to the one class instance, and you can access the class instance via either name.
In other languages, you do things like this using pointers, however in python this all happens
behind the scenes.
The final thing that we will cover is dictionaries of classes. Keeping in mind what we have just
learnt about pointers, we can assign an instance of a class to an entry in a list or dictionary. This
allows for virtually any amount of class instances to exist when our program is run. Lets have a
look at the example below, and see how it describes what I am talking about:
As you see, we simply replaced our boring old name on the left-hand side with an exciting, new,
dynamic, dictionary entry. Pretty cool, eh?
Conclusion
And that is the lesson on classes! You won't believe how long it took me to write this in a clear-cut
manner, and I am still not completely satisfied! I have already gone through and rewritten half of
this lesson once, and if you're still confused, I'll probably go through it again. I've probably
confused some of you with my own confusion on this topic, but remember - it is not something's
name that is important, but what it does (this doesn't work in a social setting, believe me... ;)).
Thanks to all,
9 - Modules
Introduction
Last lesson we covered the killer topic of Classes. As you can remember, classes are neat
combinations of variables and functions in a nice, neat package. Programming lingo calls this
feature encapsulation, but reguardless of what it is called, it's a really cool feature for keeping
things together so the code can be used in many instances in lots of places. Of course, you've got
to ask, "how do I get my classes to many places, in many programs?". The answer is to put them
into a module, to be imported into other programs.
A module is a python file that (generally) has only defenitions of variables, functions, and classes.
For example, a module might look like this:
def timesfour(input):
print input * 4
# define a class
class Piano:
def __init__(self):
self.type = raw_input("What type of piano? ")
self.height = raw_input("What height (in feet)? ")
self.price = raw_input("How much did it cost? ")
self.age = raw_input("How old is it (in years)? ")
def printdetails(self):
print "This piano is a/an " + self.height + " foot",
print self.type, "piano, " + self.age, "years old and costing\
" + self.price + " dollars."
As you see, a module looks pretty much like your normal python program.
So what do we do with a module? We import bits of it (or all of it) into other programs.
To import all the variables, functions and classes from moduletest.py into another program you
are writing, we use the import operator. For example, to import moduletest.py into your main
program, you would have this:
This assumes that the module is in the same directory as mainprogram.py, or is a default module
that comes with python. You leave out the '.py' at the end of the file - it is ignored. You normally
put all import statements at the beginning of the python file, but technically they can be anywhere.
In order to use the items in the module in your main program, you use the following:
As you see, the modules that you import act very much like the classes we looked at last lesson -
anything inside them must be preceeded with modulename. for it to work.
Wish you could get rid of the modulename. part that you have to put before every item you use
from a module? No? Never? Well, I'll teach it you anyway.
One way to avoid this hassle is to import only the wanted objects from the module. To do this,
you use the from operator. You use it in the form of from modulename import itemname. Here
is an example:
# import them
from moduletest import ageofqueen
from moduletest import printhello
What is the point of this? Well, maybe you could use it to make your code a little more readable.
If we get into heaps of modules inside modules, it could also remove that extra layer of
crypticness.
If you wanted to, you could import everything from a module is this way by using from
modulename import *. Of course, this can be troublesome if there are objects in your program
with the same name as some items in the module. With large modules, this can easily happen, and
can cause many a headache. A better way to do this would be to import a module in the normal
way (without the from operator) and then assign items to a local name:
This way, you can remove some crypticness, AND have all of the items from a certain module.
Conclusion
That's it! A very simple lesson, but now you can organise your programs very neatly. In fact, now
it is increadibly easy to make progams that can grow in complexity without ending up with one
cryptic file that is full of bugs.
Modules are great for importing code. Next lesson, we learn about file input and output, and the
saving of information inside classes, to be retrieved later. Will be great! But until then...
Thanks to all,
10 - File I/O
Introduction
Last lesson we learnt how to load external code into our program. Without any introduction (like
what I usually have), let's delve into file input and output with normal text files, and later the
saving and restoring of instances of classes. (Wow, our lingo power has improved greatly!)
Opening a file
To open a text file you use, well, the open() function. Seems sensible. You pass certain parameters
to open() to tell it in which way the file should be opened - 'r' for read only, 'w' for writing only (if
there is an old file, it will be written over), 'a' for appending (adding things on to the end of the
file) and 'r+' for both reading and writing. But less talk, lets open a file for reading (you can do
this in your python idle mode). Open a normal text file. We will then print out what we read inside
the file:
That was interesting. You'll notice a lot of '\n' symbols. These represent newlines (where you
pressed enter to start a new line). The text is completely unformatted, but if you were to pass the
output of openfile.read() to print (by typing print openfile.read()) it would be nicely
formatted.
Did you try typing in print openfile.read()? Did it fail? It likely did, and reason is because
the 'cursor' has changed it's place. Cursor? What cursor? Well, a cursor that you really cannot see,
but still a cursor. This invisible cursor tells the read function (and many other I/O functions)
where to start from. To set where the cursor is, you use the seek() function. It is used in the form
seek(offset, whence).
whence is optional, and determines where to seek from. If whence is 0, the bytes/letters are
counted from the beginning. If it is 1, the bytes are counted from the current cursor position. If it
is 2, then the bytes are counted from the end of the file. If nothing is put there, 0 is assumed.
offset decribes how far from whence that the cursor moves. for example:
Try it out now. Use openfile.seek() to go to any spot in the file and then try typing print
openfile.read(). It will print from the spot you seeked to. But realise that openfile.read()
moves the cursor to the end of the file - you will have to seek again.
There are many other functions that help you with dealing with files. They have many uses that
empower you to do more, and make the things you can do easier. Let's have a look at tell(),
readline(), readlines(), write() and close().
tell() returns where the cursor is in the file. It has no parameters, just type it in (like what the
example below will show). This is infinitely useful, for knowing what you are refering to, where it
is, and simple control of the cursor. To use it, type fileobjectname.tell() - where
fileobjectname is the name of the file object you created when you opened the file (in
openfile = open('pathtofile', 'r') the file object name is openfile).
readline() reads from where the cursor is till the end of the line. Remember that the end of the
line isn't the edge of your screen - the line ends when you press enter to create a new line. This is
useful for things like reading a log of events, or going through something progressively to process
it. There are no parameters you have to pass to readline(), though you can optionally tell it the
maximum number of bytes/letters to read by putting a number in the brackets. Use it with
fileobjectname.readline().
readlines() is much like readline(), however readlines() reads all the lines from the cursor
onwards, and returns a list, with each list element holding a line of code. Use it with
fileobjectname.readlines(). For example, if you had the text file:
Line 3
Line 4
Line 6
The write() function, writes to the file. How did you guess??? It writes from where the cursor is,
and overwrites text in front of it - like in MS Word, where you press 'insert' and it writes over the
top of old text. To utilise this most purposeful function, put a string between the brackets to write
e.g. fileobjectname.write('this is a string').
close, you may figure, closes the file so that you can no longer read or write to it until you
reopen in again. Simple enough. To use, you would write fileobjectname.close(). Simple!
In Python idle mode, open up a test file (or create a new one...) and play around with these
functions. You can do some simple (and very inconvenient) text editing.
Mmm, Pickles
Pickles, in Python, are to be eaten. Their flavour is just to good to let programmers leave them in
the fridge.
Ok, just joking there. Pickles, in Python, are objects saved to a file. An object in this case could be
a variables, instance of a class, or a list, dictionary, or tuple. Other things can also be pickled, but
with limits. The object can then be restored, or unpickled, later on. In other words, you are 'saving'
your objects.
So how do we pickle? With the dump() function, which is inside the pickle module - so at the
beginning of your program you will have to write import pickle. Simple enough? Then open an
empty file, and use pickle.dump() to drop the object into that file. Let's try that:
After you close the file, open it in notepad and look at what you see. Along with some other
gibblygook, you will see bits of the list we created.
Now to re-open, or unpickle, your file. to use this, we would use pickle.load():
Nifty, eh?
Of course, the limitation above is that we can only put in one object to a file. We could get around
this by putting lots of picklable objects in a list or dictionary, and then pickling that list or
dictionary. This is the quickest and easiest way, but you can do some pretty advanced stuff if you
have advanced knowledge of pickle.
Conclusion
Thanks to all,
11 - Exception Handling
Introduction
If you haven't seen them before, you're not trying hard enough. What are they? Errors.
Exceptions. Problems. Know what I'm talking about? I got it with this program:
Code Example 1 - buggy program
def menu(list, question):
for entry in list:
print 1 + list.index(entry),
print ") " + entry
return input(question) - 1
This is just an example of the menu program we made earlier. Appears perfectly fine to me. At
least until when I first tried it. Run the program, and what happens?
The most common problems with your code are of your own doing. Sad, but true. What do we see
when we try to run our crippled program?
Say what? What python is trying to tell you (but struggling to find a good word for it) is that you
can't join a string of letters and a number into one string of text. Let's go through the error
message and have a look at how it tells us that:
There are muliple file and code listings for a single error, because the error occured with the
interaction of two lines of code (e.g. when using a function, the error occured on the line where
the function was called, AND the line in the function where things went wrong).
Now that we know what the problem is, how do we fix it. Well, the error message has isolated
where the problem is, so we'll only concentrate on that bit of code.
raw_input always returns a string, hence our problem. Let's change it to input(), which, when you
type in a number, it returns a number:
Bug fixed!
OK, the program works when you do something normal. But what if you try something weird?
Type in a letter (lets say, 'm') instead of a number? Whoops!
What is this telling us? There are two code listings - one in line 8, and the other in line 6. What
this is telling us is that when we called the menu function in line 8, an error occured in line 6
(where we take away 1). This makes sense if you know what the input() function does - I did a
bit of reading and testing, and realised that if you type in a letter or word, it will assume that you
are mentioning a variable! so in line 6, we are trying to take 1 away from the variable 'm', which
doesn't exist.
Have no clue on how to fix this? One of the best and easiest ways is to use the try and except
operators.
This is an example of a really messy bit of code that I was trying to fix. First, the code under try:
is run. If there is an error, the compiler jumps to the except section and prints world.errormsg.
The program doesn't stop right there and crash, it runs the code under except: then continues on.
Lets try that where the error occured in our code (line 6). The menu function now is:
Try entering a letter when you're asked for a number and see what happens. Dang. We fixed one
problem, but now it has caused another problem furthur down the track. This happens all the time.
(Sometimes you end up going around in circles, because your code is an absolute mess). Let's
have a look at the error:
What has happened this time is that the menu function has returned no value - it only printed an
error message. When, at the end of the program, we try to print the returned value plus 1, what is
the returned value? There is no returned value? So what is 1 + ... well, we have no clue what we
are adding 1 to!
We could just return any old number, but that would be lying. What we really should to is rewrite
the program to cope with this exception. With what? try and except!
Endless Errors
The approach that we used above is not recomended. Why? Because apart from the error that we
know can happen, except: catches every other error too. What if this means we never see an
error that could cause problems down the track? If except: catches every error under the sun, we
have no hope of controlling what errors we deal with, and the other ones that we want to see,
because so far we haven't dealt with them. We also have little hope of dealing with more than one
type of error in the same block of code. What should one do, when all is hopeless? Here is an
example of code with such a situation:
Ok, you enter your two numbers and it works. Enter a letter, and it gives you a NameError. Lets
rewrite the code to deal with a NameError only. We'll put the program in a loop, so it restarts if an
error occurs (using continue, which starts the loop from the top again, and break, which leaves
the loop):
Here, we restarted the loop if you typed in something wrong. In line 12 we assumed you wanted
to quit the program if you didn't press 1, so we quit the program.
But there are still problems. If we leave something blank, or type in an unusual character like ! or
;, the program gives us a SyntaxError. Lets deal with this. When we are asking for the numbers
to subtract, we will give a different error message. When we ask to press 1, we will again assume
the user wants to quit.
As you can see, you can have multiple except uses, each dealing with a different problem. You
can also have one except to deal with multiple exceptions, by putting them inside parentheses
and seperating them with commas.
Now we have a program that is very difficult, to crash by an end user. As a final challenge, see if
you can crash it. There is one way I have thought of - if you read the chapter on Human Error
carefully, you might know what it is.
There you go! The final lesson on python! Finally we are finished. That is, unless you want to also
know XML. Civilization IV and XML don't really interact directly, so we won't worry about that
for the moment - plus, some great and very helpful posters on the CFC Civ4 C&C Forum (take
that!) have already helped you out there. There will be an introduction or two to Civilization IV
python specifics, and then you should be on your way. See you there!
For those of you not doing this for the gaming, thanks for reading. May your pythoning be forever
successful, and if you need to find anything out, try the Python home page for an exhaustive
resource on everything from 2D game programming, to multithreading, to XML parsing. There
really is a huge amount of stuff you can now do, and the best way to learn, is to go and find out.
Thanks to all,