Elements of Python3 Programming For Mechanical Engineers

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

Elements of Python3 Programming

for Mechanical Engineers.


Mechanical Engineering Report 2015/06
P. A. Jacobs
School of Mechanical and Mining Engineering
The University of Queensland.
July 20, 2015

Abstract
This document introduces Python as a procedural programming language so that
it can be used to implement engineering analysis programs or to write problem-
description files for large simulation programs that happen to use Python as a
scripting language. The notes are a summary of (and are complementary to) the
material presented in the first few lectures of the course MECH2700 Engineering
Analysis I. The intention is to describe just enough of the Python3 programming
language to implement the numerical methods that are introduced and used in the
later parts of the course.

1
CONTENTS 2

Contents
1 Introduction 3

2 The Python interpreter 5

3 An example program 7
3.1 Building a refined program . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

4 Python language elements 16


4.1 Lexical structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.2 Lines and indentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.3 Tokens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.4 Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

5 Data types 21
5.1 Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.2 Sequences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.3 Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
5.4 Boolean values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
5.5 Other built-in types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

6 Variables, assignments, name spaces 26

7 Expressions and operators 28


7.1 Numeric operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
7.2 Sequence operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
7.3 Other collection operations . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
7.4 Conditional expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

8 The print function and string formatting 33


8.1 String formatting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
8.2 String formatting with the % operator . . . . . . . . . . . . . . . . . . . . . 34

9 Flow-control statements 35
9.1 Selection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
9.2 Repetition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
9.3 Exceptions, assert statements . . . . . . . . . . . . . . . . . . . . . . . . . 40

10 Functions 41

11 Modules 44
11.1 The main module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

12 Scope and name resolution 46


1 INTRODUCTION 3

1 Introduction
Where to begin...
Steps in the problem-solving method, according to Feldman & Koffman [1].

1. Gain an understanding of the specification.

2. Conduct a thorough analysis.

3. Develop a design that includes an algorithm.

4. Develop a test plan.

5. Implement the design.

6. Test the implementation.

Notes:

ˆ Note that we don’t start with writing code.

ˆ Items 1 through 3 may be intermixed.

ˆ The whole process will be iterative. We probably won’t achieve the desired result,
even at iteration N.

ˆ Programming is an exercise in design. Usually we will implement the design and


see if it works. This is at the core of engineering.

Algorithm
ˆ An algorithm is a set of instructions, or procedural steps, for the solution of a
particular problem.

ˆ The building blocks of an algorithm are

– sequence (of transformations)


– selections
– iteration (or repetition)

We can nest these blocks to build arbitrarily-large algorithms.

ˆ Title of N. Wirth’s classic book: “Algorithms + Data Structures = Programs” [2]


1 INTRODUCTION 4

Solutions
ˆ Approaches to the task of devising a solution:

1. Top-down approach:
– Start from the problem specification and work, step by step, toward a
solution.
– At each step, subdivide the problem into smaller chunks.
– This approach is sometimes called stepwise refinement.
2. Bottom-up approach:
– Build small components, or tools, with limited functionality.
– Build bigger components from the smaller components until we have a tool
that will do the desired job.

ˆ Classical texts emphasised the top-down approach. It provides a structure to your


implementation, however, practical programming seems to be a mix of the two
approaches.

ˆ Interactive development environments (IDEs) make the bottom-up approach much


more convenient.

ˆ As your experience increases and your collection of programming tools grows, the
bottom-up approach gets easier and becomes more natural.
2 THE PYTHON INTERPRETER 5

2 The Python interpreter


To start the Python interpreter in Linux, type its name at the command prompt and
press Enter.
$ python3
In Windows, select the Python shell from the Start menu. For either case, you should see
the Python interpreter start and then wait for input.
$ python3
Python 3.4.3 (default, Mar 26 2015, 22:03:40)
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
The triple greater-than prompt indicates that the interpreter is ready for you to type some
expression or statement to evaluate. When you do type something in, the interpreter
evaluates it and prints the result. This is called the read-evaluate-print-loop (REPL).
$ python3
Python 3.4.3 (default, Mar 26 2015, 22:03:40)
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 2 * 3
6
>>>
The last result is available via the special name _ (It’s a single underscore character.)
$ python3
Python 3.4.3 (default, Mar 26 2015, 22:03:40)
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 2 * 3
6
>>> _ + 2
8
>>>
Most interesting functions and capabilities are packaged as modules that need to be
imported. Here, we start by importing all of the attributes of the math module into the
current name space so that we can use names sin and pi.
>>> from math import *
>>> sin(pi/4)
0.7071067811865475
>>>
We can use the interpreter itself to get help. Use the dir function to get a list of names
in the current name space.
2 THE PYTHON INTERPRETER 6

>>> dir()
[’__builtins__’, ’__doc__’, ’__loader__’, ’__name__’, ’__package__’,
’__spec__’, ’acos’, ’acosh’, ’asin’, ’asinh’, ’atan’, ’atan2’, ’atanh’,
’ceil’, ’copysign’, ’cos’, ’cosh’, ’degrees’, ’e’, ’erf’, ’erfc’,
’exp’, ’expm1’, ’fabs’, ’factorial’, ’floor’, ’fmod’, ’frexp’, ’fsum’,
’gamma’, ’hypot’, ’isfinite’, ’isinf’, ’isnan’, ’ldexp’, ’lgamma’,
’log’, ’log10’, ’log1p’, ’log2’, ’modf’, ’pi’, ’pow’, ’radians’, ’sin’,
’sinh’, ’sqrt’, ’tan’, ’tanh’, ’trunc’]
>>>

Most modules and functions are documented using special text within the code. For
example, help(sin) will get us a display of the documentation string for the sin function.

Help on built-in function sin in module math:

sin(...)
sin(x)

Return the sine of x (measured in radians).

You may need to press q to quit from the text viewer on Linux. Now, to get the sine of
30 degrees, try

>>> sin(radians(30))
0.49999999999999994
>>>

Finally, to get out of the Python REPL, press Control-D in Linux and Control-Z in
Windows. For most of this course, we will use the interpreter from within the IDLE3
integrated development environment.
3 AN EXAMPLE PROGRAM 7

3 An example program
This example has come from Gruenburger & Jaffray’s book [3], Problem F14, The calcu-
lation of π.

1. Goal: Compute an approximation to π (3.1415...)

2. Analysis:

ˆ Machin (1706) devised the formula

