Non-Programmers Tutorial For Python 3 - 2 Print Version

Download as pdf or txt
Download as pdf or txt
You are on page 1of 31

Non-Programmers Tutorial for Python

3/Print version

All example Python source code in this tutorial is granted 0.2 First things rst
to the public domain. Therefore you may modify it and
relicense it under any license you please. Since you are
So, you've never programmed before. As we go through
expected to learn programming, the Creative Commons
this tutorial, I will attempt to teach you how to program.
Attribution-ShareAlike license would require you to keep
There really is only one way to learn to program. You
all programs that are derived from the source code in
must read code and write code (as computer programs are
this tutorial under that license. Since the Python source
often called). I'm going to show you lots of code. You
code is granted to the public domain, that requirement is
should type in code that I show you to see what happens.
waived.
Play around with it and make changes. The worst that can
This tutorial is more or less a conversion of Non- happen is that it won't work. When I type in code it will
Programmers Tutorial for Python 2.6. Older versions be formatted like this:
and some versions in Korean, Spanish, Italian and Greek
##Python is easy to learn print(Hello, World!")
are available from http://jjc.freeshell.org/easytut/
The Non-Programmers Tutorial For Python 3 is a tutorial
Thats so it is easy to distinguish from the other text. If
designed to be an introduction to the Python program-
you're reading this on the Web, you'll notice the code is
ming language. This guide is for someone with no pro-
in color -- thats just to make it stand out, and to make the
gramming experience.
dierent parts of the code stand out from each other. The
If you have programmed in other languages I recommend code you enter will probably not be colored, or the colors
using Python Tutorial for Programmers written by Guido may be dierent, but it won't aect the code as long as
van Rossum. you enter it the same way as its printed here.
If you have any questions or comments please use the dis- If the computer prints something out it will be formatted
cussion pages or see Authors page for author contact in- like this:
formation. I welcome questions and comments about this
Hello, World!
tutorial. I will try to answer any questions you have as best
I can. (Note that printed text goes to your screen, and does not
involve paper. Before computers had screens, the output
Thanks go to James A. Brown for writing most of the
of computer programs would be printed on paper.)
Windows install info. Thanks also to Elizabeth Cogliati
for complaining enough :) about the original tutorial (that Note that this is a Python 3 tutorial, which means that
is almost unusable for a non-programmer), for proofread- most of the examples will not work in Python 2.7 and
ing, and for many ideas and comments on it. Thanks before. As well, some of the extra libraries (third-party
to Joe Oppegaard for writing almost all the exercises. libraries) have not yet been converted. You may want
Thanks to everyone I have missed. to consider learning from the Non-Programmers Tuto-
rial for Python 2.6. However, the dierences between
versions are not particularly large, so if you learn one,
you should be able to read programs written for the other
0.1 Other resources without much diculty.
There will often be a mixture of the text you type (which
Python Home Page is shown in bold) and the text the program prints to the
screen, which would look like this:
Halt! Who Goes there? Josh You may pass, Josh
Python 3 Documentation
(Some of the tutorial has not been converted to this for-
mat. Since this is a wiki, you can convert it when you nd
A Byte of Python by Swaroop C H it.)
I will also introduce you to the terminology of program-
Porting to Python 3: An in-depth guide ming - for example, that programming is often referred to

1
2

as coding or hacking. This will not only help you under- Change to the directory and tell the computer to
stand what programmers are talking about, but also help compile and install the program
the learning process.
Now, on to more important things. In order to program $ cd Python-3.4/ $ ./congure --
in Python you need the Python 3 software. If you don't prex=$HOME/python3_install ... lots of output.
already have the Python software go to www.python.org/ Watch for error messages here ... $ make ... even more
download and get the proper version for your platform. output. Hopefully no error messages ... $ make install
Download it, read the instructions and get it installed.
Add Python 3 to your path. You can test it
rst by specifying the full path. You should add
0.3 Installing Python $HOME/python3_install/bin to your PATH bash
variable.
For Python programming you need a working Python in-
stallation and a text editor. Python comes with its own $ ~/python3_install/bin/python3 Python 3.4.3 (... size
editor, IDLE, which is quite nice and totally sucient for and date information ...) [GCC 4.5.2] on linux2 Type
the beginning. As you get more into programming, you help, copyright, credits or license for more infor-
will probably switch to some other editor like emacs, vi mation. >>>
or another.
The above commands will install Python 3 to your home
The Python download page is http://www.python.org/ directory, which is probably what you want, but if you
download. The most recent version is Python 3.5.1 (as of skip the --prex=$HOME/python3_install, it will install
February 2016); Python 2.7 and older versions will not it to /usr/local. If you want to use the IDLE graphical
work with this tutorial. There are various dierent in- code editor, you need to make sure that the tk and tcl
stallation les for dierent computer platforms available libraries, together with their development les, are in-
on the download site. Here are some specic instructions stalled on the system. You will get a warning during the
for the most common operating systems: make phase if these are not available.

0.3.1 Linux, BSD, and Unix users


0.3.2 Mac users
You are probably lucky and Python is already installed on
Starting from Mac OS X Tiger, Python ships by default
your machine. To test it type python3 on a command line.
with the operating system, but you will need to update to
If you see something like what is shown in the following
Python 3 until OS X starts including Python 3 (check the
section, you are set.
version by starting python3 in a command line terminal).
IDLE may need to be installed separately, from its own Also IDLE (the Python editor) might be missing in the
package such as idle3 or as part of python-tools. standard installation. If you want to (re-)install Python,
If you have to install Python, rst try to use the operating get the MacOS installer from the Python download site.
systems package manager or go to the repository where
your packages are available and get Python 3. Python 3.0
0.3.3 Windows users
was released in December 2008; all distributions should
have Python 3 available, so you may not need to compile
Download the appropriate Windows installer (the x86
it from scratch. Ubuntu and Fedora do have Python 3
MSI installer, if you do not have a 64-bit AMD or Intel
binary packages available, but they are not yet the default,
chip). Start the installer by double-clicking it and follow
so they need to be installed specially.
the prompts.
Roughly, here are the steps to compile Python from
See https://docs.python.org/3/using/windows.html#
source code in Unix (If these totally don't make sense,
installing-python for more information.
you may want to read another introduction to *nix, such
as Introduction to Linux):
Conguring your PATH environment variable The
Download the .tgz le (use your Web browser to get PATH environment variable is a list of folders, separated
the gzipped tar le from https://www.python.org/ by semicolons, in which Windows will look for a program
downloads/release/python-343) whenever you try to execute one by typing its name at a
Command Prompt. You can see the current value of your
Uncompress the tar le (put in the correct path to PATH by typing this command at a Command Prompt:
where you downloaded it):
echo %PATH%
$ tar -xvzf ~/Download/Python-3.4.3.tgz ... list of les as The easiest way to permanently change environment vari-
they are uncompressed ables is to bring up the built-in environment variable ed-
0.5 Creating and Running Programs 3

