Python3 Notes
Python3 Notes
Bob Dowling
University Computing Service
scientific-computing@ucs.cam.ac.uk
http://www.ucs.cam.ac.uk/docs/course-notes/unix-courses/PythonAB 1
1
Course outline ― 1
Who uses Python & what for
What sort of language it is
Text
Names for values
Reading in user data
Numbers
Conversions
Comparisons
Truth & Falsehood
2
2
Course outline ― 2
Assignment
Names
Loops
if… else…
Indentation
Comments
3
Course outline ― 3
Lists
Indices
Lengths
Changing items
Extending lists
Methods
Creating lists
Testing lists
Removing from lists
for… loop
Iterables
Slices
4
4
Course outline ― 4
Files
Reading & writing
Tuples
Modules
System modules
External modules
Dictionaries
Formatted text
5
5
Who uses Python?
On-line games
Web services
Applications
Science
Instrument control
Embedded systems
en.wikipedia.org/wiki/List_of_Python_software
6
6
What sort of language is Python?
Compiled Interpreted
7
Running Python ― 1
We are going to use Python from the command line either directly or
indirectly.
So, first I need a Unix command line. I will get that from the GUI by clicking
on the terminal icon in the desktop application bar.
8
Running Python ― 2
Unix prompt
Unix command
Introductory blurb
$ python3
Python 3.2.3 (default, May 3 2012, 15:54:42)
[GCC 4.6.3] on linux2
Python prompt
Now, the Unix interpreter prompts you to give it a Unix command with a
short bit of text that ends with a dollar. In the slides this will be represented
simply as a dollar.
This is a Unix prompt asking for a Unix command.
The Unix command we are going to give is “python3”. Please note that
trailing “3”. The command “python” gives you either Python 2 or Python 3
depending on what system you are on. With this command we are insisting
on getting a version of Python 3.
The Python interpreter then runs, starting with a couple of lines of blurb. In
particular it identifies the specific version of Python it is running. (3.2.3 in
this slide.)
Then it gives a prompt of its own, three “greater than” characters. The
Python 3 program is now running and it is prompting us to give a Python
command.
You cannot give a Unix command at a Python prompt (or vice versa).
9
Quitting Python
>>> exit()
Any one
>>> quit()
of these
>>> Ctrl + D
10
There are various ways to quit interactive Python. There are two commands
which are equivalent for our purposes: quit() and exit(), but the
simplest is the key sequence [Ctrl]+[D].
10
A first Python command
Python prompt
Python command
11
There is a tradition that the first program you ever run in any language
generates the output “Hello, world!”.
I see no reason to buck tradition. Welcome to your first Python command;
we are going to output “Hello, world!”.
We type this command at the Python prompt. The convention in these slides
is that the typewriter text in bold face is what you type and the text in regular
face is what the computer prints.
We type “print” followed by an opening round brackets and the text
“Hello, world!” surrounded by single quotes, ending with a closing
round bracket and hitting the Return key, [ ↲], to indicate that we are done
with that line of instruction.
The computer responds by outputting “Hello, world!” without the
quotes.
Once it has done that it prompts us again asking for another Python
command with another Python prompt, “>>>”.
11
Python commands
Python “function”
Round brackets
― “parentheses”
print('Hello, world!')
Function’s “argument”
12
This is our first Python “function”. A function takes some input, does
something with it and (optionally) returns a value. The nomenclature derives
from the mathematics of functions, but we don’t need to fixate on the
mathematical underpinnings of computer science in this course.
Our function in this case is “print” and the command necessarily starts
with the name of the function.
The inputs to the function are called its “arguments” and follow the function
inside round brackets (“parentheses”).
In this case there is a single argument, the text to print.
Note that Python, as with many but not all programming languages, is “case
sensitive”. The word “print” is not the same as “Print” or “PRINT”.
12
Python text
Quotation marks
'Hello, world!'
The body
of the text
The text itself is presented within single quotation marks. (We will discuss
the choice of quotation marks later.)
The body of the text comes within the quotes.
The quotes are not part of the text; they merely indicate to the Python
interpreter that “hey, this is text!”
Recall that the the printed output does not have quotes.
13
Quotes?
print Command
'print' Text
14
14
Python scripts
File in home directory print('Hello, world!')
Unix prompt
Unix command
to run Python
$ Unix prompt 15
15
Editing Python scripts ― 1
16
To edit scripts we will need a plain text editor. For the purposes of this
course we will use an editor called “gedit”. You are welcome to use any
text editor you are comfortable with (e.g. vi or emacs).
Unfortunately the route to launch the editor the first time is a bit clunky.
Actually, it’s a lot clunky.
1. Click on the “Dash Home” icon at the top of the icon list.
This launches a selection tool that starts blank. If you have been using some
other files then these may show as “recent files”.
2. At the bottom of the widget you will see the “house” icon highlighted.
Click on the “three library books” icon next to it.
This switches the selector to the library of applications.
16
Editing Python scripts ― 2
17
3. Click on the “see more results” text to expose the complete set of
supported applications.
4. Scroll down until you see the “Text Editor” application. (The scroll
mouse tends to work better than dragging the rather thin scroll bar.)
5. Click the “Text Editor” icon.
17
Editing Python scripts ― 3
18
18
Editing Python scripts ― 4
19
Future launches won’t be anything like as painful. In future the text editor will
be immediately available in “Recent Apps”.
19
Progress
Interactive Python
Python scripts
print() command
20
20
Exercise 1
2 minutes
21
During this course there will be some “lightning exercises”. These are very
quick exercises just to check that you have understood what’s been covered
in the course up to that point.
Here is your first.
First, make sure you can print text from interactive Python and quit it
afterwards.
Second, edit the exercise1.py script and run the edited version with the
different output.
This is really a test of whether you can get the basic tools running. Please
ask if you have any problems!
21
A little more text
www.unicode.org/charts/ hello2.py
22
Now let’s look at a slightly different script just to see what Python can do.
Python 3 has excellent support for fully international text. (So did Python 2
but it was concealed.)
Python 3 supports what is called the “Unicode” standard, a standard
designed to allow for characters from almost every language in the world. If
you are interested in international text you need to know about the Unicode
standard. The URL shown will introduce you to the wide range of characters
supported.
The example in the slide contains the following characters:
ℏ PLANCK’S CONSTANT DIVIDED BY TWO PI
э CYRILLIC SMALL LETTER E
ł LATIN SMALL LETTER L WITH BAR
Ꮣ CHEROKEE LETTER DA
ዐ ETHIOPIC SYLLABLE PHARYNGEAL A
ω GREEK SMALL LETTER OMEGA
☺ WHITE SMILING FACE
ր ARMENIAN SMALL LETTER REH
Ꮣ COPTIC SMALL LETTER LAUDA
∂ PARTIAL DIFFERENTIAL
‼ DOUBLE EXCLAMATION MARK
22
Getting characters
˘
ğ Character Selector
“LATIN SMALL
LETTER G \u011f
WITH BREVE”
23
23
Text: a “string” of characters
Class: string
Length: 13
Letters
str 13 H e l l o , ␣ w o r l d !
24
We will quickly look at how Python stores text, because it will give us an
introduction to how Python stores everything.
Every object in Python has a “type” (also known as a “class”).
The type for text is called “str”. This is short for “string of characters” and is
the conventional computing name for text. We typically call them “strings”.
Internally, Python allocates a chunk of computer memory to store our text. It
stores certain items together to do this. First it records that the object is a
string, because that will determine how memory is allocated subsequently.
Then it records how long the string is. Then it records the text itself.
24
Text: “behind the scenes”
str 13 72 101 108 108 111 44 32 … 100 33
>>> ord('ğ')
287
28710
>>> chr(287)
'ğ'
ğ 25
In these slides I’m going to represent the stored text as characters because
that’s easier to read. In reality, all computers can store are numbers. Every
character has a number associated with it. You can get the number
corresponding to any character by using the ord() function and you can
get the character corresponding to any number with the chr() function.
Mathematical note:
The subscript 10 and 16 indicate the “base” of the numbers.
25
Adding strings together: +
hello3.py
>>> 'Hello, ' + 'world!'
'Hello, world!'
>>>
26
26
Pure concatenation
>>> 'Hello,␣' + 'world!'
'Hello, world!'
This joining together is very simple. If you want words split by a space you
have to put the space in.
27
Single & double quotes
28
It doesn’t matter whether we write our strings with single or double quotes
(so long as they match at the two ends). Python simply notes that we are
defining a string.
28
Python strings: input & output
'Hello, world!'
Single or double
quotes on input.
"Hello, world!"
Create same
string object.
29
Internally there are no quotes, just a record that the object is text.
When Python comes to display the string and declares “this is text” itself it
uses single quotes.
29
Uses of single & double quotes
30
30
Why we need different quotes
31
You must mix the quotes like that. If you do not then Python will be unable to
make sense of the command.
We will look at Python’s error messages in more detail later.
31
Adding arbitrary quotes
32
32
Putting line breaks in text
Hello,
world! What we want
>>> print('Hello, ↵
File "<stdin>", line 1
print('Hello,
^
SyntaxError: EOL while
scanning string literal
✘ “EOL”: End Of Line
33
33
Inserting “special” characters
>>> print('Hello,\nworld!')
Hello, Treated as
world! a new line.
\n Converted into a
single character.
str 13 H e l l o , ↵ w o r l d !
>>> len('Hello,\nworld!')
13 len() function: gives
the length of the object
34
34
The backslash
Special Ordinary \' '
\" "
Ordinary Special \n ↵
\t ⇥
35
We have used backslash again, this time for a slightly different result.
Backslash before a character with special significance, such as the quote
character, makes the character “ordinary”. Used before an ordinary
character, such as “n”, it produces something “special”.
Only a few ordinary characters have special characters associated with
them but the two most commonly useful are these:
\n ↵ new line
\t ⇥ tab stop
35
\n: unwieldy for long text
'SQUIRE TRELAWNEY, Dr. Livesey, and the\n
rest of these gentlemen having asked me\n
to write down the whole particulars\nabou
t Treasure Island, from the\nbeginning to
the end, keeping nothing\nback but the b
earings of the island,\nand that only bec
ause there is still\ntreasure not yet lif
ted, I take up my\npen in the year of gra
ce 17__ and go\nback to the time when my
father kept\nthe Admiral Benbow inn and t
he brown\nold seaman with the sabre cut f
irst\ntook up his lodging under our roof.'
Single
line 36
The “\n” trick is useful for the occasional new line. It is no use for long texts
where we want to control the formatting ourselves.
36
Special input method for long text
'''SQUIRE TRELAWNEY, Dr. Livesey, and the
rest of these gentlemen having asked me
to write down the whole particulars
about Treasure Island, from the
beginning to the end, keeping nothing
back but the bearings of the island,
and that only because there is still
treasure not yet lifted, I take up my
pen in the year of grace 17__ and go
back to the time when my father kept
the Admiral Benbow inn and the brown
old seaman with the sabre cut first
took up his lodging under our roof. '''
Triple Multiple
quotes lines 37
Python has a special trick precisely for convenient definition of long, multi-
line text.
If you start the text with a “triple quote” then the special treatment of hitting
the [↵] key is turned off. This lets you enter text “free form” with natural line
breaks.
The triple quote is three quote characters with no spaces between them.
The quote character used can be either one but the triple use at one end
must match the one used at the other end.
37
Python’s “secondary” prompt
>>> '''Hello,
... world'''
Python asking for more
of the same command.
38
The triple quote lets us see another Python feature. If we type a long string
raw then after we hit ↵ we see Python’s “secondary prompt”. The three dots
indicate that Python is expecting more input before it will process what it has
in hand.
38
It’s still just text!
>>> 'Hello,\nworld!'
'Hello\nworld'
Python uses \n to represent
line breaks in strings.
>>> '''Hello,
... world!'''
39
It is also important to note that triple quotes are just a trick for input. The text
object created is still a standard Python string. It has no memory of how it
was created.
Also note that when Python is representing the content of a string object (as
opposed to printing it) it displays new lines as “\n”.
39
Your choice of input quotes:
Four inputs:
'Hello,\nworld!' "Hello,\nworld!"
'''Hello, """Hello,
world!''' world!"""
Same result:
str 13 H e l l o , ↵ w o r l d !
40
We have now seen four different ways to create a string with an embedded
new line. They all produce the same string object.
40
Progress
International text
print()
Concatenation of strings
Special characters
Long strings
41
41
Exercise 2
coffee
café
caffè
Kaffee
è \u00e8 AltGr + ; e
42
Attaching names to values
“variables” message = 'Hello, world!'
print(message)
>>> message='Hello, world!'
'Hello, world!'
>>> type(message)
<class 'str'>
message str 13 H e l l o , ␣ w o r l d !
43
43
Attaching names to values
message = 'Hello, world!'
print(message)
>>> type(print)
print function
message str 13 H e l l o , ␣ w o r l d !
44
Both “print” and “message” are the same this way. Both are names
attached to Python objects. “print” is attached to a chunk of memory
containing the definition of a function and “message” is attached to a chunk
of memory containing the text.
44
Reading some text into a script
message = input('Yes?␣')
print(message)
input('Yes?␣')
Boo! print(message)
45
Now that we know how to attach names to values we can start receiving
input from the user of our script.
For this we will use the cunningly named “input()” function.
This function takes some (typically short) text as its argument. It prints this
text as a prompt and then waits for the user to type something back (and
press [↵]. It then returns whatever the user typed (without the [ ↵]) as its
value.
We can use this function on the right hand side of an assignment.
Recall that the assignment completely evaluates the right hand side first.
This means that it has to evaluate the input() function, so it prompts the
user for input and evaluates to whatever it was that the user typed.
Then the left hand side is processed and the name “message” is attached to
this value.
We can then print this input text by using the attached name.
45
Can't read numbers directly!
$ python3 input2.py number = input('N?␣')
print(number + 1)
✘
N? 10
input2.py
string integer 46
46
input(): strings only
$ python3 input2.py number = input('N?␣')
print(number + 1)
✘
N? 10
input2.py
input('N?␣') str 2 1 0
≠ int 10
47
The problem is that the input() function always returns a string and the
string “character 1 followed by character 0” is not the same as the integer
ten.
We will need to convert from the string to the integer explicitly.
47
Some more types
>>> type(42)
>>> type(3.14159)
48
Converting text to integers
>>> int('10')
str 2 1 0 int 10
10
>>> int('␣-100␣')
str 6 ␣ - 1 0 0 ␣
-100
int -100
>>> int('100-10')
✘
ValueError:
invalid literal for int() with base 10: '100-10'
49
49
Converting text to floats
>>> float('␣10.␣')
10.0
50
50
Converting between ints and floats
>>> float(10)
10.0
>>> int(10.9)
10 Truncates
fractional part
>>> int(-10.9)
-10
51
The functions can take more than just strings, though. They can take other
numbers, for example. Note that the int() function truncates floating point
numbers.
51
Converting into text
'10'
'10.0'
52
52
Converting between types
53
In general there is a function for each type that converts whatever it can into
that type.
53
Reading numbers into a script
text = input('N?␣')
number = int(text)
print(number + 1)
N? 10
11
54
So finally we can see what we have to do to make our failing script work: we
need to add a type conversion line.
54
Progress
Names Values name = value
Types strings
integers
55
Exercise 3
3 minutes
56
56
Integers
ℤ {… -2, -1, 0,
1, 2, 3, 4 …}
57
57
Integer addition & subtraction
>>> 20+5
25
“No surprises”
58
We can start our handling of integers with some very basic arithmetic.
Note that spaces around the plus and minus character are ignored.
Adding or subtracting two integers simply gives a third integer.
58
Integer multiplication
There is no “×” on the keyboard. Linux:
AltGr + Shift + ,
Use “*” instead
>>> 20␣*␣5
100
Still no surprises
59
59
Integer division
There is no “÷” on the keyboard. Linux:
AltGr + Shift + .
Use “/” instead
>>> 20␣/␣5
4.0 This is a floating point number!
Surprise!
60
60
Integer division gives floats !
Fractions Floats sometimes
!
Consistency Floats always
>>> 20␣/␣40
0.5
>>> 20␣/␣30
0.6666666666666666
61
61
Integer powers
There is no “42” on the keyboard.
62
62
Integer remainders
e.g. Is a number even or odd?
Use “%”
>>> 4␣%␣2
0
>>> 5␣%␣2
1
>>> -5␣%␣2
1 Remainder is always non-negative
63
There’s one last integer arithmetic operator we will use once in a while.
Another way to look at division is to ask what the remainder is after a
division. Python represents this concept by using the percent sign between
to numbers to represent the remainder when the first number is divided by
the second.
We will use it for one purpose only in this course: to determine if a number is
even or odd. If a number’s remainder when divided by 2 is 0 then it’s even
and if the remainder is 1 then it’s odd.
63
How big can a Python integer be?
>>> 2**2
4
>>> 4**2
16
>>> 16**2
256
>>> 256**2
65536
>>> 65536**2
4294967296
64
Now we will look at the numbers themselves. We can ask the question “how
big can an integer be?” Mathematically, of course, there is no limit. In a
computer there are always limits. Each computer has only a finite amount of
memory to store information so there has to be a limit. We will see that
Python has no limits in principle and it is only the technical limit of the
computer that can restrict us. In practice this is never an issue for the size of
integers.
We will experiment with large integers by repeated squaring. We start with a
2 and keep squaring.
64
How big can a Python integer be?
>>> 4294967296**2
18446744073709551616
>>> 18446744073709551616**2
340282366920938463463374607431768211456
>>> 340282366920938463463374607431768211456**2
1157920892373161954235709850086879078532699846
65640564039457584007913129639936
>>> 115792089237316195423570985008687907853269
984665640564039457584007913129639936**2
1340780792994259709957402499820584612747936582
0592393377723561443721764030073546976801874298
1669034276900318581864860508537538828119465699
65
46433649006084096
65
How big can a Python integer be?
10443888814131525066917527107166243825799642490473837803842334832839
53907971557456848826811934997558340890106714439262837987573438185793
60726323608785136527794595697654370999834036159013438371831442807001
18559462263763188393977127456723346843445866174968079087058037040712
84048740118609114467977783598029006686938976881787785946905630190260
94059957945343282346930302669644305902501597239986771421554169383555
98852914863182379144344967340878118726394964751001890413490084170616
There is no limit!
75093668333850551032972088269550769983616369411933015213796825837188
09183365675122131849284636812555022599830041234478486259567449219461
70238065059132456108257318353800876086221028342701976982023131690176
78006675195485079921636419370285375124784014907159135459982790513399
61155179427110683113409058427288427979155484978295432353451706522326
90613949059876930021229633956877828789484406160074129456749198230505
Except for
71642377154816321380631045902916136926708342856440730447899971901781
machine
46576347322385026725305989979599609079946920177462481771844986745565
memory
92501783290704731194331655508075682218465717463732968849128195203174
57002440926616910874148385078411929804522981857338977648103126085903
00130241346718972667321649151113160292078173803343609024380470834040
3154190336
66
66
Big integers
2
C / C++
Fortran
4
16
int
INTEGER*4 256
long 65536
INTEGER*8
4294967296
long long
INTEGER*16 18446744073709551616
This may sound rather trivial but, in fact, Python is quite exceptional in this
regard. The compiled languages have to allocate space for their integers in
advance and so place limits on how large they can grow.
67
Floating point numbers
1.0
ℝ
✗ 0.33333333
3.14159265
2.71828182 68
And that’s it for whole numbers. Now we will look at floating point numbers,
a computer’s way of storing fractional values. This is a computer’s
approximation to the real numbers. As we will see it is a problematic
approximation.
The fancy ℝ is the mathematical symbol for the real numbers, from the
English word Real.
68
Basic operations
>>> 20.0 + 5.0 >>> 20.0 - 5.0
25.0 15.0
69
For our basic operations, floating point numbers behave just the same as
integers, using the same operators to achieve the same results. Floating
point division creates a floating point number.
69
Floating point imprecision
>>> 1.0 / 3.0
0.3333333333333333
≈ 17 significant figures
70
70
Hidden imprecision
>>> 0.1
!
0.1
71
How big can a Python float be? ― 1
>>> 65536.0**2 So far, so good.
4294967296.0
1.8446744073709552 e+19
1.8446744073709552 ×1019
72
Let’s ask the same question about floats as we asked about integers: how
large can they be?
We will repeat our approach of repeated squaring. We fast-forward to start
at 65536.0 squared and notice that we soon get anomolous responses.
When we square 4,294,967,296 we get a number with the letter “e” in it.
User’s of pocket calculators at school may recognise this representation: it
indicates a number between 1.0 and 9.999… multiplied by a power of 10.
Floating point numbers can only hold roughly 17 significant figures of
accuracy. This means that when the integer needs more than 17 digits
something has to give.
72
Floats are not exact
>>> 4294967296.0**2 Floating point
1.8446744073709552e+19
1.8446744073709552×1019 18446744073709552000
- 18446744073709551616
384
73
73
How big can a Python float be? ― 2
>>> 1.8446744073709552e+19**2
3.402823669209385e+38
>>> 3.402823669209385e+38**2
1.157920892373162e+77
74
If we accept that our answers are now only approximate we can keep
squaring. The “e-number” representation of scientific notation is accepted on
input by Python.
When we come to square 1.3407807929942597×10 154, though, we hit
another issue, this one fatal.
We get an “overflow error”. This means we have tried to create a floating
point number larger than Python can cope with. Under some circumstances
the “too big” problem gives rise to a sort-of-number called “inf” (standing
for “infinity”).
74
Floating point limits
1.2345678901234567 × 10N
17 significant figures
Positive values:
4.94065645841×10-324 < N < 8.98846567431×10307
75
Just for the record, floating point numbers have limits both in terms of the
largest and smallest numbers they can contain.
75
Complex numbers
ℑ
ℂ z
z2
>>> (1.25+0.5j)**2
(1.3125+1.25j)
76
Python also supports complex numbers, using j for the square root of -1.
We will not use them in this course, but you ought to know they exist.
76
Progress
Arithmetic + - * / ** %
Integers No limits!
Limited precision
Complex numbers
77
77
Exercise 4
1. 223 ÷ 71
2. (1 + 1/10)10
3. (1 + 1/100)100
4. (1 + 1/1000)1000
3 minutes
78
78
Comparisons
5 < 10 ✔
5 > 10 ✘
79
79
Comparisons
80
80
True & False
>>> type(True)
<class 'bool'> “Booleans”
5 + 10 15 int
int int
The important thing to understand is that this is not just Python reporting on
a test but rather the value generated by the test. True and False are (the
only) two values of a special Python type called a “Boolean” used for
recording whether something is true or not.
Just as the “+” operator takes two integers and returns an integer value, the
“<” operator takes two integers and returns a Boolean.
Booleans are named after George Boole, whose work laid the ground for
modern algebraic logic. (His classic book’s full title is “An Investigation of the
Laws of Thought on Which are Founded the Mathematical Theories of Logic
and Probabilities”, in true Victorian style.)
81
True & False
bool ✓ True
Only two values
bool ✗ False
82
82
Six comparisons
Maths Python
≠ !=
< <
> >
≤ <=
≥ >=
83
83
Equality comparison & assignment
name = value
= Attach a name to a value.
value1 == value2
== Compare two values
84
84
Textual comparisons
True
True
True
85
85
Ordering text is complicated
Python inequalities use Unicode character numbers.
86
“Syntactic sugar”
0 < number
number < 10
>>> number = 5
True
87
87
Converting to booleans
float() Converts to floating point numbers
<class 'float'>
int() Converts to integers
<class 'int'>
str() Converts to strings
<class 'str'>
As with all Python types there is a function named after the type that tries to
convert arbitrary inputs into Booleans. Given that there are only two Boolean
values this tends to be a very simple function.
88
Useful conversions
0 False Zero
1 True Non-zero
12 True
89
-1 True
89
Boolean operations
bool
? bool
bool
90
Boolean types have their own arithmetic just like ordinary numbers. It was
the algebra of these that George Boole developed.
90
Boolean operations ― “and”
bool
and bool
bool
91
Boolean operations ― “and”
92
We are much more likely to encounter the input booleans as the results of
comparisons that as literal values.
92
Boolean operations ― “or”
bool
or bool
bool
The next boolean operation to look at is “or”. The results of this operation is
True if either of its inputs are True and False only if both its inputs are
False.
93
Boolean operations ― “or”
94
Again, we tend to encounter it more often with other tests than with literal
booleans.
94
Boolean operations ― “not”
95
The final operation is “not”. This takes only one input and “flips” it. True
becomes False and vice versa.
95
Boolean operations ― “not”
False
True
96
96
Ambiguity in expressions
3+6/3
✘ ✔
(3 + 6) / 3 3 + (6 / 3)
3 5
97
97
Division before addition
3+6/3
Division first
3+ 2
Addition second
5
98
98
“Order of precedence”
First
not x x and y x or y
99
Last
99
Progress
Comparisons == != < > <= >=
Order of precedence
100
100
Exercise 5
Predict whether these expressions will evaluate to True or False.
Then try them.
3. 60 - 45 / 5 + 10 == 1
3 minutes
101
101
Names and values: “assignment”
Now let’s go back to the attaching of names to values that we saw with our
hello3.py script.
Consider the simple Python instruction shown.
Python does two things, strictly in this order:
First, it notices the literal value 100 (an integer). So Python allocates a
chunk of memory large enough and creates a Python object in it that
contains a Python integer with value 100.
Second, it creates the name “alpha” and attaches it to the integer.
102
Assignment: right to left
alpha = 100
103
The key thing to note is that the processing happens right to left. Everything
to the right hand side is processed first. Only after that processing is done is
the left hand side considered.
In this example it’s trivial. It will become less trivial very soon so remember
that the right hand side is evaluated before the left hand side is even looked
at.
ps: Computing uses the phrases “left hand side” and “right hand side” so
often that they are typically written as “LHS” and “RHS”.
103
Simple evaluations
>>> beta = 100 + 20
1. 100 + 20 RHS
2. 120
int
3. LHS
beta int 120
104
104
Names on the RHS — 1
>>> gamma = alpha + 40
alpha + 40 RHS
1.
alpha
2.
3.
int 140
105
105
Names on the RHS — 2
>>> gamma = alpha + 40
LHS
4. gamma 140
int
106
Only after all that is the LHS considered, and the name “gamma” is created
and attached to the newly minted integer.
106
Same name on both sides — 0
Starting
gamma int 140 position
>>> print(gamma)
140
107
107
Same name on both sides — 1
RHS
>>> gamma = gamma + 10
1. gamma + 10
2. gamma
3. 140
int function + int 10
4. 150
int
108
Then we run an assignment that has the name gamma on both the left and
right hand sides.
Again, first of all Python focuses exclusively on the RHS.
The expression “gamma + 10” is evaluated to give rise to an integer 150 in
Python memory.
108
Same name on both sides — 2
LHS
>>> gamma = gamma + 10
Only once that evaluation is complete does Python turn its attention to the
LHS.
The name gamma is going to be attached to the integer 150 in Python
memory. No attention is paid to where the integer 150 came from.
The name gamma is already in use and is attached to the integer 140. Its
attachment is changed to the new integer 150.
109
Same name on both sides — 3
LHS
>>> gamma = gamma + 10
int 150
7.
gamma int
✗ 140 No longer
used.
110
Once that is done there are no remaining references to the old integer 140.
Python automatically cleans it up, freeing the space for re-use.
This is a process called “garbage collection”. In some languages you have
to free up unused space yourself; in Python the system does it for you
automatically.
110
“Syntactic sugar”
111
111
Deleting a name ― 1
>>> print(thing)
>>> print(thing)
1
112
112
Deleting a name ― 2
>>> print(thing)
1 Known
variable
>>> del thing
>>> print(thing)
To delete the attachment we use the Python command “del”. The command
del thing
returns us to the state where the name is no longer known.
You can delete multiple names with the slightly extended syntax
del thing1, thing2, thing3
This is equivalent to
del thing1
del thing2
del thing3
but slightly shorter.
113
Common mistake
a = 10
!
b = 7
b = a - b b = a - b b ≠ 10 - 7 = 3
= 17 - 7
= 10
(ab)→( a−b
a+b
)
we need to be careful not to use a “half-transformed” state in the second
half of the transformation. If we calculate the new value for one coordinate
we can’t (trivially) use it in the calculation of the new value of the second
coordinate.
Later in this course when we look at “tuples” we will see a slick Python way
to fix this problem.
114
Progress
115
115
Our first “real” program
116
116
Square root of 2.0 by “bisection”
“Interval of uncertainty”
The technique we are going to use is called “bisection”. If you know this
technique you can relax for the next few slides. Please don’t snore. ☺
We are going to go through it by hand for a few iterations because when we
come to implement it in Python it is important that any confusion is due to
the Python, and not the maths the Python is implementing.
The trick is to identify a range of values that must contain the actual value
of √2. That is, we identify a lower bound that is less than √2 and an upper
bound that is greater than √2.
We then have some way (which we will explain in the following slides) to
improve that estimate by reducing the length of that interval of uncertainty.
To be precise, we will cut the uncertainty in half which is why the process is
called “bisection”.
We start by taking a lower bound of x=0, which is definitely lower than x=√2
because y=02=0<2, and an upper bound of x=2, which is definitely higher
than x=√2 because y=22=4>2.
117
Square root of 2.0 by bisection — 1
1.0**2
1.0
Mid-point: 1.0
118
118
Square root of 2.0 by bisection — 2
So what?
Well, y=1 is less than y=2 so the corresponding x-value, x=1 makes an
acceptable lower bound for the interval of uncertainty. And if we change our
lower bound to this value then our interval only runs from x=1 to x=2 with
total length 1, rather than its original length 2.
We have halved our uncertainty.
If we can do this trick multiple times then we will reduce the interval of
uncertainty very quickly to a length so small as to be irrelevant.
119
Square root of 2.0 by bisection — 3
1.5**2
2.25
Mid-point: 1.5
120
120
Square root of 2.0 by bisection — 4
121
Square root of 2.0 by bisection — 5
1.25**2
1.5625
Mid-point: 1.25
122
We find the new mid-point again, x=1.25. Squaring this gives the
corresponding y-value y=1.5625.
122
Square root of 2.0 by bisection — 6
y=1.5625 is less than y=2 so we change the lower bound. Our interval of
uncertainty now has length ¼.
123
Square root of 2.0 by bisection — 7
1.375**2
1.890625
Mid-point: 1.375
124
And again…
124
Square root of 2.0 by bisection — 8
125
Exercise 6
2 minutes
126
1.375 < √2 < 1.5
Please make sure that you understand the principle and do one more
iteration by hand.
126
Understanding before Programming
127
Apologies for spending so long on the maths but this is a general situation.
You must understand the situation before you can program it.
127
And now using Python!
lower = 0.0
upper = 2.0
middle = (lower+upper)/2
128
128
And now using Python — 2
True
lower = middle
print(lower, upper)
1.0 2.0
129
Next, we find the y‑value corresponding to the mid-point (by squaring the
x‑value 1.0) and ask if it is less than 2.0, the number whose square root we
are looking for.
middle**2 < 2.0
Recall that this will return a Python boolean value: True or False.
The squared value is 1.0 which is less than 2.0 (i.e. we get True) so we
raise the lower limit of the interval to the mid-point.
lower = middle
In this example we print the x‑value at each end of the interval to track our
progress.
129
And now using Python — 3
middle = (lower+upper)/2
print(middle, middle**2)
1.5 2.25
130
So we do it again.
We re-calculate the x‑value for the mid-point. Note that because we
changed the value the name lower was attached to the Python instruction is
identical to the one we gave first time round:
middle = (lower+upper)/2
We do some additional printing to track progress.
130
And now using Python — 4
False
upper = middle
print(lower, upper)
1.0 1.5
131
Again, we ask if the mid-point’s y‑value (i.e. its x‑value squared) is above or
below our target of 2.0:
middle**2 < 2.0
and this time get a boolean False. Because the value is greater than 2.0
(our test evaluates to False) we change the value of the upper bound of
the interval by attaching the name upper to the x‑value of the mid-point:
upper = middle
The values being handled are exactly the same as they were when we did it
as “raw maths” but this time they have names.
131
And now using Python — 5
middle = (lower+upper)/2
print(middle, middle**2)
1.25 1.5625
132
132
And now using Python — 6
True
lower = middle
print(lower, upper)
1.25 1.5
133
133
And now using Python — 7
middle = (lower+upper)/2
print(middle, middle**2)
1.375 1.890625
134
Fourth iteration.
134
And now using Python — 8
True
lower = middle
print(lower, upper)
1.375 1.5
135
135
Looking at the Python code
lower = 0.0
upper = 2.0
middle = (lower+upper)/2
print(middle, middle**2)
✔ ? ✘
lower = middle upper = middle
136
Looking at the Python structures
lower = 0.0 Set up
upper = 2.0
Loop
middle = (lower+upper)/2
print(middle, middle**2)
Choice
middle**2 < 2.0
✔ ? ✘
lower = middle upper = middle
137
Looping
Before
Should the
Loop test
loop run
✘ ✔ (again)?
What is
Loop body run each
loop?
After
138
138
Loop example: Count from 1 to 10
Before number = 1
✘ ✔ ✘ ✔
print(number)
Loop body number += 1
After print('Done!')
139
Let’s consider an example that’s simpler than our square root loop: counting
from 1 to 10.
Our “before” block initializes the attachment of a name number to a value 1:
number = 1
Our test sees if number is attached to a value less than or equal to 10 (our
final value):
number <= 10
Recall that this evaluates to a boolean value.
If the test evaluates to True then we run the loop body. This has two lines,
the first to print the value of number and the second to increase it by one:
print(number)
number += 1
If the test evaluates to False then we don’t loop and exit the structure. We
have a pointless print statement as a place-holder for more substantive
code in serious scripts:
print('Done!')
This is what we want to encode in Python.
139
Loop example: Count from 1 to 10
number = 1 number = 1
✘ ✔
print('Done!') print('Done!')
140
140
Loop test: Count from 1 to 10
number = 1
“while” keyword
loop test
while number <= 10 : colon
␣␣␣␣ print(number)
␣␣␣␣ number += 1
print('Done!')
141
We will start by looking at what we have done to the test. The test itself is
number <= 1
which is a Python expression that evaluates to a boolean, True or False.
We precede the test expression with the Python keyword “while”. This is
what tells Python that there’s a loop coming. It must be directly followed by
an expression that evaluates to a Boolean.
We follow the test expression with a colon. This is the marker that the
expression is over and must be the last element on the line.
Note that the test evaluates to True for the loop to be run and False for the
loop to quit. We are testing for “shall the loop keep going” not “shall the loop
stop”. Python tests for while, not until.
141
Loop body: Count from 1 to 10
number = 1
␣␣␣␣ print(number)
␣␣␣␣ number += 1 loop body
indentation
print('Done!')
142
The loop body, the code that is repeated, appears on the lines following the
“while line”. Both its lines are indented by four spaces each.
Note that the “after” section is not indented.
142
Loop example: Count from 1 to 10
$ python3 while1.py
number = 1
1
while number <= 10 : 2
3
print(number)
4
number += 1
5
6
print('Done!') 7
8
9
while1.py 10
Done!
$
143
First let’s check that this really works. In the file while1.py in your home
directories you will find exactly the code shown in the slide. Run it and
watch Python count from 1 to 10.
143
Python’s use of indentation
number = 1
The four spaces of indentation are not cosmetic. A sequence of lines that
have the same indentation form blocks in Python and can be thought of as a
single unit of code. In this case both lines get run (again) or neither of them
do.
The indented block is ended by the first line that follows it with no
indentation.
144
c.f. “legalese”
1
1(a)
1(b)
1(b)(i)
1(b)(ii)
1(b)(iii)
1(c)
2
3
145
145
Other languages
C while ...
{ { ... } Syntax
␣␣␣␣...
␣␣␣␣... ␣␣␣␣... Clarity
}
146
146
Progress
while ... : before
while test :
test to keep looping ␣␣␣␣action1
␣␣␣␣action2
␣␣␣␣action3
code blocks
afterwards
␣␣␣␣indentation
147
147
Exercise 7
while6.py
148
Back to our square root example
uncertainty tolerance
0.0 2.0
2.0 1.0×10–15
×½
1.0 2.0
1.0
What we want
×½
1.0 1.5
0.5
×½
1.25 1.5
0.25
×½
1.375 1.5
0.125 What we get 149
Now let’s return to our square root example. We have a loop the body of
which halves the length of the interval of uncertainty. We need to put this
into a Python loop so we need a corresponding loop test.
One typical approach is to test to see if the interval is longer than some
acceptable value. In this case we will demand that the interval have length
no longer than 10-15. (It will take 51 halvings to get from an initial length of
2.0 to something less than 10-15.)
A common name for an “acceptable uncertainty” is a “tolerance”: the amount
of uncertainty we are prepared to tolerate.
149
Keep looping while … ?
uncertainty > tolerance
150
We need a Python test for this. Recall that Python needs a test that
evaluates to True for the loop body to run. Our test then is ”is the current
uncertainty larger than the acceptable tolerance?”
We will set a name, tolerance, to have the value 1.0e-15, calculate an
uncertainty each loop and perform the test
uncertainty > tolerance
If this is True then we need to keep going.
If it is False then we can stop.
150
Square root: the loop
tolerance = 1.0e-15 Set up
lower = 0.0
upper = 2.0
uncertainty = upper - lower
Loop
while uncertainty > tolerance :
print(lower, upper)
151
uncertainty = upper - lower
So, if we return to our basic structure we can now see how Python’s while
syntax fits in.
We establish a tolerance.
We establish an initial uncertainty.
We test for
uncertainty > tolerance
as the loop test.
We recalculate the uncertainty at the end of the loop block for use in the
next round of the test.
151
Choosing
Choice
middle**2 < 2.0
✔ ? ✘
lower = middle upper = middle
Once again we have a test followed by some actions. This time, however,
the test doesn’t decide whether or not to run a block of code again, but
rather which of two blocks of code to run once.
Our test ― a Python expression that evaluates to a boolean ― is simply:
middle**2 < 2.0
and if this evaluates to True then we change the lower bound:
lower = middle
and if it evaluates to False then we change the upper bound:
upper = middle
Either way, once one or the other has run we move on and do not return to
the test.
152
Simple example
text = input('Number? ') $ python3 ifthenelse1.py
number = int(text)
Number? 8
if number % 2 == 0: Even number
print('Even number') That was fun
else:
print('Odd number')
153
153
if…then… else… ― 1
if keyword
Test
if number % 2 == 0 : Colon
else :
154
The first line of the test looks very similar to the while syntax we have
already seen. In this case, however, it uses a new keyword: “if”.
The if keyword is followed by the test: a Python expression that evaluates
to a boolean.
The line ends with a colon.
154
if…then… else… ― 2
if number % 2 == 0 :
155
The test line is immediately followed by the block of code that is run if the
test evaluates as True.
Because it is a block of code it is indented by four spaces to mark it as a
block. This example has a single line, but the block can be as long as you
want.
This block is sometimes called the “then-block” because “if the test is True
then run this block”.
155
if…then… else… ― 3
if number % 2 == 0 :
156
After the then-block comes another new keyword, “else:”. This is not
indented and is level with the “if” to indicate that it is not part of the then-
block.
It is then followed by a second block of code, know as the “else-block”. This
is the code that is run if the test evaluates as False.
Again, because it is a block of code it is indented.
The else keyword and its corresponding block are optional. You can do
nothing if the test returns False. The then-block is compulsory.
156
if…then… else… ― 4
if number % 2 == 0 :
else :
157
After the else-block the script continues. The print line is unindented so is
not part of the else-block. This line is run regardless of the result of the test.
157
Our square root example
middle = (lower + upper)/2 Before
158
Progress
if ... : before
else: if test :
␣␣␣␣action1
␣␣␣␣action2
choice of two else:
code blocks ␣␣␣␣action3
afterwards
␣␣␣␣indentation
159
159
Exercise 8
5 minutes
160
160
Back to our example
tolerance = 1.0e-15
lower = 0.0
upper = 2.0
uncertainty = upper - lower
So how do we embed an if-test with its two code blocks inside a while-loop
as the loop’s body?
The body of the while-loop is indented four spaces. So we start the if-test
indented four spaces and make its indented blocks doubly indented.
161
Levels of indentation
tolerance = 1.0e-15
lower = 0.0
upper = 2.0
uncertainty = upper - lower
162
Trying it out
tolerance = 1.0e-15 $ python3 sqrt1.py
lower = 0.0
upper = 2.0 1.0 2.0
uncertainty = upper - lower 1.0 1.5
1.25 1.5
while uncertainty > tolerance :
1.375 1.5
middle = (lower + upper)/2
1.375 1.4375
if middle**2 < 2.0: 1.40625 1.4375
lower = middle 1.40625 1.421875
else:
upper = middle
...
print(lower, upper)
uncertainty = upper - lower 1.414213... 1.414213...
sqrt1.py
☺ 163
The file sqrt1.py in your home directories contains the code as described
in the slide. It produces a very nice approximation to the square root of 2.
163
Script for the square root of 2.0
tolerance = 1.0e-15
lower = 0.0
upper = 2.0 √2.0
uncertainty = upper - lower
So now we have the script for the square root of 2. The next thing to do is to
generalize it to produce square roots of any number.
164
Input target
165
165
Initial bounds?
lower = ?
upper = ?
if...then...else...
166
166
Initial bounds
167
167
Generic square root script?
text = input('Number?␣')
number = float(text)
User input
tolerance = 1.0e-15
uncertainty = upper - lower
168
Negative numbers?
"else" is optional
169
We can improve our code. A step missing from the previous script is “input
validation” where we check that the input makes sense. We ought to check
that we have not been asked to generate the square root of a negative
number.
169
“Chained” tests
...
170
The input validation phase comes straight after the input itself.
170
“Chained” tests ― syntactic sugar
text = input('Number?␣')
number = float(text)
...
171
sqrt3.py
However, it can be integrated with the initialization phase, and often is. After
all, if you can’t initialize from the input then the input isn’t valid.
This leads us to a multi-stage test of the number whose square root we
want:
Is it less than 0?
If not, is it less than 1?
If not then…
Python has an extension to the simple if…else… test to allow for the “if
not then is it…” situation.
“elif” introduces a test and a corresponding block of code. The code is
called only if the previous if… test failed and its own test passes.
171
Without elif…
text = input('Number?␣')
number = float(text)
172
With elif…
text = input('Number?␣')
number = float(text)
173
173
Progress
Nested structures while … :
if … :
Chained tests if … :
…
elif … :
…
Testing inputs to scripts elif … :
…
else:
…
exit() 174
174
Exercise 9
Only do the second part after exercise9.py
you have the first part working!
5 minutes
175
175
Comments
176
176
Python comment character
#
a.k.a. “pound”, “number”, “sharp”
177
Python, in common with most other scripting languages, uses the hash
character to introduce comments. The hash character and everything
beyond it on the line is ignored.
(Strictly speaking the musical sharp character “ ♯” is not the same as “#” but
people get very sloppy with similar characters these days. This isn’t at all
relevant to Python but the author is an annoying pedant on the correct use
of characters. And don’t get him started on people who use a hyphen when
they should use an en-dash or em-dash.)
177
Python commenting example
178
On a real Unix system…
#!/usr/bin/python3
$ fubar.py
instead of
$ python3 fubar.py
179
You may encounter a “hash pling“ first line in many imported Python scripts.
This is part of some “Unix magic” that lets us simplify our command lines.
We can’t demonstrate it here because the MCS file server doesn’t support
Unix semantics.
179
Progress
Comments
“#” character
#
180
180
Exercise 10
2 minutes
181
181
Recap: Python types so far
182
Lists
[ -3.141592653589793, -1.5707963267948966,
0.0, 1.5707963267948966, 3.141592653589793 ]
183
183
What is a list?
hydrogen, helium, lithium, beryllium, …, protactinium, uranium
So what is a list?
A list is simply a sequence of values stored in a specific order with each
value identified by its position in that order.
So for an example consider the list of names of the elements up to uranium.
184
What is a list?
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59
185
Creating a list in Python
A literal list
>>> primes
[2, 3, 5, 7, 11, 13, 17, 19] The whole list
>>> type(primes)
<class 'list'> A Python type
186
186
How Python presents lists
Square brackets
at the ends
187
187
Square brackets
188
We are going to meet square brackets used fr a lot of things so I will build
up a summary slide of their various uses. Here is use 1.
188
Python counts from zero
“index” 0 1 2 3 4 5 6 7
189
We still need to get at individual items in the list. Each is identified by its
position in the list.
Python, in common with many programming languages (but not all) starts its
count from zero. The leading element in the list is “item number zero”. The
one that follows it is “item number one” and so on. This number, the position
in the list counting from zero, is called the “index” into the list. The plural of
“index” is “indices”.
To keep yourself sane, we strongly recommend the language “item
number 3” instead of “the fourth item”.
189
Looking things up in a list
>>> primes = [ 2, 3, 5, 7, 11, 13, 17, 19]
0 1 2 3 4 5 6 7
190
Square brackets
191
191
Counting from the end
>>> primes = [ 2, 3, 5, 7, 11, 13, 17, 19]
0 1 2 3 4 5 6 7
-8 -7 -6 -5 -4 -3 -2 -1
Python has a trick for getting at the last element of the list. Negative indices
are also valid and count backwards from the end of the list. Typically the
only case of this that is used in paractice is that the index -1 gets the last
element of the list.
192
Inside view of a list
list
8 int 2 primes[0]
int 3 primes[1]
primes
…
int 17 primes[6]
int 19 primes[7]
193
We’ve seen these box diagrams for simple Python types already. The
structures for lists are a little more complicated but only a little. The list type
records how long it is and an ordered set of references to the actual objects
it contains.
193
Length of a list
list
>>> len(primes)
8 8
0 len() function:
length of list
primes
Maximum
7
index is 7
194
Note that the length of a list is the number of items it contains. The largest
legitimate index is one less than that because indices count from zero.
194
Changing a value in a list
>>> data = ['alpha', 'beta', 'gamma'] The list
So far we have created lists all in one go by quoting a literal list. We can use
the indexing notation (square brackets) to change items in a list too.
195
Changing a value in a list ― 1
Right to left
>>> data = ['alpha', 'beta', 'gamma']
list
3 str 5 a l p h a
str 4 b e t a
str 5 g a m m a
196
We can track what happens in that example in some detail. We will start
with the first line, defining the initial list.
As ever, Python assignment is done right to left. The right hand side is
evaluated as a list of three items, all of themstrings.
196
Changing a value in a list ― 2
Right to left
>>> data = ['alpha', 'beta', 'gamma']
list
3 str 5 a l p h a
data
str 4 b e t a
str 5 g a m m a
197
197
Changing a value in a list ― 3
Right to left
>>> data[2] = 'G'
list
3 str 5 a l p h a
data
str 4 b e t a
str 5 g a m m a
Now we come to the second line which changes one of these list items.
The right hand side is evaluated as a string containing a single characters.
That object gets created.
198
Changing a value in a list ― 4
Right to left
>>> data[2] = 'G'
list
3 str 5 a l p h a
data
str 4 b e t a
str 5 g a m m a
No longer
str 1 G referenced
199
199
Changing a value in a list ― 5
Right to left
>>> data[2] = 'G'
list
3 str 5 a l p h a
data
str 4 b e t a
str 1 G
200
Python then clears out the memory used for that old string so that it can
reuse it for something else. This process is called “garbage collection” in
computing.
200
Removing an entry from a list ― 1
>>> del data[1]
list
3 str 5 a l p h a data[0]
data
✗ str 4 b e t a data[1]
str 5 g a m m a data[2]
201
We can remove entries from the list too with the “del” keyword, just as we
removed names. The del keyword removes the reference from the list.
201
Removing an entry from a list ― 2
>>> del data[1]
list
2 str 5 a l p h a data[0]
data
No longer
str 4 b e t a
referenced
str 5 g a m m a data[1]
202
202
Removing an entry from a list ― 3
>>> del data[1]
list
2 str 5 a l p h a data[0]
data
str 5 g a m m a data[1]
203
203
Running off the end
list
8 int 2
int 3
primes
…
int 17
int 19
204
primes[8]
204
Running off the end
>>> len(primes)
8
>>> primes[7]
19
>>> primes[8]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
205
Type of error Description of error
205
Running off the end
>>> primes[8] = 23
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
206
Note that we can’t use indicies beyond the limit to extend a list either.
206
Progress
index primes[4]
Length len(primes)
Over-running primes[8]
207
207
Exercise 11
>>> numbers[1] = 3
>>> numbers[3] = 37
Do this yb hand. The script exercise11.py will tell you if you were right.
208
How can we add to a list?
list Same list list
8 New length 9
int 2 int 2
… ? …
int 17 int 17
int 19 int 19
209
Appending to a list
>>> primes
[2, 3, 5, 7, 11, 13, 17, 19]
This is the Python syntax for appending an item to the end of a list. You
won’t recognise the syntax; it is something new.
210
primes.append() ?
The list
A connecting dot
211
211
“Methods”
Behaves just
like a function
These built in functions are called “methods” or, more precisely, “methods of
the object” are used all over Python and are a general concept across an
entire type of programming called “object oriented programming”.
212
Using the append() method
>>> print(primes)
[2, 3, 5, 7, 11, 13, 17, 19]
>>> primes.append(23)
The function doesn’t
return any value.
>>> primes.append(29)
>>> primes.append(31)
It modifies
>>> primes.append(37)
the list itself.
>>> print(primes)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37] 213
We can use the append() method repeatedly to extend the list as far as we
want.
213
Other methods on lists: reverse()
>>> numbers.reverse()
The function doesn’t
return any value.
>>> print(numbers)
It modifies
[1, 5, 7, 4]
the list itself.
214
214
Other methods on lists: sort()
>>> numbers.sort()
The function does not
return the sorted list.
>>> print(numbers)
It sorts the
[1, 4, 5, 7]
list itself.
Numerical order.
215
Similarly, the sort() method doesn’t return a sorted list but silently sorts
the list internally.
215