π 1 1
   
= 4 tan−1 − tan−1
4 5 239

ˆ We need to evaluate the arctangents and can do this by evaluating a truncated


series
x3 x5 x7
arctan x = x − + − + ...
3 5 7
where x is in radians.
ˆ Let’s truncate at 3 terms and substitute into Machin’s formula
"  3  5 # " 3 5 #
1 1 1 1 1 1 1 1 1 1
 
π ≈ 16 − + − 4 − +
5 3 5 5 5 239 3 239 5 239

3. Algorithm

ˆ Set up a sequence of calculations, one for each term in the sum.


ˆ Combine the individual terms to get the final result and print it.
ˆ We’ll skip the flow chart for this one... code coming up next.

4. Write the source code

a1 = 1.0 / 5
a2 = pow(a1,3) / 3
a3 = pow(a1,5) / 5
b1 = 1.0 / 239
b2 = pow(b1,3) / 3
b3 = pow(b1,5) / 5
pi_1 = 16 * (a1 - a2 + a3) - 4 * (b1 - b2 + b3)
print("Truncated series estimate is ", pi_1)

5. Running the program

Truncated series estimate is 3.1416210293250346


3 AN EXAMPLE PROGRAM 8

3.1 Building a refined program


We should check our results...
so, let’s make use of the functions in math module to do that check.
Language features on display: comment, strings, doc strings, literal values, names, ex-
pressions, statements, import of modules, calling of functions.
This particular program is in Python3 but should run the same in a Python2 interpreter
because line 15 imports the print function and division operator from the __future__
module.

1 # file : machin1 . py
2 """
3 MECH2700 : Using Python as a calculator .
4

5 Compute and display an estimate of pi using Machin ’ s formula .


6 Use only three terms in the arctangent expansions .
7 Check against another estimate obtained via the math library .
8

9 P . A . Jacobs
10 School of Engineering , UQ .
11

12 2014 -07 -08 Python3 compatibility .


13 """
14

15 from __future__ import print_function , division


16 from math import *
17

18 print (" Begin program Machin1 ...")


19 a1 = 1.0 / 5
20 a2 = pow ( a1 ,3) / 3
21 a3 = pow ( a1 ,5) / 5
22 b1 = 1.0 / 239
23 b2 = pow ( b1 ,3) / 3
24 b3 = pow ( b1 ,5) / 5
25 pi_1 = 4 * (4 * ( a1 - a2 + a3 ) - ( b1 - b2 + b3 ))
26 print (" Truncated series estimate is " , pi_1 )
27 pi_2 = 4.0 * atan (1.0)
28 print (" Math library estimate is ", pi_2 )
29 print (" Difference is ", pi_1 - pi_2 )
30 print (" End of program Machin1 .")
3 AN EXAMPLE PROGRAM 9

Running the code in the integrated development environment IDLE3:

$ idle3 machin2.py

Once IDLE3 is displaying the code module in an edit window, press F5 to run the module
to get the program to start and you get something like the following appearing in the
interpreter window.

Python 3.4.3 (default, Mar 26 2015, 22:03:40)


[GCC 4.9.2] on linux
Type "copyright", "credits" or "license()" for more information.
>>> ============================== RESTART ==============================
>>>
Begin program Machin1...
Truncated series estimate is 3.1416210293250346
Math library estimate is 3.141592653589793
Difference is 2.837573524150372e-05
End of program Machin1.
>>>

Note that the simple ratio 355/113 gives us an estimate correct to 6 decimal places.
3 AN EXAMPLE PROGRAM 10

Using functions for procedural abstraction


We can reuse the code for our formulas by defining functions with meaningful names, and
then call up the code without having to think about all of the internal detail.
More language features on display: compound statements, loops, function definitions,
function arguments, return statements.

1 # file : machin2 . py
2 """
3 Sample Python program for MECH2700
4

5 Computes and displays an estimate of pi using Machin ’ s


6 and a series expansion for the arctangent function .
7 Check against another estimate obtained via the math library .
8

9 P . A . Jacobs , School of Engineering , UQ .


10 2014 -07 -08 Python3 compatibility .
11 """
12 import math
13

14 #---------------------------------------------------------------
15 def atan_series (x , n ):
16 " Computes atan ( x ) with truncated series expansion , n terms ."
17 xpower = x
18 my_sum = x
19 sign = 1
20 for i in range (1 , n ):
21 xpower = xpower * x * x
22 sign = -1 * sign
23 term = sign * xpower / (2 * i + 1)
24 my_sum = my_sum + term
25 return my_sum
26

27 def machin ( n ):
28 " Computes pi using Machin ’ s formula ."
29 return 4 * (4 * atan_series (0.2 , n ) - atan_series (1.0/239 , n ))
30

31 #---------------------------------------------------------------
32 print (" Begin program Machin2 ...")
33 text = input (" Enter a value for the number of terms : ")
34 i = int ( text )
35 pi_1 = machin ( i )
36 print (" Truncated series estimate is " , pi_1 , " for n =" , i )
37 pi_2 = 4.0 * math . atan (1.0)
38 print (" Math library estimate is " , pi_2 )
39 print (" Difference is " , pi_1 - pi_2 )
40 print (" End of program Machin2 .")
3 AN EXAMPLE PROGRAM 11

Running the code in the integrated development environment IDLE3:

$ idle3 machin2.py

Once IDLE3 is displaying the code module in an edit window, press F5 to run the module
to get the program to start. If you enter 3 for the number of terms, you get something
like the following appearing in the interpreter window.

Python 3.4.3 (default, Mar 26 2015, 22:03:40)


[GCC 4.9.2] on linux
Type "copyright", "credits" or "license()" for more information.
>>> ============================== RESTART ==============================
>>>
Begin program Machin2...
Enter a value for the number of terms: 3
Truncated series estimate is 3.1416210293250346 for n= 3
Math library estimate is 3.141592653589793
Difference is 2.837573524150372e-05
End of program Machin2.
>>>

As expected, the result becomes more accurate as the number of terms is increased.

>>> ============================== RESTART ==============================


>>>
Begin program Machin2...
Enter a value for the number of terms: 8
Truncated series estimate is 3.1415926535886025 for n= 8
Math library estimate is 3.141592653589793
Difference is -1.1906031716080179e-12
End of program Machin2.
>>>
3 AN EXAMPLE PROGRAM 12

Modularizing the code for reuse