itor in Windows. How you get to this editor is slightly with new Python statements, go into interactive mode and
dierent on dierent versions of Windows. try them out.
On Windows 8: Press the Windows key and type Control
Panel to locate the Windows Control Panel. Once you've 0.5 Creating and Running Programs
opened the Control Panel, select View by: Large Icons,
then click on System. In the window that pops up, click the Go into IDLE if you are not already. In the menu at the
Advanced System Settings link, then click the Environment top, select File then New File. In the new window that
Variables... button. appears, type the following:
On Windows 7 or Vista: Click the Start button in the print(Hello, World!")
lower-left corner of the screen, move your mouse over
Computer, right-click, and select Properties from the pop-
up menu. Click the Advanced System Settings link, then Now save the program: select File from the menu, then
click the Environment Variables... button. Save. Save it as hello.py (you can save it in any folder
you want). Now that it is saved it can be run.
On Windows XP: Right-click the My Computer icon on
your desktop and select Properties. Select the Advanced Next run the program by going to Run then Run Module
tab, then click the Environment Variables... button. (or if you have an older version of IDLE use Edit then Run
script). This will output Hello, World! on the *Python
Once you've brought up the environment variable editor, Shell* window.
you'll do the same thing regardless of which version of
Windows you're running. Under System Variables in the For a more in-depth introduction to IDLE, a longer tu-
bottom half of the editor, nd a variable called PATH. If torial with screenshots can be found at http://hkn.eecs.
there is is one, select it and click Edit.... Assuming your berkeley.edu/~{}dyoo/python/idle_intro/index.html.
Python root is C:\Python34, add these two folders to your
path (and make sure you get the semicolons right; there 0.5.1 Program le names
should be a semicolon between each folder in the list):
C:\Python34 C:\Python34\Scripts It is very useful to stick to some rules regarding the le
names of Python programs. Otherwise some things might
Note: If you want to double-click and start your Python
go wrong unexpectedly. These don't matter as much for
programs from a Windows folder and not have the console
programs, but you can have weird problems if you don't
window disappear, you can add the following code to the
follow them for module names (modules will be discussed
bottom of each script:
later).
#stops console from exiting end_prog = "" while
end_prog != q": end_prog = input(type q to quit) 1. Always save the program with the extension .py. Do
not put another dot anywhere else in the le name.
2. Only use standard characters for le names: letters,
0.4 Interactive Mode numbers, dash (-) and underscore (_).
3. White space (" ") should not be used at all (use un-
Go into IDLE (also called the Python GUI). You should
derscores instead).
see a window that has some text like this:
Python 3.0 (r30:67503, Dec 29 2008, 4. Do not use anything other than a letter (particularly
21:31:07) [GCC 4.3.2 20081105 (Red Hat no numbers!) at the beginning of a le name.
4.3.2-7)] on linux2 Type copyright, cred- 5. Do not use non-English characters (such as , ,
its or license()" for more information. , , , , ) in your le namesor, even better, do
****************************************************************
not use them at all when programming.
Personal rewall software may warn about the con-
nection IDLE makes to its subprocess using this
computers internal loopback interface. This con- 0.6 Using Python from the command line
nection is not visible on any external interface and
no data is sent to or received from the Internet. If you don't want to use Python from the command line,
you don't have to, just use IDLE. To get into interac-
****************************************************************
IDLE 3.0 >>> tive mode just type python3 without any arguments. To
The >>> is Pythons way of telling you that you are in run a program, create it with a text editor (Emacs has
interactive mode. In interactive mode what you type is a good Python mode) and then run it with python3 pro-
immediately run. Try typing 1+1 in. Python will respond gram_name.
with 2. Interactive mode allows you to test out and see Additionally, to use Python within Vim, you may want to
what Python will do. If you ever feel you need to play visit the Python wiki page about VIM.
4

0.6.1 Running Python Programs in *nix Python wiki has a list of local user groups, you can
join the group mailing list and ask questions. You
If you are using Unix (such as Linux, Mac OS X, or BSD), can also participate in the user group meetings.
if you make the program executable with chmod, and
have as the rst line: LearnPython subreddit is another location where be-
ginner level questions can be asked.
#!/usr/bin/env python3

In order not to reinvent the wheel and discuss the same


you can run the python program with ./hello.py like any questions again and again, people will appreciate very
other command. much if you do a web search for a solution to your prob-
lem before contacting these lists!
0.7 Where to get help
0.8 What you should know
At some point in your Python career you will probably get
stuck and have no clue about how to solve the problem Once you've read and mastered this chapter, you should
you are supposed to work on. This tutorial only covers know how to edit programs in a text editor or IDLE, save
the basics of Python programming, but there is a lot of them to the hard disk, and run them once they have been
further information available. saved.

0.7.1 Python documentation


0.9 Printing
First of all, Python is very well documented. There might
Programming tutorials since the beginning of time have
even be copies of these documents on your computer that
started with a little program called Hello, World!"[1] So
came with your Python installation:
here it is:
print(Hello, World!")
The ocial Python 3 Tutorial by Guido van Rossum
is often a good starting point for general questions.
If you are using the command line to run programs then
For questions about standard modules (you will learn type it in with a text editor, save it as hello.py and run it
what these are later), the Python 3 Library Refer- with python3 hello.py
ence is the place to look.
Otherwise go into IDLE, create a new window, and cre-
If you really want to get to know something about ate the program as in section Creating and Running Pro-
the details of the language, the Python 3 Reference grams.
Manual is comprehensive but quite complex for be- When this program is run heres what it prints:
ginners.
Hello, World!
Now I'm not going to tell you this every time, but when I
0.7.2 Python user community show you a program I recommend that you type it in and
run it. I learn better when I type it in and you probably
There are a lot of other Python users out there, and usually do too.
they are nice and willing to help you. This very active user
Now here is a more complicated program:
community is organised mostly through mailing lists and
a newsgroup: print(Jack and Jill went up a hill) print(to fetch a pail
of water;") print(Jack fell down, and broke his crown,)
print(and Jill came tumbling after.)
The tutor mailing list is for folks who want to ask
questions regarding how to learn computer program-
ming with the Python language. When you run this program it prints out:
Jack and Jill went up a hill to fetch a pail of water; Jack
The python-help mailing list is python.orgs help
fell down, and broke his crown, and Jill came tumbling
desk. You can ask a group of knowledgeable vol-
after.
unteers questions about all your Python problems.
When the computer runs this program it rst sees the line:
The Python newsgroup comp.lang.python (Google
groups archive) is the place for general Python dis- print(Jack and Jill went up a hill)
cussions, questions and the central meeting point of
the community. so the computer prints:
0.11 Talking to humans (and other intelligent beings) 5

Jack and Jill went up a hill 0.10.1 Arithmetic expressions


Then the computer goes down to the next line and sees:
In this example, the print function is followed by two
print(to fetch a pail of water;") arguments, with each of the arguments separated by a
comma. So with the rst line of the program
So the computer prints to the screen: print(2 + 2 is, 2 + 2)
to fetch a pail of water;
The computer keeps looking at each line, follows the The rst argument is the string 2 + 2 is and the second
command and then goes on to the next line. The com- argument is the arithmetic expression 2 + 2, which is one
puter keeps running commands until it reaches the end of kind of expression.
the program. What is important to note is that a string is printed as is
(without the enclosing double quotes), but an expression
is evaluated, or converted to its actual value.
0.9.1 Terminology Python has seven basic operations for numbers:

Now is probably a good time to give you a bit of an expla- Notice that there are two ways to do division, one that
nation of what is happening - and a little bit of program- returns the repeating decimal, and the other that can get
ming terminology. the remainder and the whole number. The order of oper-
ations is the same as in math:
What we were doing above was using a function called
print. The functions name - print - is followed by paren- parentheses ()
theses containing zero or more arguments. So in this ex-
ample exponents **
print(Hello, World!") multiplication *, division /, integer division //, and
remainder %
there is one argument, which is Hello, World!". Note addition + and subtraction -
that this argument is a group of characters enclosed in
double quotes (""). This is commonly referred to as a
So use parentheses to structure your formulas when
string of characters, or string, for short. Another example
needed.
of a string is Jack and Jill went up a hill. The combina-
tion of a function and parentheses with the arguments is
a function call. 0.11 Talking to humans (and other intelli-
A function and its arguments are one type of statement gent beings)
that python has, so
Often in programming you are doing something compli-
print(Hello, World!")
cated and may not in the future remember what you did.
When this happens the program should probably be com-
is an example of a statement. Basically, you can think of mented. A comment is a note to you and other program-
a statement as a single line in a program. mers explaining what is happening. For example:
Thats probably more than enough terminology for now. # Not quite PI, but a credible simulation print(22 / 7)

Which outputs
0.10 Expressions
3.14285714286
Here is another program: Notice that the comment starts with a hash: #. Com-
ments are used to communicate with others who read the
print(2 + 2 is, 2 + 2) print(3 * 4 is, 3 * 4) print(100
program and your future self to make clear what is com-
- 1 is, 100 - 1) print("(33 + 2) / 5 + 11.5 is, (33 + 2) / plicated.
5 + 11.5)
Note that any text can follow a comment, and that when
the program is run, the text after the # through to the end
And here is the output when the program is run: of that line is ignored. The # does not have to be at the
2 + 2 is 4 3 * 4 is 12 100 - 1 is 99 (33 + 2) / 5 + 11.5 is beginning of a new line:
18.5 # Output PI on the screen print(22 / 7) # Well, just a
As you can see, Python can turn your thousand-dollar good approximation
computer into a ve-dollar calculator.
6

0.12 Examples 14%6) print(5+6 = ", 5+6) print(9-0 = ", 9-0)

Each chapter (eventually) will contain examples of the


programming features introduced in the chapter. You
should at least look over them and see if you understand 0.13.1 Footnotes
them. If you don't, you may want to type them in and see
what happens. Mess around with them, change them and [1] Here is a great list of the famous Hello, world!" program
see what happens. in many programming languages. Just so you know how
simple Python can be...
Denmark.py
print(Somethings rotten in the state of Denmark.)
print(" -- Shakespeare) 0.14 Input and Variables

Now I feel it is time for a really complicated program.


Output: Here it is:
Somethings rotten in the state of Denmark. -- Shake- print(Halt!") user_input = input(Who goes there? ")
speare print(You may pass,, user_input)
School.py
# This is not quite true outside of USA # and is based on When I ran it, here is what my screen showed:
my dim memories of my younger years print(Firstish Halt! Who goes there? Josh You may pass, Josh
Grade) print(1 + 1 =", 1 + 1) print(2 + 4 =", 2 + 4)
print(5 - 2 =", 5 - 2) print() print(Thirdish Grade) Note: After running the code by pressing F5, the python
print(243 - 23 =", 243 - 23) print(12 * 4 =", 12 * 4) shell will only give output:
print(12 / 3 =", 12 / 3) print(13 / 3 =", 13 // 3, R, Halt! Who goes there?
13 % 3) print() print(Junior High) print(123.56 -
You need to enter your name in the python shell, and then
62.12 =", 123.56 - 62.12) print("(4 + 3) * 2 =", (4 + 3)
press enter for the rest of the output.
* 2) print(4 + 3 * 2 =", 4 + 3 * 2) print(3 ** 2 =", 3 ** 2)
Of course when you run the program your screen will
look dierent because of the input() statement. When
Output:
you ran the program you probably noticed (you did run
Firstish Grade 1 + 1 = 2 2 + 4 = 6 5 - 2 = 3 Thirdish the program, right?) how you had to type in your name
Grade 243 - 23 = 220 12 * 4 = 48 12 / 3 = 4 13 / 3 = 4 R and then press Enter. Then the program printed out some
1 Junior High 123.56 - 62.12 = 61.44 (4 + 3) * 2 = 14 4 more text and also your name. This is an example of in-
+ 3 * 2 = 10 3 ** 2 = 9 put. The program reaches a certain point and then waits
for the user to input some data that the program can use
later.
0.13 Exercises
Of course, getting information from the user would be
1. Write a program that prints your full name and your useless if we didn't have anywhere to put that informa-
birthday as separate strings. tion and this is where variables come in. In the previous
program user_input is a variable. Variables are like a box
2. Write a program that shows the use of all 7 math that can store some piece of data. Here is a program to
functions. show examples of variables:
a = 123.4 b23 = 'Spam' rst_name = Bill b = 432 c =
Solution a + b print(a + b is,c) print(rst_name is,rst_name)
print(Sorted Parts, After Midnight or,b23)
1. Write a program that prints your full name and your
birthday as separate strings. And here is the output:
print(Ada Lovelace, born on, November 27, 1852) a + b is 555.4 rst_name is Bill Sorted Parts, After Mid-
print(Albert Einstein, born on, 14 March 1879) night or Spam
print((John Smith), (born on), (14 March 1879))
Solution Variables store data. The variables in the above program
are a, b23, rst_name, b, and c. The two basic types are
strings and numbers. Strings are a sequence of letters,
2. Write a program that shows the use of all 7 arithmetic numbers and other characters. In this example b23 and
operations. rst_name are variables that are storing strings. Spam,
print(5**5 = ", 5**5) print(6*7 = ", 6*7) print(56/8 Bill, a + b is, rst_name is, and Sorted Parts, After Mid-
= ", 56/8) print(14//6 = ", 14//6) print(14%6 = ", night or are the strings in this program. The characters are
0.16 Examples 7

surrounded by " or '. The other type of variables are num- Notice that number was created with oat(input()) while
bers. Remember that variables are used to store a value, text was created with input(). input() returns a string
they do not use quotation marks (" and '). If you want to while the function oat returns a number from a string.
use an actual value, you must use quotation marks. int returns an integer, that is a number with no decimal
value1 == Pim value2 == Pim point. When you want the user to type in a decimal use
oat(input()), if you want the user to type in an integer use
int(input()), but if you want the user to type in a string use
Both look the same, but in the rst one Python checks input().
if the value stored in the variable value1 is the same as
the value stored in the variable Pim. In the second one, The second half of the program uses the type() function
Python checks if the string (the actual letters P,i, and m) which tells what kind a variable is. Numbers are of type
are the same as in value2 (continue this tutorial for more int or oat, which are short for integer and oating point
explanation about strings and about the ==). (mostly used for decimal numbers), respectively. Text
strings are of type str, short for string. Integers and oats
can be worked on by mathematical functions, strings can-
not. Notice how when python multiplies a number by
0.15 Assignment an integer the expected thing happens. However when a
string is multiplied by an integer the result is that mul-
Okay, so we have these boxes called variables and also tiple copies of the string are produced (i.e., text * 2 =
data that can go into the variable. The computer will see HelloHello).
a line like rst_name = Bill and it reads it as Put the Operations with strings do dierent things than opera-
string Bill into the box (or variable) rst_name. Later on tions with numbers. As well, some operations only work
it sees the statement c = a + b and it reads it as put the with numbers (both integers and oating point numbers)
sum of a + b or 123.4 + 432 which equals 555.4 into c. and will give an error if a string is used. Here are some
The right hand side of the statement (a + b) is evaluated interactive mode examples to show that some more.
and the result is stored in the variable on the left hand
>>> print(This + " " + is + " joined.) This is joined.
side (c). This is called assignment, and you should not
>>> print(Ha, " * 5) Ha, Ha, Ha, Ha, Ha, >>> print(Ha,
confuse the assignment equal sign (=) with equality in
" * 5 + ha!") Ha, Ha, Ha, Ha, Ha, ha! >>> print(3 - 1)
a mathematical sense here (thats what == will be used for
2 >>> print(3 - 1) Traceback (most recent call last):
later).
File "<stdin>", line 1, in <module> TypeError: unsup-
Here is another example of variable usage: ported operand type(s) for -: 'str' and 'str' >>>
a = 1 print(a) a = a + 1 print(a) a = a * 2 print(a) Here is the list of some string operations:

And of course here is the output:


0.16 Examples
124
Even if the same variable appears on both sides of the Rate_times.py
equals sign (e.g., spam = spam), the computer still reads # This program calculates rate and distance prob-
it as, First nd out the data to store and then nd out lems print(Input a rate and a distance) rate =
where the data goes. oat(input(Rate: ")) distance = oat(input(Distance:
One more program before I end this chapter: ")) print(Time:", (distance / rate))
number = oat(input(Type in a number: ")) integer =
int(input(Type in an integer: ")) text = input(Type in Sample runs:
a string: ") print(number =", number) print(number Input a rate and a distance Rate: 5 Distance: 10 Time:
is a, type(number)) print(number * 2 =", num- 2.0 Input a rate and a distance Rate: 3.52 Distance: 45.6
ber * 2) print(integer =", integer) print(integer is Time: 12.9545454545
a, type(integer)) print(integer * 2 =", integer *
Area.py
2) print(text =", text) print(text is a, type(text))
print(text * 2 =", text * 2) # This program calculates the perimeter and area
of a rectangle print(Calculate information about a
The output I got was: rectangle) length = oat(input(Length: ")) width =
oat(input(Width: ")) print(Area:", length * width)
Type in a number: 12.34 Type in an integer: 3 Type in print(Perimeter:", 2 * length + 2 * width)
a string: Hello number = 12.34 number is a <class 'oat'>
number * 2 = 24.68 integer = 3 integer is a <class 'int'>
integer * 2 = 6 text = Hello text is a <class 'str'> text * Sample runs:
2 = HelloHello Calculate information about a rectangle Length: 4 Width:
8

3 Area: 12.0 Perimeter: 14.0 Calculate information = a + 1 |<--[ The while statement BLOCK ] # print (a) |
about a rectangle Length: 2.53 Width: 5.2 Area: 13.156 # --
Perimeter: 15.46
Temperature.py And here is the extremely exciting output:
# This program converts Fahrenheit to Celsius fahr_temp 1 2 3 4 5 6 7 8 9 10
= oat(input(Fahrenheit temperature: ")) print(Celsius (And you thought it couldn't get any worse after turning
temperature:", (fahr_temp - 32.0) * 5.0 / 9.0) your computer into a ve-dollar calculator?)
So what does the program do? First it sees the line a = 0
Sample runs: and sets a to zero. Then it sees while a < 10: and so the
Fahrenheit temperature: 32 Celsius temperature: 0.0 computer checks to see if a < 10. The rst time the com-
Fahrenheit temperature: 40 Celsius temperature: puter sees this statement, a is zero, so it is less than 10.
40.0 Fahrenheit temperature: 212 Celsius temperature: In other words, as long as a is less than ten, the computer
100.0 Fahrenheit temperature: 98.6 Celsius temperature: will run the tabbed in statements. This eventually makes
37.0 a equal to ten (by adding one to a again and again) and the
while a < 10 is not true any longer. Reaching that point,
the program will stop running the indented lines.
0.17 Exercises Always remember to put a colon ":" at the end of the while
statement line!
Write a program that gets 2 string variables and 2 number
variables from the user, concatenates (joins them together Here is another example of the use of while:
with no spaces) and displays the strings, then multiplies a = 1 s = 0 print('Enter Numbers to add to the sum.')
the two numbers on a new line. print('Enter 0 to quit.') while a != 0: print('Current Sum:',
Solution s) a = oat(input('Number? ')) s = s + a print('Total Sum
=', s)
Enter Numbers to add to the sum. Enter 0 to quit. Cur-
Write a program that gets 2 string variables and 2 number rent Sum: 0 Number? 200 Current Sum: 200.0 Num-
variables from the user, concatenates (joins them together ber? 15.25 Current Sum: 184.75 Number? 151.85
with no spaces) and displays the strings, then multiplies Current Sum: 32.9 Number? 10.00 Current Sum: 42.9
the two numbers on a new line. Number? 0 Total Sum = 42.9
string1 = input('String 1: ') string2 = input('String Notice how print('Total Sum =', s) is only run at the end.
2: ') oat1 = oat(input('Number 1: ')) oat2 = The while statement only aects the lines that are in-
oat(input('Number 2: ')) print(string1 + string2) dented with whitespace. The != means does not equal
print(oat1 * oat2) so while a != 0: means as long as a is not zero run the
tabbed statements that follow.
Note that a is a oating point number, and not all oating
0.18 While loops point numbers can be accurately represented, so using !=
on them can sometimes not work. Try typing in 1.1 in
Presenting our rst control structure. Ordinarily the com- interactive mode.
puter starts with the rst line and then goes down from
there. Control structures change the order that statements 0.18.1 Innite loops or Never Ending Loop
are executed or decide if a certain statement will be run.
Heres the source for a program that uses the while con- Now that we have while loops, it is possible to have pro-
trol structure: grams that run forever. An easy way to do this is to write
a = 0 # FIRST, set the initial value of the variable a to a program like this:
0(zero). while a < 10: # While the value of the variable while 1 == 1: print(Help, I'm stuck in a loop.)
a is less than 10 do the following: a = a + 1 # Increase
the value of the variable a by 1, as in: a = a + 1! print(a)
# Print to screen what the present value of the variable a The "==" operator is used to test equality of the expres-
is. # REPEAT! until the value of the variable a is equal sions on the two sides of the operator, just as "<" was used
to 9!? See note. # NOTE: # The value of the variable for less than before (you will get a complete list of all
a will increase by 1 # with each repeat, or loop of the comparison operators in the next chapter).
'while statement BLOCK'. # e.g. a = 1 then a = 2 then a This program will output Help, I'm stuck in a loop. un-
= 3 etc. until a = 9 then... # the code will nish adding 1 til the heat death of the universe or you stop it, because
to a (now a = 10), printing the # result, and then exiting 1 will forever be equal to 1. The way to stop it is to hit
the 'while statement BLOCK'. # -- # While a < 10: | # a the Control (or Ctrl) button and C (the letter) at the same
0.20 Exercises 9

time. This will kill the program. (Note: sometimes you


will have to hit enter after the Control-C.) On some sys- Sample run:
tems, nothing will stop it, short of killing the process--so
avoid! Password: auo Password: y22 Password: password
Password: open sesame Password: unicorn Welcome
in
0.19 Examples

0.19.1 Fibonacci sequence 0.20 Exercises

Fibonacci-method1.py Write a program that asks the user for a Login Name and
password. Then when they type lock, they need to type
# This program calculates the Fibonacci sequence a = 0 b
in their name and password to unlock the program.
= 1 count = 0 max_count = 20 while count < max_count:
count = count + 1 print(a, end=" ") # Notice the magic Solution
end=" " in the print function arguments # that keeps it
from creating a new line. old_a = a # we need to keep Write a program that asks the user for a Login Name and
track of a since we change it. a = b b = old_a + b print() password. Then when they type lock, they need to type
# gets a new (empty) line. in their name and password to unlock the program.
name = input(What is your UserName: ") password =
Output: input(What is your Password: ") print(To lock your
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 computer type lock.) command = None input1 = None
2584 4181 input2 = None while command != lock": command =
input(What is your command: ") while input1 != name:
Note that the output is on a single line because of the extra
input1 = input(What is your username: ") while input2
argument end=" " in the print arguments.
!= password: input2 = input(What is your password: ")
Fibonacci-method2.py print(Welcome back to your system!")
# Simplied and faster method to calculate the Fibonacci
sequence a = 0 b = 1 count = 0 max_count = 10 while If you would like the program to run continuously, just
count < max_count: count = count + 1 print(a, b, end=" add a while 1 == 1: loop around the whole thing. You
") # Notice the magic end=" " a = a + b b = a + b print() will have to indent the rest of the program when you add
# gets a new (empty) line. this at the top of the code, but don't worry, you don't have
to do it manually for each line! Just highlight everything
Output: you want to indent and click on Indent under Format
in the top bar of the python window.
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
2584 4181 Another way of doing this could be:

Fibonacci-method3.py name = input('Set name: ') password = input('Set pass-


word: ') while 1 == 1: nameguess="" passwordguess=""
a = 0 b = 1 count = 0 maxcount = 20 #once loop is key="" while (nameguess != name) or (passwordguess !=
started we stay in it while count < maxcount: count password): nameguess = input('Name? ') passwordguess
+= 1 olda = a a = a + b b = olda print(olda,end=" ") print() = input('Password? ') print(Welcome,, name, ". Type
lock to lock.) while key != lock": key = input("")
Output:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 Notice the or in while (nameguess != name) or (pass-
2584 4181 wordguess != password), which we haven't yet intro-
duced. You can probably gure out how it works.

0.19.2 Enter password


0.21 If statement
Password.py
# Waits until a password has been entered. Use Control- As always I believe I should start each chapter with a
C to break out without # the password #Note that this warm-up typing exercise, so here is a short program to
must not be the password so that the # while loop runs compute the absolute value of an integer:
at least once. password = str() # note that != means n = int(input(Number? ")) if n < 0: print(The absolute
not equal while password != unicorn": password = value of, n, is, -n) else: print(The absolute value of,
input(Password: ") print(Welcome in) n, is, n)
10

number: print(Hooray! You guessed it right!") elif


Here is the output from the two times that I ran this pro- guess < number: print(Its bigger...) elif guess >
gram: number: print(Its not so big.)

Number? 34 The absolute value of 34 is 34 Number?


Sample run:
1 The absolute value of 1 is 1
So what does the computer do when it sees this piece of Guess the number! Is it... 2 Its bigger... Is it... 5 Its
code? First it prompts the user for a number with the bigger... Is it... 10 Its not so big. Is it... 7 Hooray! You
statement n = int(input(Number? "))". Next it reads the guessed it right!
line if n < 0:". If n is less than zero Python runs the line even.py
print(The absolute value of, n, is, -n)". Otherwise it # Asks for a number. # Prints if it is even or odd number
runs the line print(The absolute value of, n, is, n)". = oat(input(Tell me a number: ")) if number % 2 ==
More formally Python looks at whether the expression n 0: print(int(number), is even.) elif number % 2 == 1:
< 0 is true or false. An if statement is followed by an print(int(number), is odd.) else: print(number, is very
indented block of statements that are run when the ex- strange.)
pression is true. Optionally after the if statement is an
else statement and another indented block of statements. Sample runs:
This second block of statements is run if the expression
is false. Tell me a number: 3 3 is odd. Tell me a number: 2 2 is
even. Tell me a number: 3.4895 3.4895 is very strange.
There are a number of dierent tests that an expression
can have. Here is a table of all of them: average1.py
Another feature of the if command is the elif statement. # keeps asking for numbers until 0 is entered. # Prints
It stands for else if and means if the original if statement the average value. count = 0 sum = 0.0 number = 1
is false but the elif part is true, then do the elif part. And # set to something that will not exit the while loop
if neither the if or elif expressions are true, then do whats immediately. print(Enter 0 to exit the loop) while
in the else block. Heres an example: number != 0: number = oat(input(Enter a number: "))
if number != 0: count = count + 1 sum = sum + number
a = 0 while a < 10: a = a + 1 if a > 5: print(a, ">", 5) elif a if number == 0: print(The average was:", sum / count)
<= 3: print(a, "<=", 3) else: print(Neither test was true) Sample runs

and the output: Sample runs:


1 <= 3 2 <= 3 3 <= 3 Neither test was true Neither test
Enter 0 to exit the loop Enter a number: 3 Enter a
was true 6 > 5 7 > 5 8 > 5 9 > 5 10 > 5 number: 5 Enter a number: 0 The average was: 4.0
Notice how the elif a <= 3 is only tested when the if state- Enter 0 to exit the loop Enter a number: 1 Enter a
ment fails to be true. There can be more than one elif number: 4 Enter a number: 3 Enter a number: 0 The
expression, allowing multiple tests to be done in a single average was: 2.66666666667
if statement.
average2.py
0.22 Examples # keeps asking for numbers until count numbers have
been entered. # Prints the average value. #Notice that
# This Program Demonstrates the use of the == operator we use an integer to keep track of how many numbers, #
# using numbers print(5 == 6) # Using variables x = 5 y but oating point numbers for the input of each number
= 8 print(x == y) sum = 0.0 print(This program will take several numbers
then average them) count = int(input(How many
And the output numbers would you like to average: ")) current_count
= 0 while current_count < count: current_count = cur-
False False rent_count + 1 print(Number, current_count) number
high_low.py = oat(input(Enter a number: ")) sum = sum + number
print(The average was:", sum / count)
# Plays the guessing game higher or lower # This should
actually be something that is semi random like the # last
digits of the time or something else, but that will have Sample runs:
to # wait till a later chapter. (Extra Credit, modify it This program will take several numbers then average
to be random # after the Modules chapter) number = them How many numbers would you like to average: 2
7 guess = 1 print(Guess the number!") while guess Number 1 Enter a number: 3 Number 2 Enter a number:
!= number: guess = int(input(Is it... ")) if guess ==
0.25 What should the program do? 11

5 The average was: 4.0 This program will take several grams you have probably found that sometimes the pro-
numbers then average them How many numbers would gram does something you didn't want it to do. This is
you like to average: 3 Number 1 Enter a number: 1 Num- fairly common. Debugging is the process of guring out
ber 2 Enter a number: 4 Number 3 Enter a number: 3 The what the computer is doing and then getting it to do what
average was: 2.66666666667 you want it to do. This can be tricky. I once spent nearly
a week tracking down and xing a bug that was caused by
someone putting an x where a y should have been.
0.23 Exercises
This chapter will be more abstract than previous chapters.
Write a program that asks the user their name, if they
enter your name say That is a nice name, if they en-
ter John Cleese or Michael Palin, tell them how you 0.25 What should the program do?
feel about them ;), otherwise tell them You have a nice
name. The rst thing to do (this sounds obvious) is to gure out
what the program should be doing if it is running cor-
Solution rectly. Come up with some test cases and see what hap-
name = input('Your name: ') if name == 'Bryn': pens. For example, lets say I have a program to compute
print('That is a nice name.') elif name == 'John Cleese': the perimeter of a rectangle (the sum of the length of all
print('... some funny text.') elif name == 'Michael Palin': the edges). I have the following test cases:
print('... some funny text.') else: print('You have a nice
name.') I now run my program on all of the test cases and see if
the program does what I expect it to do. If it doesn't then
I need to nd out what the computer is doing.
Modify the higher or lower program from this section to
keep track of how many times the user has entered the More commonly some of the test cases will work and
wrong number. If it is more than 3 times, print That some will not. If that is the case you should try and gure
must have been complicated. at the end, otherwise print out what the working ones have in common. For example
Good job!" here is the output for a perimeter program (you get to see
the code in a minute):
Solution
number = 7 guess = 1 count = 0 print(Guess the num- Height: 3 Width: 4 perimeter = 15 Height: 2 Width: 3
ber!") while guess != number: guess = int(input(Is it... perimeter = 11 Height: 4 Width: 4 perimeter = 16 Height:
")) count = count + 1 if guess == number: print(Hooray! 2 Width: 2 perimeter = 8 Height: 5 Width: 1 perimeter
You guessed it right!") elif guess < number: print(Its = 8
bigger...) elif guess > number: print(Its not so big.) Notice that it didn't work for the rst two inputs, it worked
if count > 3: print(That must have been complicated.) for the next two and it didn't work on the last one. Try
else: print(Good job!") and gure out what is in common with the working ones.
Once you have some idea what the problem is nding the
Write a program that asks for two numbers. If the sum cause is easier. With your own programs you should try
of the numbers is greater than 100, print That is a big more test cases if you need them.
number.
Solution
0.26 What does the program do?
number1 = oat(input('1st number: ')) number2 =
oat(input('2nd number: ')) if number1 + number2 >
The next thing to do is to look at the source code. One
100: print('That is a big number.')
of the most important things to do while programming is
reading source code. The primary way to do this is code
walkthroughs.
0.24 What is debugging? A code walkthrough starts at the rst line, and works its
way down until the program is done. while loops and if
As soon as we started programming, we found statements mean that some lines may never be run and
to our surprise that it wasn't as easy to get pro- some lines are run many times. At each line you gure
grams right as we had thought. Debugging had out what Python has done.
to be discovered. I can remember the exact in-
stant when I realized that a large part of my Lets start with the simple perimeter program. Don't type
life from then on was going to be spent in nd- it in, you are going to read it, not run it. The source code
ing mistakes in my own programs. Maurice is:
Wilkes discovers debugging, 1949 height = int(input(Height: ")) width = int(input(Width:
")) print(perimeter =", width + height + width + width)
By now if you have been messing around with the pro-
12

Question: What is the rst line Python runs? What does it do? Well, while statements in general
Answer: The rst line is always run rst. In this look at their expression, and if it is true they do the
case it is: height = int(input(Height: ")) next indented block of code, otherwise they skip the
next indented block of code.
What does that line do? Prints Height: , waits for the
user to type a string in, and then converts the string So what does it do right now? If number > 1 is true
to an integer variable height. then the next two lines will be run.

What is the next line that runs? In general, it is the So is number > 1? The last value put into number was
next line down which is: width = int(input(Width: 5 and 5 > 1 so yes.
"))
So what is the next line? Since the while was true the
What does that line do? Prints Width: , waits for the next line is: print(".,end=" ")
user to type a number in, and puts what the user
What does that line do? Prints one dot and since the
types in the variable width.
extra argument end=" " exists the next printed text
What is the next line that runs? When the next line is will not be on a dierent screen line.
not indented more or less than the current line, it is What is the next line? number = number - 1 since that
the line right afterwards, so it is: print(perimeter is following line and there are no indent changes.
= ", width + height + width + width) (It may also
run a function in the current line, but thats a future What does it do? It calculates number - 1, which is the
chapter.) current value of number (or 5) subtracts 1 from it,
and makes that the new value of number. So basi-
What does that line do? First it prints perimeter = , cally it changes numbers value from 5 to 4.
then it prints the sum of the values contained within
the variables, width and height, from width + height What is the next line? Well, the indent level decreases
+ width + width. so we have to look at what type of control structure
Does width + height + width + width calculate the it is. It is a while loop, so we have to go back to the
perimeter properly? while clause which is while number > 1:
Lets see, perimeter of a rectangle is the bottom What does it do? It looks at the value of number, which
(width) plus the left side (height) plus the top is 4, and compares it to 1 and since 4 > 1 the while
(width) plus the right side (huh?). The last item loop continues.
should be the right sides length, or the height.
What is the next line? Since the while loop was true,
Do you understand why some of the times the perime-
the next line is: print(".,end=" ")
ter was calculated correctly"?
It was calculated correctly when the width and the What does it do? It prints a second dot on the line, end-
height were equal. ing by a space.

The next program we will do a code walkthrough for is a What is the next line? No indent change so it is: num-
program that is supposed to print out 5 dots on the screen. ber = number - 1
However, this is what the program is outputting:
And what does it do? It takes the current value of num-
.... ber (4), subtracts 1 from it, which gives it 3 and then
And here is the program: nally makes 3 the new value of number.

number = 5 while number > 1: print(".,end=" ") number What is the next line? Since there is an indent change
= number - 1 print() caused by the end of the while loop, the next line is:
while number > 1:
This program will be more complex to walkthrough since What does it do? It compares the current value of num-
it now has indented portions (or control structures). Let ber (3) to 1. 3 > 1 so the while loop continues.
us begin.
What is the next line? Since the while loop condition
was true the next line is: print(".,end=" ")
What is the rst line to be run? The rst line of the
le: number = 5 And it does what? A third dot is printed on the line.
What does it do? Puts the number 5 in the variable What is the next line? It is: number = number - 1
number.
What does it do? It takes the current value of number
What is the next line? The next line is: while number (3) subtracts from it 1 and makes the 2 the new value
> 1: of number.
0.28 Creating Functions 13

What is the next line? Back up to the start of the while else: print(The absolute values of, a, and, b, are
loop: while number > 1: dierent.)
What does it do? It compares the current value of num-
ber (2) to 1. Since 2 > 1 the while loop continues. with the output being:
The absolute values of 23 and 23 are equal.
What is the next line? Since the while loop is continu-
ing: print(".,end=" ") The program seems a little repetitive. Programmers hate
to repeat things -- thats what computers are for, after
What does it do? It discovers the meaning of life, the all! (Note also that nding the absolute value changed
universe and everything. I'm joking. (I had to make the value of the variable, which is why it is printing out
sure you were awake.) The line prints a fourth dot 23, and not 23 in the output.) Fortunately Python al-
on the screen. lows you to create functions to remove duplication. Here
What is the next line? Its: number = number - 1 is the rewritten example:
a = 23 b = 23 def absolute_value(n): if n < 0: n =
What does it do? Takes the current value of number (2)
-n return n if absolute_value(a) == absolute_value(b):
subtracts 1 and makes 1 the new value of number.
print(The absolute values of, a, and, b, are equal.)
What is the next line? Back up to the while loop: while else: print(The absolute values of, a, and, b, are
number > 1: dierent.)

What does the line do? It compares the current value


of number (1) to 1. Since 1 > 1 is false (one is not with the output being:
greater than one), the while loop exits. The absolute values of 23 and 23 are equal.
What is the next line? Since the while loop condition The key feature of this program is the def statement. def
was false the next line is the line after the while loop (short for dene) starts a function denition. def is fol-
exits, or: print() lowed by the name of the function absolute_value. Next
comes a '(' followed by the parameter n (n is passed from
What does that line do? Makes the screen go to the the program into the function when the function is called).
next line. The statements after the ':' are executed when the func-
Why doesn't the program print 5 dots? The loop ex- tion is used. The statements continue until either the in-
its 1 dot too soon. dented statements end or a return is encountered. The
return statement returns a value back to the place where
How can we x that? Make the loop exit 1 dot later. the function was called. We already have encountered
a function in our very rst program, the print function.
And how do we do that? There are several ways. One Now we can make new functions.
way would be to change the while loop to: while
number > 0: Another way would be to change the Notice how the values of a and b are not changed. Func-
conditional to: number >= 1 There are a couple oth- tions can be used to repeat tasks that don't return values.
ers. Here are some examples:
def hello(): print(Hello) def area(width, height):
return width * height def print_welcome(name):
0.27 How do I x my program? print(Welcome, name) hello() hello()
print_welcome(Fred) w = 4 h = 5 print(width
You need to gure out what the program is doing. You =", w, " height =", h, " area =", area(w, h))
need to gure out what the program should do. Figure
out what the dierence between the two is. Debugging is
a skill that has to be practiced to be learned. If you can't with output being:
gure it out after an hour, take a break, talk to someone Hello Hello Welcome Fred width = 4 height = 5 area =
about the problem or contemplate the lint in your navel. 20
Come back in a while and you will probably have new
ideas about the problem. Good luck. That example shows some more stu that you can do with
functions. Notice that you can use no arguments or two or
more. Notice also when a function doesn't need to send
0.28 Creating Functions back a value, a return is optional.

To start o this chapter I am going to give you an example


of what you could do but shouldn't (so don't type it in):
a = 23 b = 23 if a < 0: a = -a if b < 0: b = -b if a == b:
print(The absolute values of, a, and, b, are equal.)
14

0.29 Variables in functions variables of the same name are gone. Then the statement
print(a_var = ", a_var) prints the value 10 rather than
the value 15 since the local variable that hid the global
When eliminating repeated code, you often have vari- variable is gone.
ables in the repeated code. In Python, these are dealt
Another thing to notice is the NameError that happens at
with in a special way. So far all variables we have seen are
the end. This appears since the variable d_var no longer
global variables. Functions have a special type of variable
exists since a_func nished. All the local variables are
called local variables. These variables only exist while the
deleted when the function exits. If you want to get some-
function is running. When a local variable has the same
thing from a function, then you will have to use return
name as another variable (such as a global variable), the
something.
local variable hides the other. Sound confusing? Well,
these next examples (which are a bit contrived) should One last thing to notice is that the value of e_var remains
help clear things up. unchanged inside a_func since it is not a parameter and
it never appears on the left of an equals sign inside of
a = 4 def print_func(): a = 17 print(in print_func a =",
the function a_func. When a global variable is accessed
a) print_func() print(a = ", a)
inside a function it is the global variable from the outside.
Functions allow local variables that exist only inside the
When run, we will receive an output of:
function and can hide other variables that are outside the
in print_func a = 17 a = 4 function.
Variable assignments inside a function do not override
global variables, they exist only inside the function. Even
though a was assigned a new value inside the function, 0.30 Examples
this newly assigned value was only relevant to print_func,
when the function nishes running, and the as values is temperature2.py
printed again, we see the originally assigned values. #! /usr/bin/python #-*-coding: utf-8 -*- # con-
Here is another more complex example. verts temperature to Fahrenheit or Celsius def
print_options(): print(Options:") print(" 'p' print
a_var = 10 b_var = 15 e_var = 25 def a_func(a_var): options) print(" 'c' convert from Celsius) print("
print(in a_func a_var =", a_var) b_var = 100 + 'f' convert from Fahrenheit) print(" 'q' quit the
a_var d_var = 2 * a_var print(in a_func b_var =", program) def celsius_to_fahrenheit(c_temp):
b_var) print(in a_func d_var =", d_var) print(in
return 9.0 / 5.0 * c_temp + 32 def fahren-
a_func e_var =", e_var) return b_var + 10 c_var heit_to_celsius(f_temp): return (f_temp - 32.0) *
= a_func(b_var) print(a_var =", a_var) print(b_var
5.0 / 9.0 choice = p while choice != q": if choice
=", b_var) print(c_var =", c_var) print(d_var =", d_var) == c": c_temp = oat(input(Celsius temperature:
")) print(Fahrenheit:", celsius_to_fahrenheit(c_temp))
output: choice = input(option: ") elif choice == f": f_temp =
in a_func a_var = 15 in a_func b_var = 115 in a_func oat(input(Fahrenheit temperature: ")) print(Celsius:",
d_var = 30 in a_func e_var = 25 a_var = 10 b_var = 15 fahrenheit_to_celsius(f_temp)) choice = input(option:
c_var = 125 d_var = Traceback (most recent call last): ") else: choice = p #Alternatively choice != q": so that
File C:\def2.py, line 19, in <module> print(d_var = ", print #when anything unexpected inputed print_options()
d_var) NameError: name 'd_var' is not dened choice = input(option: ")

In this example the variables a_var, b_var, and d_var


are all local variables when they are inside the function Sample Run:
a_func. After the statement return b_var + 10 is run, they Options: 'p' print options 'c' convert from celsius 'f' con-
all cease to exist. The variable a_var is automatically a lo- vert from fahrenheit 'q' quit the program option: c Celsius
cal variable since it is a parameter name. The variables temperature: 30 Fahrenheit: 86.0 option: f Fahrenheit
b_var and d_var are local variables since they appear on temperature: 60 Celsius: 15.5555555556 option: q
the left of an equals sign in the function in the statements area2.py
b_var = 100 + a_var and d_var = 2 * a_var .
#! /usr/bin/python #-*-coding: utf-8 -*- # calcu-
Inside of the function a_var has no value assigned to it. lates a given rectangle area def hello(): print('Hello!')
When the function is called with c_var = a_func(b_var), def area(width, height): return width * height def
15 is assigned to a_var since at that point in time b_var is
print_welcome(name): print('Welcome,', name) def
15, making the call to the function a_func(15). This ends positive_input(prompt): number = oat(input(prompt))
up setting a_var to 15 when it is inside of a_func. while number <= 0: print('Must be a positive number')
As you can see, once the function nishes running, the number = oat(input(prompt)) return number name
local variables a_var and b_var that had hidden the global = input('Your Name: ') hello() print_welcome(name)
0.31 Exercises 15

print() print('To nd the area of a rectangle,') print('enter Question: What is the rst thing the program does?
the width and height below.') print() w = posi- Answer: The rst thing done is the function mult is
tive_input('Width: ') h = positive_input('Height: ') dened with the lines:
print('Width =', w, ' Height =', h, ' so Area =', area(w,
h)) def mult(a, b): if b == 0: return 0 rest = mult(a, b - 1)
value = a + rest return value
Sample Run:
Your Name: Josh Hello! Welcome, Josh To nd the area This creates a function that takes two parameters and
of a rectangle, enter the width and height below. Width: returns a value when it is done. Later this function
4 Must be a positive number Width: 4 Height: 3 Width can be run.
= 4 Height = 3 so Area = 12
What happens next? The next line after the function,
result = mult(3, 2) is run.
0.31 Exercises What does this line do? This line will assign the return
value of mult(3, 2) to the variable result.
Rewrite the area2.py program from the Examples above
to have a separate function for the area of a square, the And what does mult(3, 2) return? We need to do a
area of a rectangle, and the area of a circle (3.14 * ra- walkthrough of the mult function to nd out.
dius**2). This program should include a menu interface.
What happens next? The variable a gets the value 3 as-
Solution signed to it and the variable b gets the value 2 as-
def square(L): return L * L def rectangle(width , height): signed to it.
return width * height def circle(radius): return 3.14159
* radius ** 2 def options(): print() print(Options:") And then? The line if b == 0: is run. Since b has the
print(s = calculate the area of a square.) print(c = value 2 this is false so the line return 0 is skipped.
calculate the area of a circle.) print(r = calculate the And what then? The line rest = mult(a, b - 1) is run.
area of a rectangle.) print(q = quit) print() print(This This line sets the local variable rest to the value of
program will calculate the area of a square, circle or mult(a, b - 1). The value of a is 3 and the value of b
rectangle.) choice = x options() while choice != q": is 2 so the function call is mult(3,1)
choice = input(Please enter your choice: ") if choice
== s": L = oat(input(Length of square side: ")) So what is the value of mult(3, 1) ? We will need to
print(The area of this square is, square(L)) options() run the function mult with the parameters 3 and 1.
elif choice == c": radius = oat(input(Radius of the
circle: ")) print(The area of the circle is, circle(radius)) So what happens next? The local variables in the new
options() elif choice == r": width = oat(input(Width run of the function are set so that a has the value 3
of the rectangle: ")) height = oat(input(Height of and b has the value 1. Since these are local values
the rectangle: ")) print(The area of the rectangle is, these do not aect the previous values of a and b.
rectangle(width, height)) options() elif choice == q": And then? Since b has the value 1 the if statement is
print(" ",end="") else: print(Unrecognized option.) false, so the next line becomes rest = mult(a, b - 1).
options()
What does this line do? This line will assign the value
of mult(3, 0) to rest.
Some people nd this section useful, and some nd it con-
fusing. If you nd it confusing you can skip it. Now we So what is that value? We will have to run the function
will do a walk through for the following program: one more time to nd that out. This time a has the
def mult(a, b): if b == 0: return 0 rest = mult(a, b - 1) value 3 and b has the value 0.
value = a + rest return value result = mult(3, 2) print(3 So what happens next? The rst line in the function to
* 2 = ", result) run is if b == 0:. b has the value 0 so the next line
to run is return 0
Basically this program creates a positive integer multipli- And what does the line return 0 do? This line returns
cation function (that is far slower than the built in mul- the value 0 out of the function.
tiplication function) and then demonstrates this function
with a use of the function. This program demonstrates the So? So now we know that mult(3, 0) has the value 0.
use of recursion, that is a form of iteration (repetition) in Now we know what the line rest = mult(a, b - 1) did
which there is a function that repeatedly calls itself until since we have run the function mult with the param-
an exit condition is satised. It uses repeated additions to eters 3 and 0. We have nished running mult(3, 0)
give the same result as mutiplication: e.g. 3 + 3 (addition) and are now back to running mult(3, 1). The vari-
gives the same result as 3 * 2 (multiplication). able rest gets assigned the value 0.
16

What line is run next? The line value = a + rest is run Any problem that can be solved with recursion could be
next. In this run of the function, a = 3 and rest = 0 re-implemented with loops. Using the latter usually re-
so now value = 3. sults in better performance. However equivalent imple-
mentations using loops are usually harder to get done cor-
What happens next? The line return value is run. This rectly.
returns 3 from the function. This also exits from the
Probably the most intuitive denition of recursion is:
run of the function mult(3, 1). After return is called,
we go back to running mult(3, 2).
Recursion If you still don't get it, see recursion.
Where were we in mult(3, 2)? We had the variables a
= 3 and b = 2 and were examining the line rest = Try walking through the factorial example if the multi-
mult(a, b - 1). plication example did not make sense.

So what happens now? The variable rest get 3 assigned


to it. The next line value = a + rest sets value to 3 + 0.32 Examples
3 or 6.
factorial.py
So now what happens? The next line runs, this returns
#denes a function that calculates the factorial def
6 from the function. We are now back to running
factorial(n): if n <= 1: return 1 return n * factorial(n -
the line result = mult(3, 2) which can now assign the
1) print(2! =", factorial(2)) print(3! =", factorial(3))
value 6 to the variable result.
print(4! =", factorial(4)) print(5! =", factorial(5))
What happens next? The next line after the function,
print(3 * 2 = ", result) is run. Output:
2! = 2 3! = 6 4! = 24 5! = 120
And what does this do? It prints 3 * 2 = and the value
of result which is 6. The complete line printed is 3 countdown.py
* 2 = 6. def count_down(n): print(n) if n > 0: return
count_down(n-1) count_down(5)
What is happening overall? Basically we used two
facts to calculate the multiple of the two numbers.
The rst is that any number times 0 is 0 (x * 0 = Output:
0). The second is that a number times another num- 5 4 3 2 1 0
ber is equal to the rst number plus the rst number
times one less than the second number (x * y = x + x
* (y - 1)). So what happens is 3 * 2 is rst converted 0.33 Variables with more than one value
into 3 + 3 * 1. Then 3 * 1 is converted into 3 + 3 *
0. Then we know that any number times 0 is 0 so 3 You have already seen ordinary variables that store a sin-
* 0 is 0. Then we can calculate that 3 + 3 * 0 is 3 + gle value. However other variable types can hold more
0 which is 3. Now we know what 3 * 1 is so we can than one value. These are called containers because they
calculate that 3 + 3 * 1 is 3 + 3 which is 6. can contain more than one object. The simplest type is
called a list. Here is an example of a list being used:
This is how the whole thing works: which_one = int(input(What month (1-12)? ")) months
mult(3, 2) 3 + mult(3, 1) 3 + 3 + mult(3, 0) 3 + 3 + 0 3 + = ['January', 'February', 'March', 'April', 'May', 'June',
36 'July', 'August', 'September', 'October', 'November',
'December'] if 1 <= which_one <= 12: print(The
month is, months[which_one - 1])
0.31.1 Recursion
and an output example:
Programming constructs solving a problem by solving a
smaller version of the same problem are called recursive. What month (1-12)? 3 The month is March
In the examples in this chapter, recursion is realized by In this example the months is a list. months is dened
dening a function calling itself. This facilitates imple- with the lines months = ['January', 'February', 'March',
menting solutions to programming tasks as it may be suf- 'April', 'May', 'June', 'July', and 'August', 'September',
cient to consider the next step of a problem instead of 'October', 'November', 'December'] (note that a \ could
the whole problem at once. It is also useful as it allows also be used to split a long line, but that is not necessary
to express some mathematical concepts with straightfor- in this case because Python is intelligent enough to rec-
ward, easy to read code. ognize that everything within brackets belongs together).
0.34 More features of lists 17

The [ and ] start and end the list with commas (,) separat-
tice that you can just print a whole list. Next the append
ing the list items. The list is used in months[which_one function is used to add a new item to the end of the list.
- 1]. A list consists of items that are numbered starting len returns how many items are in a list. The valid indexes
at 0. In other words if you wanted January you would (as in numbers that can be used inside of the []) of a list
use months[0]. Give a list a number and it will return therange from 0 to len - 1. The index function tells where
value that is stored at that location. the rst location of an item is located in a list. Notice
The statement if 1 <= which_one <= 12: will only be how demolist.index(42) returns 1, and when demolist[1]
true if which_one is between one and twelve inclusive (in is run it returns 42. To get help on all the functions a list
provides for you, type help(list) in the interactive Python
other words it is what you would expect if you have seen
that in algebra). interpreter.

Lists can be thought of as a series of boxes. Each box The line # Next we will loop through the list is a just
has a dierent value. For example, the boxes created by a reminder to the programmer (also called a comment).
demolist = ['life', 42, 'the universe', 6, 'and', 9] would look Python ignores everything that is written after a # on the
like this: current line. Next the lines:

Each box is referenced by its number so the statement for c in range(len(demolist)): print('demolist[', c, '] =',
demolist[0] would get 'life', demolist[1] would get 42 and demolist[c])
so on up to demolist[5] getting 9.
create a variable c, which starts at 0 and is incremented
until it reaches the last index of the list. Meanwhile the
print statement prints out each element of the list.
0.34 More features of lists
A much better way to do the above is:
The next example is just to show a lot of other stu lists for c, x in enumerate(demolist): print(demolist[", c, "]
can do (for once I don't expect you to type it in, but you =", x)
should probably play around with lists in interactive mode
until you are comfortable with them.). Here goes:
The del command can be used to remove a given element
demolist = ["life, 42, the universe, 6, in a list. The next few lines use the in operator to test if
and, 9] print(demolist = ",demolist) de- an element is in or is not in a list. The sort function sorts
molist.append(everything) print(after 'ev- the list. This is useful if you need a list in order from
erything' was appended demolist is now:") smallest number to largest or alphabetical. Note that this
print(demolist) print(len(demolist) =", len(demolist)) rearranges the list. In summary, for a list, the following
print(demolist.index(42) =", demolist.index(42)) operations occur:
print(demolist[1] =", demolist[1]) # Next we will
loop through the list for c in range(len(demolist)): This next example uses these features in a more useful
print(demolist[", c, "] =", demolist[c]) del demolist[2] way:
print(After 'the universe' was removed demolist is menu_item = 0 namelist = [] while menu_item !=
now:") print(demolist) if life in demolist: print("'life' 9: print("--------------------") print(1. Print the list)
was found in demolist) else: print("'life' was not found print(2. Add a name to the list) print(3. Remove a
in demolist) if amoeba in demolist: print("'amoeba' name from the list) print(4. Change an item in the
was found in demolist) if amoeba not in demolist: list) print(9. Quit) menu_item = int(input(Pick an
print("'amoeba' was not found in demolist) another_list item from the menu: ")) if menu_item == 1: current
= [42,7,0,123] another_list.sort() print(The sorted = 0 if len(namelist) > 0: while current < len(namelist):
another_list is, another_list) print(current, "., namelist[current]) current = current + 1
else: print(List is empty) elif menu_item == 2: name =
The output is: input(Type in a name to add: ") namelist.append(name)
elif menu_item == 3: del_name = input(What name
demolist = ['life', 42, 'the universe', 6, 'and', 9] after 'ev- would you like to remove: ") if del_name in namelist:
erything' was appended demolist is now: ['life', 42, 'the # namelist.remove(del_name) would work just as
universe', 6, 'and', 9, 'everything'] len(demolist) = 7 de- ne item_number = namelist.index(del_name) del
molist.index(42) = 1 demolist[1] = 42 demolist[ 0 ] = life namelist[item_number] # The code above only re-
demolist[ 1 ] = 42 demolist[ 2 ] = the universe demolist[ moves the rst occurrence of # the name. The code
3 ] = 6 demolist[ 4 ] = and demolist[ 5 ] = 9 demolist[ 6 ] below from Gerald removes all. # while del_name in
= everything After 'the universe' was removed demolist is namelist: # item_number = namelist.index(del_name)
now: ['life', 42, 6, 'and', 9, 'everything'] 'life' was found in # del namelist[item_number] else: print(del_name,
demolist 'amoeba' was not found in demolist The sorted was not found) elif menu_item == 4: old_name
another_list is [0, 7, 42, 123] = input(What name would you like to change:
This example uses a whole bunch of new functions. No- ") if old_name in namelist: item_number =
18

namelist.index(old_name) new_name = input(What is as Turing-Completeness). Of course, there are still many


the new name: ") namelist[item_number] = new_name features that are used to make your life easier.
else: print(old_name, was not found) print(Goodbye)

And here is part of the output:


0.35 Examples
-------------------- 1. Print the list 2. Add a name to the test.py
list 3. Remove a name from the list 4. Change an item in
## This program runs a test of knowledge # First get the
the list 9. Quit Pick an item from the menu: 2 Type in a
test questions # Later this will be modied to use le
name to add: Jack Pick an item from the menu: 2 Type
io. def get_questions(): # notice how the data is stored
in a name to add: Jill Pick an item from the menu: 1 0 .
as a list of lists return [["What color is the daytime sky
Jack 1 . Jill Pick an item from the menu: 3 What name
on a clear day? ", blue"], ["What is the answer to life,
would you like to remove: Jack Pick an item from the
the universe and everything? ", 42"], ["What is a three
menu: 4 What name would you like to change: Jill What
letter word for mouse trap? ", cat"]] # This will test a
is the new name: Jill Peters Pick an item from the menu:
single question # it takes a single question in # it returns
1 0 . Jill Peters Pick an item from the menu: 9 Goodbye
True if the user typed the correct answer, otherwise
That was a long program. Lets take a look at the source False def check_question(question_and_answer): #
code. The line namelist = [] makes the variable namelist extract the question and the answer from the list # This
a list with no items (or elements). The next important function takes a list with two elements, a question and
line is while menu_item != 9:. This line starts a loop that an answer. question = question_and_answer[0] answer =
allows the menu system for this program. The next few question_and_answer[1] # give the question to the user
lines display a menu and decide which part of the program given_answer = input(question) # compare the users
to run. answer to the testers answer if answer == given_answer:
The section print(Correct) return True else: print(Incorrect,
correct was:", answer) return False # This will run
current = 0 if len(namelist) > 0: while current < through all the questions def run_test(questions): if
len(namelist): print(current, "., namelist[current]) len(questions) == 0: print(No questions were given.) #
current = current + 1 else: print(List is empty) the return exits the function return index = 0 right = 0
while index < len(questions): # Check the question #Note
goes through the list and prints each name. len(namelist) that this is extracting a question and answer list from the
tells how many items are in the list. If len returns 0, then list of lists. if check_question(questions[index]): right =
the list is empty. right + 1 # go to the next question index = index + 1 #
notice the order of the computation, rst multiply, then
Then, a few lines later, the statement
divide print(You got, right * 100 / len(questions),\ "%
namelist.append(name) appears. It uses the append
right out of, len(questions)) # now lets get the questions
function to add an item to the end of the list. Jump down
from the get_questions function, and # send the returned
another two lines, and notice this section of code:
list of lists as an argument to the run_test function.
item_number = namelist.index(del_name) del run_test(get_questions())
namelist[item_number]
The values True and False point to 1 and 0, respectively.
Here the index function is used to nd the index They are often used in sanity checks, loop conditions etc.
value that will be used later to remove the item. del You will learn more about this a little bit later (chapter
namelist[item_number] is used to remove a element of Boolean Expressions). Please note that get_questions()
the list. is essentially a list because even though its technically a
The next section function, returning a list of lists is the only thing it does.

old_name = input(What name would you like to Sample Output:


change: ") if old_name in namelist: item_number = What color is the daytime sky on a clear day? green In-
namelist.index(old_name) new_name = input(What is correct, correct was: blue What is the answer to life, the
the new name: ") namelist[item_number] = new_name universe and everything? 42 Correct What is a three let-
else: print(old_name, was not found) ter word for mouse trap? cat Correct You got 66 % right
out of 3
uses index to nd the item_number and then puts
new_name where the old_name was.
0.36 Exercises
Congratulations, with lists under your belt, you now know
enough of the language that you could do any computa- Expand the test.py program so it has a menu giving the
tions that a computer can do (this is technically known option of taking the test, viewing the list of questions and
0.36 Exercises 19

answers, and an option to quit. Also, add a new ques- range function uses two arguments like this range(start,
tion to ask, What noise does a truly advanced machine nish). start is the rst number that is produced. nish is
make?" with the answer of ping. one larger than the last number. Note that this program
Solution could have been done in a shorter way:
for count in range(1, 11): print(count)
Expand the test.py program so it has menu giving the op-
tion of taking the test, viewing the list of questions and The range function returns an iterable. This can be con-
answers, and an option to quit. Also, add a new ques- verted into a list with the list function. which will then be
tion to ask, What noise does a truly advanced machine the dominant number. Here are some examples to show
make?" with the answer of ping. what happens with the range command:
## This program runs a test of knowledge questions >>> range(1, 10) range(1, 10) >>> list(range(1, 10)) [1,
= [["What color is the daytime sky on a clear day? ", 2, 3, 4, 5, 6, 7, 8, 9] >>> list(range(32, 20)) [32,
blue"], ["What is the answer to life, the universe and 31, 30, 29, 28, 27, 26, 25, 24, 23, 22,
everything? ", 42"], ["What is a three letter word 21] >>> list(range(5,21)) [5, 6, 7, 8, 9, 10, 11, 12, 13,
for mouse trap? ", cat"], ["What noise does a truly 14, 15, 16, 17, 18, 19, 20] >>> list(range(5)) [0, 1, 2, 3,
advanced machine make?", ping"]] # This will test a 4] >>> list(range(21, 5)) []
single question # it takes a single question in # it returns The next line for count in onetoten: uses the for control
True if the user typed the correct answer, otherwise False
structure. A for control structure looks like for variable
def check_question(question_and_answer): # extract the in list:. list is gone through starting with the rst element
question and the answer from the list question = ques-
of the list and going to the last. As for goes through each
tion_and_answer[0] answer = question_and_answer[1] element in a list it puts each into variable. That allows
# give the question to the user given_answer = in- variable to be used in each successive time the for loop is
put(question) # compare the users answer to the testers run through. Here is another example (you don't have to
answer if answer == given_answer: print(Correct) type this) to demonstrate:
return True else: print(Incorrect, correct was:", answer)
return False # This will run through all the questions def demolist = ['life', 42, 'the universe', 6, 'and', 7, 'every-
run_test(questions): if len(questions) == 0: print(No thing'] for item in demolist: print(The current item
questions were given.) # the return exits the function is:",item)
return index = 0 right = 0 while index < len(questions): #
Check the question if check_question(questions[index]): The output is:
right = right + 1 # go to the next question index =
index + 1 # notice the order of the computation, rst The current item is: life The current item is: 42 The cur-
multiply, then divide print(You got, right * 100 / rent item is: the universe The current item is: 6 The cur-
len(questions), "% right out of, len(questions)) #show- rent item is: and The current item is: 7 The current item
ing a list of questions and answers def showquestions(): is: everything
q = 0 while q < len(questions): a = 0 print(Q:" , Notice how the for loop goes through and sets item to
questions[q][a]) a = 1 print(A:" , questions[q][a]) each element in the list. So, what is for good for? The
q = q + 1 # now lets dene the menu function def rst use is to go through all the elements of a list and do
menu(): print("-----------------") print(Menu:") print(1 something with each of them. Heres a quick way to add
- Take the test) print(2 - View a list of questions and up all the elements:
answers) print(3 - View the menu) print(5 - Quit)
list = [2, 4, 6, 8] sum = 0 for num in list: sum = sum +
print("-----------------") choice = 3 while choice !=
num print(The sum is:", sum)
5": if choice == 1": run_test(questions) elif choice ==
2": showquestions() elif choice == 3": menu() print()
choice = input(Choose your option from the menu with the output simply being:
above: ") The sum is: 20
Or you could write a program to nd out if there are any
And here is the new typing exercise for this chapter: duplicates in a list like this program does:
onetoten = range(1, 11) for count in onetoten: list = [4, 5, 7, 8, 9, 1, 0, 7, 10] list.sort() prev = None for
print(count) item in list: if prev == item: print(Duplicate of, prev,
found) prev = item
and the ever-present output:
1 2 3 4 5 6 7 8 9 10 and for good measure:
The output looks awfully familiar but the program code Duplicate of 7 found
looks dierent. The rst line uses the range function. The
20

Okay, so how does it work? Here is a special debugging a = 6 b = 7 c = 42 print(1, a == 6) print(2, a == 7)


version to help you understand (you don't need to type print(3, a == 6 and b == 7) print(4, a == 7 and b == 7)
this in): print(5, not a == 7 and b == 7) print(6, a == 7 or b ==
l = [4, 5, 7, 8, 9, 1, 0, 7, 10] print(l = [4, 5, 7, 8, 9, 7) print(7, a == 7 or b == 6) print(8, not (a == 7 and b
1, 0, 7, 10]", "\t\tl:", l) l.sort() print(l.sort()", "\t\tl:", == 6)) print(9, not a == 7 and b == 6)
l) prev = l[0] print(prev = l[0]", "\t\tprev:", prev) del
l[0] print(del l[0]", "\t\tl:", l) for item in l: if prev With the output being:
== item: print(Duplicate of, prev, found) print(if 1 True 2 False 3 True 4 False 5 True 6 True 7 False 8
prev == item:", "\t\tprev:", prev, "\titem:", item) prev = True 9 False
item print(prev = item, "\t\tprev:", prev, "\titem:", item)
What is going on? The program consists of a bunch
of funny looking print statements. Each print statement
with the output being: prints a number and an expression. The number is to help
l = [4, 5, 7, 8, 9, 1, 0, 7, 10] l: [4, 5, 7, 8, 9, 1, 0, 7, 10] keep track of which statement I am dealing with. Notice
l.sort() l: [0, 1, 4, 5, 7, 7, 8, 9, 10] prev = l[0] prev: 0 how each expression ends up being either False or True.
del l[0] l: [1, 4, 5, 7, 7, 8, 9, 10] if prev == item: prev: In Python false can also be written as 0 and true as 1.
0 item: 1 prev = item prev: 1 item: 1 if prev == item:
The lines:
prev: 1 item: 4 prev = item prev: 4 item: 4 if prev ==
item: prev: 4 item: 5 prev = item prev: 5 item: 5 if prev print(1, a == 6) print(2, a == 7)
== item: prev: 5 item: 7 prev = item prev: 7 item: 7
Duplicate of 7 found if prev == item: prev: 7 item: 7 print out a True and a False respectively just as expected
prev = item prev: 7 item: 7 if prev == item: prev: 7 item: since the rst is true and the second is false. The third
8 prev = item prev: 8 item: 8 if prev == item: prev: 8 print, print(3, a == 6 and b == 7), is a little dierent. The
item: 9 prev = item prev: 9 item: 9 if prev == item: prev: operator and means if both the statement before and the
9 item: 10 prev = item prev: 10 item: 10 statement after are true then the whole expression is true
The reason I put so many print statements in the code was otherwise the whole expression is false. The next line,
so that you can see what is happening in each line. (By the print(4, a == 7 and b == 7), shows how if part of an and
way, if you can't gure out why a program is not working, expression is false, the whole thing is false. The behavior
try putting in lots of print statements in places where you of and can be summarized as follows:
want to know what is happening.) First the program starts Notice that if the rst expression is false Python does not
with a boring old list. Next the program sorts the list. This check the second expression since it knows the whole ex-
is so that any duplicates get put next to each other. The pression is false. Try running False and print(Hi) and
program then initializes a prev(ious) variable. Next the compare this to running True and print(Hi) The tech-
rst element of the list is deleted so that the rst item is nical term for this is short-circuit evaluation
not incorrectly thought to be a duplicate. Next a for loop
is gone into. Each item of the list is checked to see if it The next line, print(5, not a == 7 and b == 7), uses the
is the same as the previous. If it is a duplicate was found. not operator. not just gives the opposite of the expression.
The value of prev is then changed so that the next time (The expression could be rewritten as print(5, a != 7 and
the for loop is run through prev is the previous item to b == 7)). Here is the table:
the current. Sure enough, the 7 is found to be a duplicate. The two following lines, print(6, a == 7 or b == 7) and
(Notice how \t is used to print a tab.) print(7, a == 7 or b == 6), use the or operator. The or
The other way to use for loops is to do something a certain operator returns true if the rst expression is true, or if
number of times. Here is some code to print out the rst the second expression is true or both are true. If neither
9 numbers of the Fibonacci series: are true it returns false. Heres the table:

a = 1 b = 1 for c in range(1, 10): print(a, end=" ") n = a Notice that if the rst expression is true Python doesn't
+ba=bb=n check the second expression since it knows the whole ex-
pression is true. This works since or is true if at least one
half of the expression is true. The rst part is true so the
with the surprising output: second part could be either false or true, but the whole
1 1 2 3 5 8 13 21 34 expression is still true.
Everything that can be done with for loops can also be The next two lines, print(8, not (a == 7 and b == 6)) and
done with while loops but for loops give an easy way to print(9, not a == 7 and b == 6), show that parentheses
go through all the elements in a list or to do something a can be used to group expressions and force one part to
certain number of times. be evaluated rst. Notice that the parentheses changed
the expression from false to true. This occurred since the
Here is a little example of boolean expressions (you don't
parentheses forced the not to apply to the whole expres-
have to type it in):
0.37 A note on Boolean Operators 21

sion instead of just the a == 7 portion. >>> 'a' == ('a' and 'b') False >>> 'b' == ('a' and 'b')
Here is an example of using a boolean expression: True
At this point, the and and or operators seem to be broken.
list = ["Life, The Universe, Everything, Jack,
Jill, Life, Jill"] # make a copy of the list. See the It doesn't make sense that, for the rst two expressions, 'a'
is equivalent to 'a' or 'b' while 'b' is not. Furthermore, it
More on Lists chapter to explain what [:] means. copy
= list[:] # sort the copy copy.sort() prev = copy[0] del doesn't make any sense that 'b' is equivalent to 'a' and 'b'.
After examining what the interpreter does with boolean
copy[0] count = 0 # go through the list searching for a
match while count < len(copy) and copy[count] != prev: operators, these results do in fact exactly what you are
prev = copy[count] count = count + 1 # If a match was asking of them, its just not the same as what you think
not found then count can't be < len # since the while loop you are asking.
continues while count is < len # and no match is found if When the Python interpreter looks at an or expression,
count < len(copy): print(First Match:", prev) it takes the rst statement and checks to see if it is true.
If the rst statement is true, then Python returns that ob-
And here is the output: jects value without checking the second statement. This
is because for an or expression, the whole thing is true
First Match: Jill if one of the values is true; the program does not need
This program works by continuing to check for match to bother with the second statement. On the other hand,
while count < len(copy) and copy[count] is not equal to if the rst value is evaluated as false Python checks the
prev. When either count is greater than the last index of second half and returns that value. That second half de-
copy or a match has been found the and is no longer true termines the truth value of the whole expression since the
so the loop exits. The if simply checks to make sure that rst half was false. This laziness on the part of the in-
the while exited because a match was found. terpreter is called short circuiting and is a common way
of evaluating boolean expressions in many programming
The other trick of and is used in this example. If you languages.
look at the table for and notice that the third entry is false
and false. If count >= len(copy) (in other words count Similarly, for an and expression, Python uses a short cir-
< len(copy) is false) then copy[count] is never looked at. cuit technique to speed truth value evaluation. If the rst
This is because Python knows that if the rst is false then statement is false then the whole thing must be false, so
they can't both be true. This is known as a short cir- it returns that value. Otherwise if the rst value is true it
cuit and is useful if the second half of the and will cause checks the second and returns that value.
an error if something is wrong. I used the rst expres-One thing to note at this point is that the boolean ex-
sion (count < len(copy)) to check and see if count was a
pression returns a value indicating True or False, but that
valid index for copy. (If you don't believe me remove the
Python considers a number of dierent things to have a
matches Jill and Life, check that it still works and then
truth value assigned to them. To check the truth value of
reverse the order of count < len(copy) and copy[count] !=
any given object x, you can use the fuction bool(x) to see
prev to copy[count] != prev and count < len(copy).) its truth value. Below is a table with examples of the truth
Boolean expressions can be used when you need to check values of various objects:
two or more dierent things at once. Now it is possible to understand the perplexing results we
were getting when we tested those boolean expressions
before. Lets take a look at what the interpreter sees as
0.37 A note on Boolean Operators it goes through that code:
First case:
A common mistake for people new to programming is
a misunderstanding of the way that boolean operators >>> 'a' == ('a' or 'b') # Look at parentheses rst, so
works, which stems from the way the python interpreter evaluate expression "('a' or 'b')" # 'a' is a nonempty string,
reads these expressions. For example, after initially so the rst value is True # Return that rst value: 'a' >>>
learning about and " and or statements, one might as- 'a' == 'a' # the string 'a' is equivalent to the string 'a', so
sume that the expression x == ('a' or 'b') would check to expression is True True
see if the variable x was equivalent to one of the strings Second case:
'a' or 'b'. This is not so. To see what I'm talking about,
>>> 'b' == ('a' or 'b') # Look at parentheses rst, so
start an interactive session with the interpreter and enter
evaluate expression "('a' or 'b')" # 'a' is a nonempty string,
the following expressions:
so the rst value is True # Return that rst value: 'a' >>>
>>> 'a' == ('a' or 'b') >>> 'b' == ('a' or 'b') >>> 'a' == ('a' 'b' == 'a' # the string 'b' is not equivalent to the string
and 'b') >>> 'b' == ('a' and 'b') 'a', so expression is False False
And this will be the unintuitive result: Third case:
>>> 'a' == ('a' or 'b') True >>> 'b' == ('a' or 'b') False
22

>>> 'a' == ('a' and 'b') # Look at parentheses rst, guilherme guess = input(What is my name? ") while
so evaluate expression "('a' and 'b')" # 'a' is a nonempty count < 3 and guess.lower() != name: # .lower allows
string, so the rst value is True, examine second value # things like Guilherme to still match print(You are
'b' is a nonempty string, so second value is True # Return wrong!") guess = input(What is my name? ") count
that second value as result of whole expression: 'b' >>> = count + 1 if guess.lower() != name: print(You are
'a' == 'b' # the string 'a' is not equivalent to the string wrong!") # this message isn't printed in the third chance,
'b', so expression is False False so we print it now print(You ran out of chances.) else:
Fourth case: print(Yes! My name is, name + "!")

>>> 'b' == ('a' and 'b') # Look at parentheses rst,


so evaluate expression "('a' and 'b')" # 'a' is a nonempty This chapter is about dictionaries. Dictionaries have keys
string, so the rst value is True, examine second value # and values. The keys are used to nd the values. Here is
'b' is a nonempty string, so second value is True # Return an example of a dictionary in use:
that second value as result of whole expression: 'b' >>> def print_menu(): print('1. Print Phone Numbers)
'b' == 'b' # the string 'b' is equivalent to the string 'b', print('2. Add a Phone Number') print('3. Remove a
so expression is True True Phone Number') print('4. Lookup a Phone Number')
So Python was really doing its job when it gave those ap- print('5. Quit') print() numbers = {} menu_choice = 0
parently bogus results. As mentioned previously, the im- print_menu() while menu_choice != 5: menu_choice =
portant thing is to recognize what value your boolean ex- int(input(Type in a number (1-5): ")) if menu_choice ==
pression will return when it is evaluated, because it isn't 1: print(Telephone Numbers:") for x in numbers.keys():
always obvious. print(Name: ", x, "\tNumber:", numbers[x]) print() elif
menu_choice == 2: print(Add Name and Number)
Going back to those initial expressions, this is how you name = input(Name: ") phone = input(Number:
would write them out so they behaved in a way that you ") numbers[name] = phone elif menu_choice ==
want: 3: print(Remove Name and Number) name = in-
>>> 'a' == 'a' or 'a' == 'b' True >>> 'b' == 'a' or 'b' put(Name: ") if name in numbers: del numbers[name]
== 'b' True >>> 'a' == 'a' and 'a' == 'b' False >>> else: print(name, was not found) elif menu_choice
'b' == 'a' and 'b' == 'b' False == 4: print(Lookup Number) name = input(Name:
") if name in numbers: print(The number is, num-
When these comparisons are evaluated they return truth bers[name]) else: print(name, was not found) elif
values in terms of True or False, not strings, so we get the menu_choice != 5: print_menu()
proper results.

And here is my output:


0.38 Examples 1. Print Phone Numbers 2. Add a Phone Number 3. Re-
move a Phone Number 4. Lookup a Phone Number 5.
password1.py Quit Type in a number (1-5): 2 Add Name and Number
Name: Joe Number: 545-4464 Type in a number (1-
## This program asks a user for a name and a password.
5): 2 Add Name and Number Name: Jill Number: 979-
# It then checks them to make sure that the user is
4654 Type in a number (1-5): 2 Add Name and Number
allowed in. name = input(What is your name? ")
Name: Fred Number: 132-9874 Type in a number (1-5):
password = input(What is the password? ") if name
1 Telephone Numbers: Name: Jill Number: 979-4654
== Josh and password == Friday": print(Welcome
Name: Joe Number: 545-4464 Name: Fred Number:
Josh) elif name == Fred and password == Rock":
132-9874 Type in a number (1-5): 4 Lookup Number
print(Welcome Fred) else: print(I don't know you.)
Name: Joe The number is 545-4464 Type in a number
(1-5): 3 Remove Name and Number Name: Fred Type
Sample runs in a number (1-5): 1 Telephone Numbers: Name: Jill
What is your name? Josh What is the password? Fri- Number: 979-4654 Name: Joe Number: 545-4464 Type
day Welcome Josh What is your name? Bill What is the in a number (1-5): 5
password? Money I don't know you. This program is similar to the name list earlier in the
chapter on lists. Heres how the program works. First the
function print_menu is dened. print_menu just prints a
0.39 Exercises menu that is later used twice in the program. Next comes
the funny looking line numbers = {}. All that this line
Write a program that has a user guess your name, but they does is to tell Python that numbers is a dictionary. The
only get 3 chances to do so until the program quits. next few lines just make the menu work. The lines
Solution for x in numbers.keys(): print(Name:", x, "\tNumber:",
print(Try to guess my name!") count = 1 name = numbers[x])
0.39 Exercises 23

print(i + 1, assignments[i], '\t', end=' ') print()


go through the dictionary and print all the information. print_grades(grades) which = 1234 while which !=
The function numbers.keys() returns a list that is then 1: which = int(input(Change which Grade: ")) which
used by the for loop. The list returned by keys() is not -= 1 #same as which = which - 1 if 0 <= which <
in any particular order so if you want it in alphabetic or- len(grades): grade = int(input(Grade: ")) grades[which]
der it must be sorted. Similar to lists the statement num- = grade elif which != 1: print(Invalid Grade Num-
bers[x] is used to access a specic member of the dictio- ber) else: print(Student not found) elif menu_choice
nary. Of course in this case x is a string. Next the line != 6: print_menu()
numbers[name] = phone adds a name and phone number
to the dictionary. If name had already been in the dic- and here is a sample output:
tionary phone would replace whatever was there before. 1. Add student 2. Remove student 3. Print grades 4.
Next the lines Record grade 5. Print Menu 6. Exit Menu Choice (1-6):
if name in numbers: del numbers[name] 3 hw ch 1 hw ch 2 quiz hw ch 3 test #Max 25 25 50 25 100
Menu Choice (1-6): 5 1. Add student 2. Remove student
see if a name is in the dictionary and remove it if it is. 3. Print grades 4. Record grade 5. Print Menu 6. Exit
The operator name in numbers returns true if name is in Menu Choice (1-6): 1 Student to add: Bill Menu Choice
numbers but otherwise returns false. The line del num- (1-6): 4 Record Grade Student: Bill Type in the number
bers[name] removes the key name and the value associ- of the grade to record Type a 0 (zero) to exit 1 hw ch 1 2
ated with that key. The lines hw ch 2 3 quiz 4 hw ch 3 5 test 0 0 0 0 0 Change which
Grade: 1 Grade: 25 Change which Grade: 2 Grade: 24
if name in numbers: print(The number is, num- Change which Grade: 3 Grade: 45 Change which Grade:
bers[name]) 4 Grade: 23 Change which Grade: 5 Grade: 95 Change
which Grade: 0 Menu Choice (1-6): 3 hw ch 1 hw ch 2
check to see if the dictionary has a certain key and if it quiz hw ch 3 test #Max 25 25 50 25 100 Bill 25 24 45 23
does prints out the number associated with it. Lastly if 95 Menu Choice (1-6): 6
the menu choice is invalid it reprints the menu for your Heres how the program works. Basically the variable stu-
viewing pleasure. dents is a dictionary with the keys being the name of
A recap: Dictionaries have keys and values. Keys can be the students and the values being their grades. The rst
strings or numbers. Keys point to values. Values can be two lines just create two lists. The next line students =
any type of variable (including lists or even dictionaries {'#Max': max_points} creates a new dictionary with the
(those dictionaries or lists of course can contain dictio- key {#Max} and the value is set to be [25, 25, 50, 25, 100]
naries or lists themselves (scary right? :-) ))). Here is an (since thats what max_points was when the assignment is
example of using a list in a dictionary: made) (I use the key #Max since # is sorted ahead of any
alphabetic characters). Next print_menu is dened. Next
max_points = [25, 25, 50, 25, 100] assignments = ['hw the print_all_grades function is dened in the lines:
ch 1', 'hw ch 2', 'quiz ', 'hw ch 3', 'test'] students =
{'#Max': max_points} def print_menu(): print(1. Add def print_all_grades(): print('\t',end=" ") for i in
student) print(2. Remove student) print(3. Print range(len(assignments)): print(assignments[i], '\t',end="
grades) print(4. Record grade) print(5. Print Menu) ") print() keys = list(students.keys()) keys.sort() for
print(6. Exit) def print_all_grades(): print('\t', end=' x in keys: print(x, '\t',end=' ') grades = students[x]
') for i in range(len(assignments)): print(assignments[i], print_grades(grades)
'\t', end=' ') print() keys = list(students.keys()) keys.sort()
for x in keys: print(x, '\t', end=' ') grades = students[x] Notice how rst the keys are gotten out of the stu-
print_grades(grades) def print_grades(grades): for i in dents dictionary with the keys function in the line keys
range(len(grades)): print(grades[i], '\t', end=' ') print() = list(students.keys()). keys is a iterable, and it is con-
print_menu() menu_choice = 0 while menu_choice verted to list so all the functions for lists can be used on
!= 6: print() menu_choice = int(input(Menu Choice it. Next the keys are sorted in the line keys.sort(). for
(1-6): ")) if menu_choice == 1: name = input(Student is used to go through all the keys. The grades are stored
to add: ") students[name] = [0] * len(max_points) as a list inside the dictionary so the assignment grades =
elif menu_choice == 2: name = input(Student to students[x] gives grades the list that is stored at the key x.
remove: ") if name in students: del students[name] else: The function print_grades just prints a list and is dened
print(Student:", name, not found) elif menu_choice a few lines later.
== 3: print_all_grades() elif menu_choice == 4:
The later lines of the program implement the various
print(Record Grade) name = input(Student: ") if
name in students: grades = students[name] print(Type options of the menu. The line students[name] = [0] *
len(max_points) adds a student to the key of their name.
in the number of the grade to record) print(Type
a 0 (zero) to exit) for i in range(len(assignments)): The notation [0] * len(max_points) just creates a list of
0s that is the same length as the max_points list.
24

The remove student entry just deletes a student similar to With some output being:
the telephone book example. The record grades choice The time is: Sun Aug 20 13:40:04 2000 The time is: Sun
is a little more complex. The grades are retrieved in Aug 20 13:40:05 2000 The time is: Sun Aug 20 13:40:06
the line grades = students[name] gets a reference to the 2000 The time is: Sun Aug 20 13:40:07 2000 Traceback
grades of the student name. A grade is then recorded (innermost last): File clock.py, line 5, in ? the_time =
in the line grades[which] = grade. You may notice that ctime(time()) KeyboardInterrupt
grades is never put back into the students dictionary (as
in no students[name] = grades). The reason for the miss- The output is innite of course so I cancelled it (or the
ing statement is that grades is actually another name output at least continues until Ctrl+C is pressed). The
for students[name] and so changing grades changes stu- program just does an innite loop (True is always true, so
dent[name]. while True: goes forever) and each time checks to see if
the time has changed and prints it if it has. Notice how
Dictionaries provide a easy way to link keys to values. multiple names after the import statement are used in the
This can be used to easily keep track of data that is at- line from time import time, ctime.
tached to various keys.
The Python Library contains many useful functions.
Heres this chapters typing exercise (name it cal.py (im- These functions give your programs more abilities and
port actually looks for a le named calendar.py and reads many of them can simplify programming in Python.
it in. If the le is named calendar.py and it sees a import
calendar it tries to read in itself which works poorly at
best.)):
0.40 Exercises
import calendar year = int(input(Type in the year
number: ")) calendar.prcal(year) Rewrite the high_low.py program from section Decisions
to use an random integer between 0 and 99 instead of the
And here is part of the output I got: hard-coded 78. Use the Python documentation to nd an
appropriate module and function to do this.
Type in the year number: 2001 2001 January February
March Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Solution
Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 7 1 2 3 4 1 2 3 4 8 9
10 11 12 13 14 5 6 7 8 9 10 11 5 6 7 8 9 10 11 15 16 17 Rewrite the high_low.py program from section Decisions
18 19 20 21 12 13 14 15 16 17 18 12 13 14 15 16 17 18 to use an random integer between 0 and 99 instead of the
22 23 24 25 26 27 28 19 20 21 22 23 24 25 19 20 21 22 hard-coded 78. Use the Python documentation to nd an
23 24 25 29 30 31 26 27 28 26 27 28 29 30 31 appropriate module and function to do this.
(I skipped some of the output, but I think you get the from random import randint number = randint(0, 99)
idea.) So what does the program do? The rst line import guess = 1 while guess != number: guess = int(input
calendar uses a new command import. The command im- (Guess a number: ")) if guess > number: print(Too
port loads a module (in this case the calendar module). To high) elif guess < number: print(Too low) print(Just
see the commands available in the standard modules ei- right)
ther look in the library reference for python (if you down-
loaded it) or go to http://docs.python.org/3/library/. If
you look at the documentation for the calendar module, We have already seen lists and how they can be used. Now
it lists a function called prcal that prints a calendar for a that you have some more background I will go into more
year. The line calendar.prcal(year) uses this function. In detail about lists. First we will look at more ways to get at
summary to use a module import it and then use mod- the elements in a list and then we will talk about copying
ule_name.function for functions in the module. Another them.
way to write the program is: Here are some examples of using indexing to access a
from calendar import prcal year = int(input(Type in the single element of a list:
year number: ")) prcal(year) >>> some_numbers = ['zero', 'one', 'two', 'three',
'four', 've'] >>> some_numbers[0] 'zero' >>>
This version imports a specic function from a module. some_numbers[4] 'four' >>> some_numbers[5] 've'
Here is another program that uses the Python Library All those examples should look familiar to you. If
(name it something like clock.py) (press Ctrl and the 'c' you want the rst item in the list just look at index
key at the same time to terminate the program): 0. The second item is index 1 and so on through
from time import time, ctime prev_time = "" while True: the list. However what if you want the last item in
the_time = ctime(time()) if prev_time != the_time: the list? One way could be to use the len() function
print(The time is:", ctime(time())) prev_time = the_time like some_numbers[len(some_numbers) - 1]. This way
works since the len() function always returns the last in-
dex plus one. The second from the last would then be
0.40 Exercises 25

some_numbers[len(some_numbers) - 2]. There is an eas- is_bold = false start_block = index + 1 get_bolds(poem)


ier way to do this. In Python the last item is always index
1. The second to the last is index 2 and so on. Here with the output being:
are some more examples:
Bold [ 1 : 4 ] ['Jack', 'and', 'Jill'] Bold [ 11 : 15 ] ['fetch',
>>> some_numbers[len(some_numbers) - 1]
'a', 'pail', 'of'] Bold [ 20 : 23 ] ['down', 'and', 'broke'] Bold
've' >>> some_numbers[len(some_numbers) [ 28 : 30 ] ['Jill', 'came']
- 2] 'four' >>> some_numbers[1] 've' >>>
some_numbers[2] 'four' >>> some_numbers[6] The get_bold() function takes in a list that is broken into
'zero' words and tokens. The tokens that it looks for are <B>
which starts the bold text and </B> which ends bold text.
Thus any item in the list can be indexed in two ways: from The function get_bold() goes through and searches for the
the front and from the back. start and end tokens.
Another useful way to get into parts of lists is using slic- The next feature of lists is copying them. If you try some-
ing. Here is another example to give you an idea what thing simple like:
they can be used for:
>>> a = [1, 2, 3] >>> b = a >>> print(b) [1, 2, 3] >>>
>>> things = [0, 'Fred', 2, 'S.P.A.M.', 'Stocking', b[1] = 10 >>> print(b) [1, 10, 3] >>> print(a) [1, 10,
42, Jack, Jill"] >>> things[0] 0 >>> things[7] 3]
'Jill' >>> things[0:8] [0, 'Fred', 2, 'S.P.A.M.', 'Stock-
ing', 42, 'Jack', 'Jill'] >>> things[2:4] [2, 'S.P.A.M.'] This probably looks surprising since a modication to b
>>> things[4:7] ['Stocking', 42, 'Jack'] >>> things[1:5] resulted in a being changed as well. What happened is
['Fred', 2, 'S.P.A.M.', 'Stocking'] that the statement b = a makes b a reference to a. This
means that b can be thought of as another name for a.
Slicing is used to return part of a list. The slicing operator Hence any modication to b changes a as well. However
is in the form things[first_index:last_index]. Slicing cuts some assignments don't create two names for one list:
the list before the rst_index and before the last_index
and returns the parts in between. You can use both types >>> a = [1, 2, 3] >>> b = a * 2 >>> print(a) [1, 2,
of indexing: 3] >>> print(b) [1, 2, 3, 1, 2, 3] >>> a[1] = 10 >>>
print(a) [1, 10, 3] >>> print(b) [1, 2, 3, 1, 2, 3]
>>> things[4:2] ['Stocking', 42] >>> things[4]
'Stocking' >>> things[4:6] ['Stocking', 42] In this case b is not a reference to a since the expression a
* 2 creates a new list. Then the statement b = a * 2 gives
Another trick with slicing is the unspecied index. If the b a reference to a * 2 rather than a reference to a. All as-
rst index is not specied the beginning of the list is as- signment operations create a reference. When you pass a
sumed. If the last index is not specied the whole rest of list as an argument to a function you create a reference as
the list is assumed. Here are some examples: well. Most of the time you don't have to worry about cre-
>>> things[:2] [0, 'Fred'] >>> things[2:] ['Jack', 'Jill'] ating references rather than copies. However when you
>>> things[:3] [0, 'Fred', 2] >>> things[:5] [0, 'Fred', need to make modications to one list without changing
2] another name of the list you have to make sure that you
Here is a (HTML inspired) program example (copy and have actually created a copy.
paste in the poem denition if you want): There are several ways to make a copy of a list. The sim-
poem = ["<B>", Jack, and, Jill, "</B>", went, plest that works most of the time is the slice operator since
up, the, hill, to, "<B>", fetch, a, pail, of, it always makes a new list even if it is a slice of a whole
"</B>", water., Jack, fell, "<B>", down, and, list:
broke, "</B>", his, crown, and, "<B>", Jill, >>> a = [1, 2, 3] >>> b = a[:] >>> b[1] = 10 >>>
came, "</B>", tumbling, after"] def get_bolds(text): print(a) [1, 2, 3] >>> print(b) [1, 10, 3]
true = 1 false = 0 ## is_bold tells whether or not we are Taking the slice [:] creates a new copy of the list. How-
currently looking at ## a bold section of text. is_bold ever it only copies the outer list. Any sublist inside is
= false ## start_block is the index of the start of either still a references to the sublist in the original list. There-
an unbolded ## segment of text or a bolded segment. fore, when the list contains lists, the inner lists have to be
start_block = 0 for index in range(len(text)): ## Handle copied as well. You could do that manually but Python
a starting of bold text if text[index] == "<B>": if already contains a module to do it. You use the deepcopy
is_bold: print(Error: Extra Bold) ## print Not Bold:", function of the copy module:
text[start_block:index] is_bold = true start_block =
index + 1 ## Handle end of bold text ## Remember >>> import copy >>> a = [[1, 2, 3], [4, 5, 6]] >>> b =
that the last number in a slice is the index ## after a[:] >>> c = copy.deepcopy(a) >>> b[0][1] = 10 >>>
the last index used. if text[index] == "</B>": if not c[1][1] = 12 >>> print(a) [[1, 10, 3], [4, 5, 6]] >>>
is_bold: print(Error: Extra Close Bold) print(Bold print(b) [[1, 10, 3], [4, 5, 6]] >>> print(c) [[1, 2, 3], [4,
[", start_block, ":", index, "]", text[start_block:index]) 12, 6]]
26

First of all notice that a is a list of lists. Then notice that unicode value. Python has a function called ord() (short
when b[0][1] = 10 is run both a and b are changed, but for ordinal) that returns a character as a number. There
c is not. This happens because the inner arrays are still is also a corresponding function called chr() that converts
references when the slice operator is used. However with a number into a character. With this in mind the pro-
deepcopy c was fully copied. gram should start to be clear. The rst detail is the line:
So, should I worry about references every time I use a if 'a' <= character <= 'z': which checks to see if a letter
function or =? The good news is that you only have is lower case. If it is then the next lines are used. First it
to worry about references when using dictionaries and is converted into a location so that a = 0, b = 1, c = 2 and
so on with the line: location = ord(character) - ord('a').
lists. Numbers and strings create references when as-
signed but every operation on numbers and strings that Next the new value is found with new_ascii = location +
ord('A'). This value is converted back to a character that
modies them creates a new copy so you can never mod-
ify them unexpectedly. You do have to think about ref- is now upper case. Note that if you really need the upper
case of a letter, you should use u=var.upper() which will
erences when you are modifying a list or a dictionary.
work with other languages as well.
By now you are probably wondering why are references
used at all? The basic reason is speed. It is much faster to Now for some interactive typing exercise:
make a reference to a thousand element list than to copy >>> # Integer to String >>> 2 2 >>> repr(2) '2' >>>
all the elements. The other reason is that it allows you to 123 123 >>> repr(123) '123' >>> # String to
have a function to modify the inputed list or dictionary. Integer >>> 23 '23' >>> int(23) 23 >>> 23 * 2
Just remember about references if you ever have some '2323' >>> int(23) * 2 46 >>> # Float to String >>>
weird problem with data being changed when it shouldn't 1.23 1.23 >>> repr(1.23) '1.23' >>> # Float to Integer
be. >>> 1.23 1.23 >>> int(1.23) 1 >>> int(1.23) 1 >>>
# String to Float >>> oat(1.23) 1.23 >>> 1.23
And now presenting a cool trick that can be done with
strings: '1.23' >>> oat(123) 123.0

def shout(string): for character in string: print(Gimme If you haven't guessed already the function repr() can con-
a " + character) print("'" + character + "'") shout(Lose) vert an integer to a string and the function int() can con-
def middle(string): print(The middle character is:", vert a string to an integer. The function oat() can convert
string[len(string) // 2]) middle(abcdefg) middle(The a string to a oat. The repr() function returns a printable
Python Programming Language) middle(Atlanta) representation of something. Here are some examples of
this:

And the output is: >>> repr(1) '1' >>> repr(234.14) '234.14' >>> repr([4,
42, 10]) '[4, 42, 10]'
Gimme a L 'L' Gimme a o 'o' Gimme a s 's Gimme a e
'e' The middle character is: d The middle character is: r The int() function tries to convert a string (or a oat) into
an integer. There is also a similar function called oat()
The middle character is: a
that will convert a integer or a string into a oat. Another
What these programs demonstrate is that strings are sim- function that Python has is the eval() function. The eval()
ilar to lists in several ways. The shout() function shows function takes a string and returns data of the type that
that for loops can be used with strings just as they can python thinks it found. For example:
be used with lists. The middle procedure shows that that
strings can also use the len() function and array indexes >>> v = eval('123') >>> print(v, type(v)) 123 <type
and slices. Most list features work on strings as well. 'int'> >>> v = eval('645.123') >>> print(v, type(v))
645.123 <type 'oat'> >>> v = eval('[1, 2, 3]') >>>
The next feature demonstrates some string specic fea- print(v, type(v)) [1, 2, 3] <type 'list'>
tures:
If you use the eval() function you should check that it re-
def to_upper(string): ## Converts a string to upper case turns the type that you expect.
upper_case = "" for character in string: if 'a' <= character
<= 'z': location = ord(character) - ord('a') new_ascii One useful string function is the split() method. Heres an
= location + ord('A') character = chr(new_ascii) up- example:
per_case = upper_case + character return upper_case >>> This is a bunch of words.split() ['This, 'is, 'a',
print(to_upper(This is Text)) 'bunch', 'of', 'words] >>> text = First batch, second
batch, third, fourth >>> text.split(",) ['First batch',
with the output being: ' second batch', ' third', ' fourth']

THIS IS TEXT Notice how split() converts a string into a list of strings.
The string is split by whitespace by default or by the op-
This works because the computer represents the charac- tional argument (in this case a comma). You can also
ters of a string as numbers from 0 to 1,114,111. For ex- add another argument that tells split() how many times
ample 'A' is 65, 'B' is 66 and is 1488. The values are the the separator will be used to split the text. For example:
0.43 File I/O 27

>>> list = text.split(",) >>> len(list) 4 >>> list[1] '0: out_str = str(in_int % 10) + out_str in_int = in_int
fourth' >>> list = text.split(",, 2) >>> len(list) 3 >>>// 10 out_str = str(in_int % 10) + out_str return prex
list[1] ' third, fourth' + out_str def to_int(in_str): """Converts a string to an
integer""" out_num = 0 if in_str[0] == "-": multiplier =
1 in_str = in_str[1:] else: multiplier = 1 for c in in_str:
0.41 Slicing strings (and lists) out_num = out_num * 10 + int(c) return out_num *
multiplier print(to_string(2)) print(to_string(23445))
Strings can be cut into pieces in the same way as it print(to_string(23445)) print(to_int(14234))
was shown for lists in the previous chapter by using print(to_int(12345)) print(to_int("3512))
the slicing operator []. The slicing operator works in
the same way as before: text[first_index:last_index] (in
very rare cases there can be another colon and a third The output is:
argument, as in the example shown below). 2 23445 23445 14234 12345 3512
In order not to get confused by the index numbers, it is
easiest to see them as clipping places, possibilities to cut
a string into parts. Here is an example, which shows the
0.43 File I/O
clipping places (in yellow) and their index numbers (red
Here is a simple example of le I/O (input/output):
and blue) for a simple text string:
# Write a le with open(test.txt, wt) as out_le:
Note that the red indexes are counted from the beginning
out_le.write(This Text is going to out le\nLook at
of the string and the blue ones from the end of the string
it and see!") # Read a le with open(test.txt, rt) as
backwards. (Note that there is no blue 0, which could
in_le: text = in_le.read() print(text)
seem to be logical at the end of the string. Because 0
== 0, 0 means beginning of the string as well.) Now
we are ready to use the indexes for slicing operations: The output and the contents of the le test.txt are:
text[1:4] gives us all of the text string between clipping This Text is going to out le Look at it and see!
places 1 and 4, TRI. If you omit one of the [first_index: Notice that it wrote a le called test.txt in the directory
last_index] arguments, you get the beginning or end of that you ran the program from. The \n in the string tells
the string as default: text[:5] gives STRIN. For both Python to put a newline where it is.
rst_index and last_index we can use both the red and
the blue numbering schema: text[:1] gives the same A overview of le I/O is:
as text[:5], because the index 1 is at the same place
as 5 in this case. If we do not use an argument con- Get a le object with the open function
taining a colon, the number is treated in a dierent way:
text[2] gives us one character following the second clip- Read or write to the le object (depending on how it
ping point, R. The special slicing operation text[:] was opened)
means from the beginning to the end and produces a
If you did not use with to open the le, you'd have
copy of the entire string (or list, as shown in the previous
to close it manually
chapter).
Last but not least, the slicing operation can have a second The rst step is to get a le object. The way to do this
colon and a third argument, which is interpreted as the is to use the open function. The format is le_object =
step size": text[::1] is text from beginning to the end, open(lename, mode) where le_object is the variable to
with a step size of 1. 1 means every character, but in put the le object, lename is a string with the lename,
the other direction. STRING backwards is GNIRTS and mode is rt to read a le as text or wt to write
(test a step length of 2, if you have not got the point here). a le as text (and a few others we will skip here). Next
All these slicing operations work with lists as well. In that the le objects functions can be called. The two most
sense strings are just a special case of lists, where the list common functions are read and write. The write function
elements are single characters. Just remember the con- adds a string to the end of the le. The read function reads
cept of clipping places, and the indexes for slicing things the next thing in the le and returns it as a string. If no
will get a lot less confusing. argument is given it will return the whole le (as done in
the example).
Now here is a new version of the phone numbers program
0.42 Examples
that we made earlier:
# This program requires an excellent understanding of def print_numbers(numbers): print(Telephone Num-
decimal numbers. def to_string(in_int): """Converts an bers:") for k, v in numbers.items(): print(Name:",
integer to a string""" out_str = "" prex = "" if in_int k, "\tNumber:", v) print() def add_number(numbers,
< 0: prex = "-" in_int = -in_int while in_int // 10 != name, number): numbers[name] = number def
28

lookup_number(numbers, name): if name in num- numbers[name] = number in_le.close() def


bers: return The number is " + numbers[name] save_numbers(numbers, lename): out_le =
else: return name + " was not found def re- open(lename, wt) for k, v in numbers.items():
move_number(numbers, name): if name in num- out_le.write(k + ", + v + "\n) out_le.close()
bers: del numbers[name] else: print(name, was
not found) def load_numbers(numbers, lename): First we will look at the save portion of the program. First
in_le = open(lename, rt) while True: in_line it creates a le object with the command open(lename,
= in_le.readline() if not in_line: break in_line wt). Next it goes through and creates a line for each of
= in_line[:1] name, number = in_line.split(",)
the phone numbers with the command out_le.write(k +
numbers[name] = number in_le.close() def ", + v + "\n). This writes out a line that contains the
save_numbers(numbers, lename): out_le =
name, a comma, the number and follows it by a newline.
open(lename, wt) for k, v in numbers.items():
out_le.write(k + ", + v + "\n) out_le.close() def The loading portion is a little more complicated. It starts
print_menu(): print('1. Print Phone Numbers) print('2. by getting a le object. Then it uses a while True: loop to
Add a Phone Number') print('3. Remove a Phone Num- keep looping until a break statement is encountered. Next
ber') print('4. Lookup a Phone Number') print('5. Load it gets a line with the line in_line = in_le.readline(). The
numbers) print('6. Save numbers) print('7. Quit') print() readline function will return a empty string when the end
phone_list = {} menu_choice = 0 print_menu() while of the le is reached. The if statement checks for this
True: menu_choice = int(input(Type in a number (1-7): and breaks out of the while loop when that happens. Of
")) if menu_choice == 1: print_numbers(phone_list) elif course if the readline function did not return the newline
menu_choice == 2: print(Add Name and Number) at the end of the line there would be no way to tell if an
name = input(Name: ") phone = input(Number: ") empty string was an empty line or the end of the le so the
add_number(phone_list, name, phone) elif menu_choice newline is left in what readline returns. Hence we have to
== 3: print(Remove Name and Number) name = get rid of the newline. The line in_line = in_line[:1]
input(Name: ") remove_number(phone_list, name) elif does this for us by dropping the last character. Next the
menu_choice == 4: print(Lookup Number) name = in- line name, number = in_line.split(",) splits the line at the
put(Name: ") print(lookup_number(phone_list, name)) comma into a name and a number. This is then added to
elif menu_choice == 5: lename = input(Filename the numbers dictionary.
to load: ") load_numbers(phone_list, lename) elif
menu_choice == 6: lename = input(Filename to save:
") save_numbers(phone_list, lename) elif menu_choice 0.44 Advanced use of .txt les
== 7: break else: print_menu() print(Goodbye)
You might be saying to yourself, Well I know how to
read and write to a textle, but what if I want to print the
Notice that it now includes saving and loading les. Here
le without opening out another program?"
is some output of my running it twice:
There are a few dierent ways to accomplish this. The
1. Print Phone Numbers 2. Add a Phone Number 3.
easiest way does open another program, but everything is
Remove a Phone Number 4. Lookup a Phone Number 5.
taken care of in the Python code, and doesn't require the
Load numbers 6. Save numbers 7. Quit Type in a number
user to specify a le to be printed. This method involves
(1-7): 2 Add Name and Number Name: Jill Number:
invoking the subprocess of another program.
1234 Type in a number (1-7): 2 Add Name and Number
Name: Fred Number: 4321 Type in a number (1-7): 1 Remember the le we wrote output to in the above pro-
Telephone Numbers: Name: Jill Number: 1234 Name: gram? Lets use that le. Keep in mind, in order to pre-
Fred Number: 4321 Type in a number (1-7): 6 Filename vent some errors, this program uses concepts from the
to save: numbers.txt Type in a number (1-7): 7 Goodbye Next chapter. Please feel free to revisit this example af-
1. Print Phone Numbers 2. Add a Phone Number 3. ter the next chapter.
Remove a Phone Number 4. Lookup a Phone Number import subprocess def main(): try: print(This small
5. Load numbers 6. Save numbers 7. Quit Type in a program invokes the print function in the Notepad appli-
number (1-7): 5 Filename to load: numbers.txt Type cation) #Lets print the le we created in the program
in a number (1-7): 1 Telephone Numbers: Name: Jill above subprocess.call(['notepad','/p','numbers.txt'])
Number: 1234 Name: Fred Number: 4321 Type in a except WindowsError: print(The called subprocess
number (1-7): 7 Goodbye does not exist, or cannot be called.) main()
The new portions of this program are:
def load_numbers(numbers, lename): in_le The subprocess.call takes three arguments. The rst ar-
= open(lename, rt) while True: in_line = gument in the context of this example, should be the name
in_le.readline() if not in_line: break in_line = of the program which you would like to invoke the print-
in_line[:1] name, number = in_line.split(",) ing subprocess from. The second argument should be the
specic subprocess within that program. For simplicity,
0.46 ...or how to handle errors 29

just understand that in this program, '/p' is the subprocess # Change from oat(input()) to input() to avoid an error
used to access your printer through the specied applica- when saving grades[which] = grade elif which != 1:
tion. The last argument should be the name of the le you print(Invalid Grade Number) else: print(Student not
want to send to the printing subprocess. In this case, it is found) elif menu_choice == 5: print_all_grades() elif
the same le used earlier in this chapter. menu_choice == 6: gradesle = input(Save grades to
which le? ") save_grades(gradesle) elif menu_choice
!= 9: print_menu()
0.45 Exercises

Now modify the grades program from section


0.46 ...or how to handle errors
Dictionaries so that is uses le I/O to keep a record of
the students.
0.47 closing les with with
Solution
We use the with statement to open and close les.[1][2]
Now modify the grades program from section with open(in_test.txt, rt) as in_le: with
Dictionaries so that is uses le I/O to keep a record of open(out_test.txt, wt) as out_le: text =
the students. in_le.read() data = parse(text) results = encode(data)
assignments = ['hw ch 1', 'hw ch 2', 'quiz ', 'hw ch out_le.write(results) print( All done. )
3', 'test'] students = { } def load_grades(gradesle):
inputle = open(gradesle, r) grades = [ ] while If some sort of error happens anywhere in this code (one
True: student_and_grade = inputle.readline() stu- of the les is inaccessible, the parse() function chokes on
dent_and_grade = student_and_grade[:1] if not corrupt data, etc.) the with statements guarantee that
student_and_grade: break else: studentname, student- all the les will eventually be properly closed. Closing a
grades = student_and_grade.split(",) studentgrades le just means that the le is cleaned up and released
= studentgrades.split(" ") students[studentname] = by our program so that it can be used in another program.
studentgrades inputle.close() print(Grades loaded.)
def save_grades(gradesle): outputle = open(gradesle,
w) for k, v in students.items(): outputle.write(k 0.48 catching errors with try
+ ",) for x in v: outputle.write(str(x) + " ") out-
putle.write("\n) outputle.close() print(Grades So you now have the perfect program, it runs awlessly,
saved.) def print_menu(): print(1. Add student) except for one detail, it will crash on invalid user input.
print(2. Remove student) print(3. Load grades) Have no fear, for Python has a special control structure
print(4. Record grade) print(5. Print grades) for you. Its called try and it tries to do something. Here
print(6. Save grades) print(7. Print Menu) is an example of a program with a problem:
print(9. Quit) def print_all_grades(): if students: print(Type Control C or 1 to exit) number = 1 while
keys = sorted(students.keys()) print('\t', end=' ') for number != 1: number = int(input(Enter a number: "))
x in assignments: print(x, '\t', end=' ') print() for x print(You entered:", number)
in keys: print(x, '\t', end=' ') grades = students[x]
print_grades(grades) else: print(There are no grades
to print.) def print_grades(grades): for x in grades: Notice how when you enter @#& it outputs something
print(x, '\t', end=' ') print() print_menu() menu_choice like:
= 0 while menu_choice != 9: print() menu_choice = Traceback (most recent call last): File try_less.py, line
int(input(Menu Choice: ")) if menu_choice == 1: 4, in <module> number = int(input(Enter a number: "))
name = input(Student to add: ") students[name] = ValueError: invalid literal for int() with base 10: '\\@#&'
[0] * len(assignments) elif menu_choice == 2: name
= input(Student to remove: ") if name in students: As you can see the int() function is unhappy with the num-
del students[name] else: print(Student:", name, not ber @#& (as well it should be). The last line shows what
found) elif menu_choice == 3: gradesle = input(Load the problem is; Python found a ValueError. How can our
grades from which le? ") load_grades(gradesle) program deal with this? What we do is rst: put the place
elif menu_choice == 4: print(Record Grade) name where errors may occur in a try block, and second: tell
= input(Student: ") if name in students: grades = Python how we want ValueErrors handled. The follow-
students[name] print(Type in the number of the grade ing program does this:
to record) print(Type a 0 (zero) to exit) for i,x in enu- print(Type Control C or 1 to exit) number = 1
merate(assignments): print(i + 1, x, '\t', end=' ') print() while number != 1: try: number = int(input(Enter
print_grades(grades) which = 1234 while which != 1: a number: ")) print(You entered:", number) except
which = int(input(Change which Grade: ")) which -= 1 ValueError: print(That was not a number.)
if 0 <= which < len(grades): grade = input(Grade: ")
30

Now when we run the new program and give it @#& it be exact), an earlier version was written entirely
tells us That was not a number. and continues with what by Josh Cogliati, and it was up on his webpage
it was doing before. http://www.honors.montana.edu/~{}jjc/easytut
When your program keeps having some error that you and it was good. Then the server rupert, like all
know how to handle, put code in a try block, and put the good things than have a beginning came to an end,
way to handle the error in the except block. and Josh moved it to Wikibooks, but the rst person
writing stuck. If someone really wants to change it,
I will not revert it, but I don't see much point.
0.49 Exercises My question is not answered. Ask on the discussion
page or add it to this FAQ, or email one of the
Update at least the phone numbers program (in section Authors.
Dictionaries) so it doesn't crash if a user doesn't enter any
data at the menu.
For other FAQs, you may want to see the Python 2.6 ver-
So here we are at the end, or maybe the beginning. This sion of this page Non-Programmers Tutorial for Python
tutorial is on Wikibooks, so feel free to make improve- 2.6/FAQ, or the Python FAQ.
ments to it. If you want to learn more about Python, The
Python Tutorial by Guido van Rossum has more topics [1] The 'with' statement
that you can learn about. If you have been following this
tutorial, you should be able to understand a fair amount [2] 'The Python with Statement by Example'
of it. The Python Programming wikibook can be worth
looking at, too. Here are few other books which cover
Python 3:

A Byte of Python by Swaroop C H

Hands-on Python Tutorial by Dr. Andrew N. Har-


rington

Subject:Python programming language lists other


Wikibooks related to Python.

Hopefully this book covers everything you have needed


to get started programming. Thanks to everyone who has
sent me emails about it. I enjoyed reading them, even
when I have not always been the best replier.
Happy programming, may it change your life and the
world.

How do I make a GUI in Python? You can use one


of these library: TKinter, PyQt, PyGobject. For re-
ally simple graphics, you can use the turtle graphics
mode import turtle

How do I make a game in Python? The best method


is probably to use PyGame at http://pygame.org/

How do I make an executable from a Python program?


Short answer: Python is an interepreted lan-
guage so that is impossible. Long answer is
that something similar to an executable can
be created by taking the Python interpreter
and the le and joining them together and
distributing that. For more on that problem
see http://www.python.org/doc/faq/programming/
#how-can-i-create-a-stand-alone-binary-from-a-python-script

(IFAQ) Why do you use rst person in this tutorial?


Once upon a time in a dierent millenia, (1999 to
31

1 Text and image sources, contributors, and licenses


1.1 Text
Non-Programmers Tutorial for Python 3/Print version Source: https://en.wikibooks.org/wiki/Non-Programmer{}s_Tutorial_for_
Python_3/Print_version?oldid=2694445 Contributors: Baijum81, CommonsDelinker, Yug, Adrignola, Glaisher and Anonymous: 2

1.2 Images
File:Clipboard.svg Source: https://upload.wikimedia.org/wikipedia/commons/1/1f/Clipboard.svg License: GPL Contributors: Self-made.
Based on Image:Evolution-tasks-old.png, which was released into the public domain by its creator AzaToth. Original artist: Tkgd2007

1.3 Content license


Creative Commons Attribution-Share Alike 3.0

You might also like