1 # file : machin3 . py
2 """
3 Sample Python program for MECH2700 -- a modification of machin2 .
4

5 Computes and displays an estimate of pi using Machin ’ s


6 and a series expansion for the arctangent function .
7 Check against another estimate obtained via the math library .
8

9 P . A . Jacobs , School of Engineering , UQ .


10 2014 -07 -08 Python3 compatibility .
11 """
12 import math
13

14 #---------------------------------------------------------------
15 def atan_series (x , n ):
16 " Computes atan ( x ) with truncated series expansion , n terms ."
17 xpower = x
18 my_sum = x
19 sign = 1
20 for i in range (1 , n ):
21 xpower = xpower * x * x
22 sign = -1 * sign
23 term = sign * xpower / (2 * i + 1)
24 my_sum = my_sum + term
25 return my_sum
26

27 def machin ( n ):
28 " Computes pi using Machin ’ s formula ."
29 return 4 * (4 * atan_series (0.2 , n ) - atan_series (1.0/239 , n ))
30

31 #---------------------------------------------------------------
32 if __name__ == " __main__ ":
33 # These lines are only run if this file is the main script .
34 # Thus we may import the functions above into other modules
35 # without having these lines execute .
36 print (" Begin program Machin3 ...")
37 text = input (" Enter a value for the number of terms : ")
38 i = int ( text )
39 pi_1 = machin ( i )
40 print (" Truncated series estimate is " , pi_1 , " for n =" , i )
41 pi_2 = 4.0 * math . atan (1.0)
42 print (" Math library estimate is " , pi_2 )
43 print (" Difference is " , pi_1 - pi_2 )
44 print (" End of program Machin3 .")
3 AN EXAMPLE PROGRAM 13

Note the if __name__ == "__main__": phrase on line 32. This allows us to reuse the
function definitions in another program without the clutter of the messages being printed.
Try it.
3 AN EXAMPLE PROGRAM 14

Replacing floating-point objects with multiple-precision float objects


Machin’s formula was used by Edward Shanks in 1873 to calculate π by hand to 707
decimal places. That record was engraved on his tombstone as a tribute to his perseverance
[3]. Let’s do the same the easy way, with the arbitrary-precision math module mpmath [4].

1 # file : machin4 . py
2 """
3 Sample Python program for MECH2700 , multiple - precision arithmetic
4

5 Computes and displays an estimate of pi using Machin ’ s


6 and a series expansion for the arctangent function .
7 Check against another estimate obtained via the mpmath library .
8 Note minimal change to machin () and no change to atan_series ().
9

10 P . A . Jacobs , School of Mechanical and Mining Engineering , UQ .


11 29 - July -2010 mpmath version ; 2014 -07 -08 Python3 compatibility .
12 """
13 from mpmath import *
14

15 #---------------------------------------------------------------
16 def atan_series (x , n ):
17 " Computes atan ( x ) with truncated series expansion , n terms ."
18 xpower = x
19 my_sum = x
20 sign = 1
21 for i in range (1 , n ):
22 xpower = xpower * x * x
23 sign = -1 * sign
24 term = sign * xpower / (2 * i + 1)
25 my_sum = my_sum + term
26 return my_sum
27

28 def machin ( n ):
29 " Computes pi using Machin ’ s formula ."
30 return 4 * (4 * atan_series ( mpf ( ’0.2 ’) , n ) -
31 atan_series ( mpf (1)/239 , n ))
32

33 #---------------------------------------------------------------
34 if __name__ == " __main__ ":
35 # These lines are only run if this file is the main script .
36 # Thus we may import the functions above into other modules
37 # without having these lines execute .
38 print (" Begin program Machin4 ... using mpmath module ")
39 mp . dps = 750
40 text = input (" Enter a value for the number of terms : ")
41 i = int ( text )
42 pi_1 = machin ( i )
43 print (" Truncated series estimate is " , pi_1 , " for n =" , i )
44 pi_2 = mpf ( ’4.0 ’) * atan ( ’1.0 ’)
3 AN EXAMPLE PROGRAM 15

45 print (" Math library estimate is " , pi_2 )


46 print (" Difference is " , pi_1 - pi_2 )
47 print (" End of program Machin4 .")

Notes:

ˆ For the setting of literal arbitrary-precision floating-point (mpf) values on lines 30


and 31, we use a string for 0.2 and an integer for 1.

ˆ We reply upon the open parenthesis on physical line 30 to let the compiler know
that physical line 31 is a continuation of the same logical line.

ˆ How many terms are required to get at least 707 decimal places correct?
4 PYTHON LANGUAGE ELEMENTS 16

4 Python language elements


According to Lerman [5], the basic capabilities provided by a programming language allow
us to:

1. specify values of data;

2. record results;

3. perform calculations and assign results to variables;

4. test values and perform alternate courses of action;

5. repeat actions; and

6. terminate the algorithm.

The language should also provide:

1. a means of procedural abstraction (packaging sections of code as functional sub-


units);

2. a way to invoke procedural abstractions (calling those functional units);

3. a means of data abstraction (packaging collections of related data); and

4. a way to access and assign values to elements within a data abstraction.

Over the next few lectures, we will study the basic (procedural) elements of the Python
programming language. In particular, we will study:

ˆ what a Python program is;

ˆ what the instruction set is;

ˆ how to create and use:

– variables and data values;


– functions and modular code.

Much of the material on the following pages is adapted from Alex Martelli’s text Python
in a Nutshell [6] and the online Python documentation. For online Python information,
start at https://www.python.org and to go directly to the online documentation go to
https://docs.python.org
David Beazley’s Essential Reference [7] is a more recent text that you should read and keep
under your pillow. If you want to know all there is to know about Python programming,
Mark Lutz’ text Learning Python [8] is a comprehensive guide. The fifth edition weighs
in at more than 1500 pages.
4 PYTHON LANGUAGE ELEMENTS 17

4.1 Lexical structure


ˆ Basic set of rules for writing programs in a particular language. For example, these
rules tell us:

– what variable names can be;


– what makes a comment.

ˆ Each Python file is a sequence of characters which can be viewed as a sequence of


lines, tokens or statements.

4.2 Lines and indentation


ˆ A Python program is composed of a sequence of logical lines.

ˆ Each logical line is made up of one or more physical lines.

ˆ Each physical line may end with a comment.

ˆ A comment starts with a pound/sharp/hash sign # and continues to the end of the
line.

ˆ Comments are ignored by the interpreter. They are just for us.

ˆ The end of a physical line normally ends a statement unless the statement is con-
tinued by:

1. having \ at the end of the physical line;


2. having an open parenthesis ( bracket [ or brace { that has not been closed;
3. an open triple quote """ or ’’’.

Subsequent physical lines in the logical line are known as continuation lines.

ˆ The indentation of the first physical line in the logical line is used to indicate block
structure of the code.

ˆ A block is a contiguous sequence of logical lines, all indented by the same amount.
The block is ended by a logical line with less indentation.

ˆ All statements in a block must have the same indentation.

ˆ All clauses in a compound statement must have the same indentation.

ˆ Python style is to use 4 spaces per indentation level.

– Don’t mix tabs and spaces.


– Use a smart editor (such as IDLE) that knows the rules.

ˆ The first statement in a Python file must have no indentation.

ˆ Statements entered at the REPL prompt must have no indentation.


4 PYTHON LANGUAGE ELEMENTS 18

4.3 Tokens
ˆ Each line is divided into a number of tokens. These are the smallest items with
meaning.
ˆ Tokens are used as identifiers, keywords, operators, delimiters and literals.
ˆ White space may be used between tokens and, in some cases, may be required to
separate the tokens. For example, the line from our introductory program
def atan_series(x, n):
requires the space to separate def and atan_series. The space between the comma
and the n is optional.

Identifiers
are names used to identify variables, functions, classes, modules or other objects. Some
rules:
ˆ They start with a letter or underscore, followed by zero or more letters, underscores
or digits.
ˆ The case of letters is significant.
ˆ Punctuation characters are not allowed.
Some recommendations:
ˆ Start most names with a lowercase letter.
ˆ Leading and trailing underscores are meant to be special.
ˆ Use an uppercase letter to start a class name.

Keywords
are identifiers that Python reserves for special syntactic purposes. The interpreter recog-
nises these specially. They are:
False True None
and as assert break class continue
def del elif else except finally
for from global if import in
is lambda nonlocal not or pass
raise return try while with yield

Operators
are nonalphabetic characters and character combinations.
+ - * / % ** //
<< >> & | ^ ~
< <= > >= != ==
=
+= -= *= /= %= **= //=
>>= <<= &= |= ^=
4 PYTHON LANGUAGE ELEMENTS 19

Delimiters and characters with special meaning


( ) [ ] { }
, : . ;
’ " # \

Literals
are data values that appear directly in the program text. For example:

ˆ 42 # integer literal

ˆ ’hello’ # string literal

ˆ [42, ’hello’] # list constructed from literals and delimiters

Literals can be thought of as expressions that construct objects.

Expressions
are phrases of code that can be evaluated to produce a value.
We’ll revisit the details later in Section 7.
4 PYTHON LANGUAGE ELEMENTS 20

4.4 Statements
A simple statement is one that contains no other statements.

ˆ It lies entirely within one logical line.

ˆ You may put more than one simple statement on a logical line, so long as you
separate them by semicolons ;

ˆ One statement per line is the usual Pyhton style.

ˆ Example of an assignment statement: >>> weight = 2

Compound statements contain other statements and control their execution.

ˆ Each compound statement has one or more clauses, aligned at the same indentation.

ˆ Each clause starts with a keyword and ends with a colon followed by a body, which
is a sequence of one or more statements.

ˆ When the body contains multiple statements, it is known as a block.

– These statements should be placed on separate logical lines, after the header
line, and indented to the right from the header line.
– The block ends when the indentation returns to that of the clause header (or
further left).

# Example compound statement controlling assignment statements.


if weight > 300:
animal = ’elephant’
volume = ’big’
else:
animal = ’mouse’
volume = ’small’

ˆ The body can also be a simple statement following the colon, on the same line.
5 DATA TYPES 21

5 Data types
ˆ At the lowest level in the computer, all data are binary (bit patterns).

ˆ We layer meaning over the binary data by defining types and interpreting the various
bit patterns as particular values of those data types.

ˆ In Python, all data is represented as objects. Each object has a type which deter-
mines what operations you can perform on the data value.

ˆ The built-in function type(obj) returns a type object that represents the type of
obj.

ˆ Fundamental data types are built-in, however, the programmer may define other
types using the class definition facility. For MECH2700, we won’t be building our
own classes but we will be using many classes built by others.

5.1 Numbers
Integers
ˆ Integers are, by default, defined as base-10 values, using strings of digits. For
example, 1234.

ˆ We can write integer literals in other bases:


0x04d2 → 1234
0b0000010011010010 → 1234
0b1101 == 0xd → True

ˆ They work with the usual arithmetic operators:


1234 * 2 → 2468

ˆ They can be large:


2 ** 100 → 1267650600228229401496703205376.

Floating-point
ˆ Floating-point numbers have a decimal point in their literal representation.
For example: 3.14 and 2.

ˆ type(2.) → <class ’float’>


type(2) → <class ’int’>

ˆ Scientific notation: 2.0e3 → 2000.0


2.0e-3 → 0.002

ˆ Inspect sys.float_info to look at the parameters for the floating-point type.


5 DATA TYPES 22

Complex
ˆ Literals of complex type use a j or J to denote the imaginary part. They are stored
as pairs of float values.
1+2j → (1+2j)
(3.14+4.0J).imag → 4.0
ˆ To get the complex math functions, we need to import the cmath module.

>>> import math


>>> import cmath
>>> cmath.exp(1j*math.pi)
(-1+1.2246467991473532e-16j)

Others
ˆ from decimal import Decimal; Decimal(10.1) →
Decimal(’10.0999999999999996447286321199499070644378662109375’)

ˆ from fractions import Fraction; 2 * Fraction(101,10) →


Fraction(101, 5)

5.2 Sequences
ˆ A sequence is a container of ordered items.

ˆ A particular item can be accessed via an integer index.

Strings
ˆ A string is an immutable sequence of characters.

ˆ A string literal may be delimited by single-quote or double-quote characters and


sets of triple-quotes may be used to delimit multiple-line strings.

"hello1"
’hello2’
"""A string on
two lines."""

ˆ Quote characters can be inside a string delimited by the other quote character, but
remember to use the quote characters consistently.
"Peter’s little blue cart." → "Peter’s little blue cart."
"Peter’s little \"blue\" cart." → ’Peter\’s little "blue" cart.’
ˆ The backslash character can be used to escape from the usual interpretation of a
character.
5 DATA TYPES 23

>>> "\\"
’\\’
>>> print(_)
\
>>> "\n"
’\n’
>>> print(_)

>>>

ˆ Because strings are immutable, their content cannot change. Operations on a string
that result in a string will return a derived string.
For example:

>>> a = "help me"


>>> b = a.upper()
>>> print(b)
HELP ME
>>> print(a)
help me
>>>

Tuples
ˆ A tuple is an immutable, ordered collection of items.

ˆ The items may be of varying type.

ˆ To specify a tuple, use a sequence of expressions, separated by commas. There may


be an optional comma following the last item. You may also group the tuple items
with parentheses.

ˆ For example:
(100, 200, 300) → a tuple with 3 items
(3.14, (’a’, ’b’)) → a nested tuple
() → an empty tuple
tuple(’hello’) → (’h’, ’e’, ’l’, ’l’, ’o’)

Lists
ˆ A list is a mutable, ordered sequence of items.

ˆ You construct a literal list much like a tuple, but you enclose the items with brackets.

ˆ For example:
[100, 200, 300] → a list with 3 items
[3.14,] → a list with one item
list() → an empty list
5 DATA TYPES 24

list(range(5)) → [0, 1, 2, 3, 4]
list(range(5,10)) → [5, 6, 7, 8, 9]

Numpy arrays
ˆ In the numerical methods part of the course, we will make extensive use of the array
type from the numpy extension module. http://www.numpy.org

ˆ For example:
import numpy as np
np.array([1,2,3]) → array([1, 2, 3]) a numeric array of 3 integers
np.array([1,2.0,3]) → array([ 1., 2., 3.]) a numeric array of float values
np.array([[1,2,3],[4,5,6]]) → a two-dimensional array of integers
np.zeros((2,4)) → a 2 × 4 array of zero float values
np.eye(3) → the 3 × 3 identity matrix

5.3 Dictionaries
ˆ A dictionary is an unordered collection of items, where each particular items is
indexed by a key. In other programming languages, it may be called a map or hash
table.

ˆ A literal dictionary is specified by pairs of expressions, separated by commas and


enclosed in braces.

ˆ For example:
{’x’: 42, ’y’: 36} → a dictionary with 2 items
dict() → an empty dictionary

5.4 Boolean values


ˆ True

ˆ False

ˆ Every data value can be evaluated as a truth value. Any nonzero number or
nonempty collection evaluates as True.

ˆ bool(expr) returns True or False.

ˆ For example:
bool([5, 6, 7, 8, 9]) → True
bool([]) → False
bool(-1) → True

5.5 Other built-in types


ˆ None is the null object. It is used when you have to supply a reference to an object
but don’t have a particular object.
5 DATA TYPES 25

ˆ A set object is an unordered collection of unique hashable objects. We will most


likely come across these objects when working with dictionaries.

ˆ A range represents an immutable sequence of numbers. Ranges were used to con-


struct a couple of the lists previously, and will be often used in counted loops, to be
discussed in Section 9.

ˆ Iterators and generators are advanced types and won’t be discussed in detail in
MECH2700. We will, however, make use of iterators implicitly, when we use for
loops in Section 9.
6 VARIABLES, ASSIGNMENTS, NAME SPACES 26

6 Variables, assignments, name spaces


ˆ Simple assignment binds a name to an object.
>>> a = 5

ˆ Using a name within an expression causes the value bound to the name to be used
in the evaluation of the expression.
>>> 2 * a → 10

ˆ A model of the binding of the name to the object is shown below.

ˆ The dir() functions lists the names in a name space.

Python 3.4.0 (default, Jun 19 2015, 14:18:46)


[GCC 4.8.2] on linux
Type "copyright", "credits" or "license()" for more information.
>>> a = 5
>>> 2 * a
10
>>> dir()
[’__builtins__’, ’__doc__’, ’__loader__’, ’__name__’, ’__package__’,
’__spec__’, ’a’]
>>> print(a)
5
>>>

Name space Object (data) space


Global

a int 5

ˆ We can rebind the name to another object.

>>> a = ’hello’
>>> print(a)
hello
>>>

ˆ We can delete the name.


6 VARIABLES, ASSIGNMENTS, NAME SPACES 27

>>> del(a)
>>> dir()
[’__builtins__’, ’__doc__’, ’__loader__’, ’__name__’, ’__package__’,
’__spec__’]
>>> print(a)
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
print(a)
NameError: name ’a’ is not defined
>>>

ˆ Learn to read the Traceback details. They are usually very helpful by telling you
where something went wrong and what went wrong.

ˆ Multiple assignments can be made with one statement, by providing several names
separated by commas.

a = 1
b = 2
print("Before: a=", a, "b=", b)
b, a = a, b # swap values
print("After: a=", a, "b=", b)
7 EXPRESSIONS AND OPERATORS 28

7 Expressions and operators


ˆ An expression is a phrase of code that can be evaluated to produce a value.

ˆ The simplest expressions are literals and identifiers.

ˆ We can build more complex expressions by joining subexpressions with operators


and/or delimiters.

ˆ Look up Section 6.15 1 of the Python language reference for the table of operator
precedence in expressions but, in general, don’t rely upon remembering the details
because...

ˆ A good rule of thumb is to use the simpler set of rules:

1. ∗ and / come before + and −


2. Put parentheses around everything else.

7.1 Numeric operations


The usual arithmetic operators are available for numbers:
x+y sum of x and y
x-y difference of x and y
x*y product of x and y
x/y quotient of x and y
x // y floored quotient of x and y
x%y remainder of x/y
divmod(x, y) the pair (x // y, x % y)
-x negative of x
+x x unchanged
abs(x) magnitude os x
pow(x, y) x to the power y
x ** y x to the power y
c.conjugate() conjugate of the complex number c

ˆ Numbers are immutable.

ˆ Numeric operations on numbers always produce a new number object.

ˆ If we apply two operands of different type, Python coerces the operand of the smaller
type to the larger type.
int → float → complex
ˆ For example:

>>> type(2 * 3)
<class ’int’>
>>> type(2 * 3.0)
1
https://docs.python.org/3/reference/expressions.html?#operator-precedence
7 EXPRESSIONS AND OPERATORS 29

<class ’float’>
>>> type(2 * 1j)
<class ’complex’>
>>> type(2.0 * 1j)
<class ’complex’>
>>>

ˆ There are built-in functions for explicit conversions.

>>> int(3.14)
3
>>> float(1)
1.0
>>> float("1")
1.0
>>> complex(1)
(1+0j)

7.2 Sequence operations


ˆ len() returns the number of items in the container.

ˆ min() returns the minimum value of the items in the container.

ˆ max() returns the maximum value.

ˆ Use the + operator to concatenate sequences.

ˆ Use the ∗ operator for multiplication of a sequence by an integer.

ˆ Use the keyword in to test for membership.

ˆ For example:

Python 3.4.3 (default, Mar 26 2015, 22:03:40)


[GCC 4.9.2] on linux
Type "copyright", "credits" or "license()" for more information.
>>> s = [1, 2, 33, 4.0]
>>> s
[1, 2, 33, 4.0]
>>> len(s)
4
>>> min(s)
1
>>> max(s)
33
>>> s2 = [101, 102]
>>> s + s2
[1, 2, 33, 4.0, 101, 102]
7 EXPRESSIONS AND OPERATORS 30

>>> 2 * s
[1, 2, 33, 4.0, 1, 2, 33, 4.0]
>>> s
[1, 2, 33, 4.0]
>>> 33 in s
True
>>> 101 in s
False
>>>

ˆ Use integers to index items. The first item is index 0. You can use negative indices
to index from the right.

ˆ Think of the index labelling the divider before each item. So, the content of the list
s might be represented as:

ˆ The slice s[i:j] denotes a subsequence, from the item with index i up to, but
excluding, the item with index j.

>>> s[1]
2
>>> s[-1]
4.0
>>> s[len(s)-1]
4.0
>>> s[1:3]
[2, 33]
>>> s[:2]
[1, 2]
>>>

ˆ Indexing and slicing work on strings and tuples but we cannot rebind or delete
items.
ˆ Lists can be altered. Items in a list can be rebound to different objects or can be
removed from the list.

>>> s[1] = 42
>>> s
[1, 42, 33, 4.0]
>>> del s[2]
>>> s
[1, 42, 4.0]
>>>
7 EXPRESSIONS AND OPERATORS 31

List methods
With L being a list object, we have:
L.count(x) Returns the number of occurrences of x in L.
Returns the index of the first occurrence of x in L,
L.index(x)
or raises an exception is L has no such item.
L.clear() Remove all items from L.
L.append(x) Appends item x to the end of L.
L.extend(L2 ) Appends all of the items of list L2 to L.
L.insert(i, x) Inserts item x before index i in L.
L.remove(x) Removes the first occurrence of item x from L.
Returns the value of the item at index i and removes it from L;
if i is omitted, removes and returns the last item.
L.pop([i])
Note that the square brackets here indicate an optional parameter
and that they are not actually typed in.
L.reverse() reverses, in place, the items of L.
Sorts, in place, the items of L.
L.sort() There is also a built-in function sorted() that returns a new,
sorted list.

Numpy array operations and methods


ˆ Arithmetic and logical operations are typically element-by-element, unless you spec-
ify linear-algebra operations.
ˆ Multiplication by an integer is also and element-by-element operation.
ˆ For example:

>>> import numpy as np


>>> x1 = np.array([[1, 2],[3,4]])
>>> x2 = np.eye(2)
>>> x1
array([[1, 2],
[3, 4]])
>>> x2
array([[ 1., 0.],
[ 0., 1.]])
>>> x1 * x2
array([[ 1., 0.],
[ 0., 4.]])
>>> np.dot(x1, x2)
array([[ 1., 2.],
[ 3., 4.]])
>>> 2 * x1
array([[2, 4],
[6, 8]])
>>>
7 EXPRESSIONS AND OPERATORS 32

7.3 Other collection operations


Dictionary methods
With D being a dictionary (or map) object and k being a key object, we have:
Evaluates to True if an item with the key is in D,
k in D
else False.
D[k] = value Set item D[k] to the specified value.
del D[k] Remove item from D. Raises KeyError if k not in D.
D.items() Returns a view of all items (key, value) pairs in D.
D.keys() Returns a view of all keys in D.
D.values() Returns a view of all values in D.
Returns the requested item if k is in D, otherwise x.
D.get(k[, x])
If x is not specified and k is not in D, an exception is raised.
Returns the requested item if k is in D,
D.setdefault(k[, x])
otherwise sets D[k] equal to x and returns x.
D.copy() Returns a shallow copy of the dictionary.
D.clear() Removes all items from D.
D.update(D2 ) For each k in D, sets D[k] equal to D2 [k].
ˆ A key object can be a number, string or tuple.

ˆ Matching of keys is done with comparison, so it’s not a good generally idea to use
floating-point numbers as keys.

ˆ Views are set-like. We can iterate over a view to do some work on each item.

7.4 Conditional expression


ˆ It has the form:
x if condition else y

ˆ It evaluates to either x or y depending on the truth of condition.


8 THE PRINT FUNCTION AND STRING FORMATTING 33

8 The print function and string formatting


The simple way to write values to the output in text form:
print(*objects, sep=’ ’, end=’\n’, file=sys.stdout, flush=False)
ˆ print is a built-in function that can take zero or more arguments, separated by
commas.
ˆ Keyword arguments may be supplied as indicated above but if they are not explicitly
given, the defaults will be used.
ˆ All non-keyword arguments are converted to strings like str() does and written to
the stream, separated by sep character and followed by end character.
For example:
from math import pi
my_pi = 22.0/7
better_pi = 355.0/113
print("A rough estimate of pi is", my_pi, "(error", pi-my_pi, ")")
print("A better estimate is", better_pi, "(error", pi-better_pi, ").")
produces the output:
A rough estimate of pi is 3.142857142857143 (error -0.0012644892673496777 )
A better estimate is 3.1415929203539825 (error -2.667641894049666e-07 ).

8.1 String formatting


To exercise more control over the display of text, use str .format().
ˆ The string, str, can contain literal text and replacement fields delimited by braces.

ˆ Each replacement field contains either the numeric index of a positional argument,
or the name of a keyword argument. You can omit the positional indices if you used
the arguments in order.
ˆ There is a mini-language for the format specification. Look up the online documen-
tation for the Python Standard Library, Section 6.1.3 Format String Syntax.
ˆ The trailing letter g in the example below denotes general format for floating-point
values.
For example:
print("A rough estimate of pi is {value} (error {error})".format(
value=my_pi, error=pi-my_pi))
print("A better estimate is {0:.6g} (error {1:.3g})".format(
better_pi, pi-better_pi))
produces the output:
A rough estimate of pi is 3.142857142857143 (error -0.0012644892673496777)
A better estimate is 3.14159 (error -2.67e-07)
8 THE PRINT FUNCTION AND STRING FORMATTING 34

For the conversion specifiers, the presentation types available include:


s String format. This is the default type for strings and may be omitted.
b Binary format. Outputs the number in base 2.
c Character. Converts an integer to the corresponding unicode character.
d Decimal Integer. Outputs the number in base 10.
o Octal format. Outputs the number in base 8.
x, X Hexadecimal format. Outputs the number in base 16.
e, E Exponent notation a.k.a. scientific notation.
f, F Fixed-point.
g, G General notation. fixed-point or exponential depending on value.

8.2 String formatting with the % operator


A similar format-specification mini-language is used for the string interpolation operator.
This form of writing conversion specifiers has been carried over from the printf function
in the C-programming world. For example:
print("A rough estimate of pi is %g (error %g)" % (my_pi, pi-my_pi))
print("A better estimate is %.6g (error %.3g)" % (better_pi, pi-better_pi))

produces the output:


A rough estimate of pi is 3.14286 (error -0.00126449)
A better estimate is 3.14159 (error -2.67e-07)
9 FLOW-CONTROL STATEMENTS 35

9 Flow-control statements
Flow is the order in which the program’s code executes. To control this flow, we have the
statements:

ˆ conditional statements (for selection)

ˆ loops (for repetition)

ˆ function calls (for procedural abstraction)

ˆ exceptions

9.1 Selection
ˆ The if statement asks a question and selects one of the alternate flow paths.

ˆ Each clause in the compound statement begins with a keyword and ends with a
colon and is followed by one or more statements.

ˆ The else clause is optional.

if cond :
statement(s) for True
else :
statement(s) for False

ˆ Note that the whole structure is bounded, with only one entry and one exit path.

ˆ We can nest these blocks to arbitrary depth.


9 FLOW-CONTROL STATEMENTS 36

The if statement may be extended to select one of several flow paths with elif clauses.

if cond :
statement(s) for True
elif cond2 :
statement(s) for elif True
else :
statement(s) for elif False

For example:

x = 11
if x < 0:
print("x is negative.")
elif x % 2:
print("x is positive and odd")
else:
print("x is even or zero")

Notes:

ˆ Any expression can be used as the condition.

ˆ In the boolean context:

– Any nonzero number or nonempty collection evaluates as True.


– Zero in any numeric type, an empty collection, or None evaluates as False.
9 FLOW-CONTROL STATEMENTS 37

9.2 Repetition
while statement

while cond :
statement(s)

ˆ Sometimes it will be handy to interrupt a loop manually. Use the Control-C key
combination to interrupt execution of the interpreter.

break statement
ˆ It can appear in the body of a loop.

ˆ If it executes, the loop terminates, so it is usually used as part of an if statement.

ˆ For nested loops, break terminates the innermost loop.

For example:

x = 0; my_sum = 0
while True:
my_sum = my_sum + x
print("x=", x, "my_sum=",my_sum)
if x > 9: break
x += 1
9 FLOW-CONTROL STATEMENTS 38

continue statement
ˆ It can also appear in the body of a loop.

ˆ It is usually used as part of an if statement so that it is executed conditionally.

ˆ If it executes, the remaining part of the current iteration of the loop is skipped and
execution continues with a new loop iteration.

For example:

x = -9
while x < 9:
x += 1
if x == 0: continue
print("x=", x, "1/x=", 1/x)

pass statement
ˆ The body of a compound statement cannot be empty; it must consist of at least
one statement.

ˆ When you want to perform no action, you can use this pass statement as a place
holder.

For example:

x = -9
while x < 9:
if x == 0:
pass
else:
print("x=", x, "1/x=", 1/x)
x += 1
9 FLOW-CONTROL STATEMENTS 39

for statement
ˆ General form:
for target in iterable :
statement(s)

ˆ target is usually a identifier that names the control variable of the loop.

ˆ The for statement successively rebinds the control variable name to each item in
the iterator, in order, and the body of the loop executes once for each of these items.

ˆ Often we will use a sequence or a range for the iterator.

Examples:

for letter in ’hello’:


print(’letter=’, letter)

for x in [0, 1, 2, 3]:


print(’x=’, x)

for y in range(4):
print(’y=’, y)

for z in range(10, 0, -2):


print(’z=’, z)

D = {’x’:42, ’y’:’hello’}
for (key,val) in D.items():
print(’key=’, key, ’value=’, val)
9 FLOW-CONTROL STATEMENTS 40

9.3 Exceptions, assert statements


These are a means to change the flow of control when something unexpected occurs.

Exceptions
ˆ Sometimes we end up with a value which our code cannot reasonably handle. Raising
an exception is a one way to throw the responsibility elsewhere.

ˆ For MECH2700, we’ll just consider the simple format for signalling one of the built-
in exceptions:
raise RuntimeError(args)

ˆ If we give the exception some text as its argument, that text is available to be
printed if the exception is raised and caught.

ˆ We’ll let the Python interpreter handle any exceptions that we raise.

ˆ For example:

x = 0
if x == 0:
raise RuntimeError("Zero value for x")
else:
y = 1/x
print("x=", x, "y=", y)

Assert
ˆ The assert statement helps us to check the assumptions built into our code.

ˆ The general form is:


assert boolean-expression, optional-expression

ˆ If the boolean-expression evaluates as False, an AssertionError is raised.

ˆ If the optional-expression is present, it is used as the argument for the AssertionError.


This is convenient for providing an informative error message.

ˆ For example:

x = 0
assert x != 0, "Zero value for x"
y = 1/x
print("x=", x, "y=", y)
10 FUNCTIONS 41

10 Functions
ˆ A function is a group of statements that executes on request (the request being the
function call).
ˆ When called, a function may be passed arguments that specify data for part of its
computation.
ˆ A function always returns a value (which may be the special value None).

ˆ Functions are objects, and can be named. They can passed to and received from
other functions.

The def statement


ˆ The def statement is the usual way to define a function.

ˆ It is a single-clause compound statement of the form:


def function-name(parameters):
statement(s)
ˆ The function-name is an identifier that is bound to the function object when the
def statement is executed.
ˆ parameters is an optional list of identifiers, called formal parameters, that are used
to represent the values that are supplied as arguments when the function is called
(later).
ˆ These parameters are bound as local variables of the function.

ˆ The function body is a non-empty sequence of statements. These are executed later,
when the function is called. When the def statement is executed, they are compiled
into the function object.

The return statement


ˆ The function body can contain zero or more return statements.

ˆ The general form is:


return optional-expression
ˆ The value of optional-expression is returned, or None, if there is no expression to
evaluate.
ˆ The expression may be a tuple or a list, so that we can return several values.

ˆ If there is no return statement, a value of None is returned anyway, following the


execution of the final statement in the function body.
10 FUNCTIONS 42

Calling functions
ˆ A function call is an expression of the form:
function-name(arguments)

ˆ The function-name is a reference to a function object.

ˆ The parentheses () denote the function call operator.

ˆ The arguments are zero or more expressions, separated by commas, giving values
for the functions formal arguments.

ˆ When a function is called, the parameters are bound to these values, the function
body is executes and the value of the function call expression is whatever the function
returns.

ˆ If several values are returned as a tuple or a list, we may use multiple assignment
to catch them, assigning the values to several names.

Passing arguments by assignment


ˆ Arguments are passed by automatically assigning the objects to local names.

ˆ Assigning other objects to these names inside the function does not affect the caller.

– Parameter names in the function header become new, local names when the
function executes.
– There is no aliasing between the function parameter names and like names in
the caller because the function has its own (local) name space.

ˆ Changing a mutable object that has arrived as an argument may, however, impact
the caller.
ˆ For example, the code below:

def changer(x, y):


x = 2
y[0] = ’spam’
X = 1
L = [1, 2]
print("Before: X=", X, "L=", L)
changer(X, L)
print("After: X=", X, "L=", L)

Results in:

Before: X= 1 L= [1, 2]
After: X= 1 L= [’spam’, 2]
10 FUNCTIONS 43

Explain why using the name-space and object-space model that was introduced in
Section 6.

Keyword and default arguments


The arguments discussed in the previous subsection have been positional. Python also
offers the conveniences of default values and keyword arguments.
For example, running the following code:
def f(a, b=2, c=3):
print("a=", a, "b=", b, "c=", c)

print("call as f(1)")
f(1)

print("call as f(1,4,5)")
f(1,4,5)

print("call as f(a=1)")
f(a=1)

print("call as f(1,c=6)")
f(1,c=6)

gives the output:


call as f(1)
a= 1 b= 2 c= 3
call as f(1,4,5)
a= 1 b= 4 c= 5
call as f(a=1)
a= 1 b= 2 c= 3
call as f(1,c=6)
a= 1 b= 2 c= 6
>>>
11 MODULES 44

11 Modules
To help us organize our code:

ˆ Typical Python programs are made up of several source files.

ˆ Each source file corresponds to a module, which contains code and data.

ˆ Usually module aname resides in file aname.py

Now, for the rules:

ˆ A module is a Python object with named attributes that you can bind and reference.

ˆ We get access to these attributes by importing the module.


import aname
import aname as newname
import aname, bname

ˆ The module body is the sequence of statements in the module’s source file.

ˆ A module’s body executes immediately, the first time that the module is imported
in a given run of a program.

ˆ The import statement creates a new name space that contains all of the attributes
of the module object.

ˆ To access a attribute in this name space, use the name of the module as a prefix (in
the fully-qualified name).

import math
y = math.sin(1.0)

ˆ If the first statement in the module body is a string literal, the Python compiler
binds that string as the module’s documentation string attribute.

ˆ We can view this string using the help function.

ˆ The from statement lets us import specific attributes from a module into the current
name space.

from math import sin, cos


from math import *

We can specify several attributes separated by commas, or everything with the *.


Usually, it is good practice to avoid using *, so as to avoid polluting your name
space.
11 MODULES 45

11.1 The main module


ˆ Execution of a Python program normally starts with a top-level script which is also
known as the main module.

ˆ Its module name is the string "__main__".

ˆ We can conditionally execute code in a script by checking the global variable __name__.
For example:

if __name__ == "__main__":
print("code to be executed if the module is run")
print("as the main module.")
# blah...

ˆ This is often used as a place to put testing or demonstration code for a module.
12 SCOPE AND NAME RESOLUTION 46

12 Scope and name resolution


Python scope basics:

ˆ Functions define a local scope and modules define a global scope.

ˆ Each module is a global scope, that is, a name-space where variables created at the
top-level of the module exist.

ˆ Each call to a function is a new local scope, that is, a name-space where variables
created inside the function usually live.

ˆ Assigned names are local, unless delared global.

ˆ All other names are enclosing locals, globals or built-ins.

Name resolution:

ˆ The LEGB Rule: name references search local, then enclosing functions (if any),
then global and then built-in name-spaces.

Built-in (Python)
Names pre-assigned in the built-in names module.

Global (module scope)


Names assigned at the top-level of a module file,
or declared global in a function definition within the file.

Enclosing function calls


Names in the local scope of any and all enclosing
function definitions, from inner to outer.

Local (function scope)


Names assigned within a function definition
and not declared global in that function.

ˆ Name assignments create or rebind local names by default.

ˆ global declarations map assigned names to an enclosing module’s scope.


REFERENCES 47

References
[1] Michael B. Feldman and Elliot B. Koffman. Ada95: problem solving and program
design. Addison-Wesley, Reading, Massachusetts, 1996.

[2] Niklaus Wirth. Algorithms + data structures = programs. Prentice-Hall, Englewood


Cliffs, New Jersey, 1976.

[3] Fred Gruenberger and George Jaffray. Problems for computer solution. John Wiley &
Sons, New York, 1965.

[4] Fredrik Johansson et al. mpmath: a Python library for arbitrary-precision floating-
point arithmetic., December 2013. http://mpmath.org/.

[5] Steven R. Lerman. Problem solving and computation for scientists and engineers : an
introduction using C. Prentice-Hall, Englewood Cliffs, New Jersey, 1993.

[6] Alex Martelli. Python in a Nutshell. O’Reilly, Sebastopol, California, 2003.

[7] David M. Beazley. Python Essential Reference. Sams Publishing, Indianapolis, Indi-
anna, 2006.

[8] Mark Lutz. Learning Python. O’Reilly, Sebastopol, California, 2013.

You might also like