在好例子网,分享、交流、成长!
您当前所在位置:首页Python 开发实例Python语言基础 → 1000 Python Examples.pdf

1000 Python Examples.pdf

Python语言基础

下载此实例
  • 开发语言:Python
  • 实例大小:2.05M
  • 下载次数:58
  • 浏览次数:265
  • 发布时间:2020-11-25
  • 实例类别:Python语言基础
  • 发 布 人:liukjx
  • 文件格式:.pdf
  • 所需积分:2
 相关标签: python python 100 000 py

实例介绍

【实例简介】近1000页的pdf 入门级示例文档,供新手学习

【实例截图】

【核心代码】

Contents
First steps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
What is Python? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
What is needed to write a program? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
The source (code) of Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Python 2 vs. Python 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Installation on Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Installation on Apple Mac OSX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Installation on MS Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Editors, IDEs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Program types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Python on the command line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
First script - hello world . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Exercise: Hello world . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
What is programming? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
What are the programming languages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
A written human language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
A programming language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Words and punctuation matter! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Literals, Value Types in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Floating point limitation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Value Types in Numpy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Rectangular (numerical operations) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Multiply string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Add numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Add strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Exercise: Calculations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Solution: Calculations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Second steps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
CONTENTS
Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
A main function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
The main function - called . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Indentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Conditional main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Input - Output I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
print in Python 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
print in Python 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
print in Python 2 as if it was Python 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Exception: SyntaxError: Missing parentheses in call . . . . . . . . . . . . . . . . . . . . . . . . 17
Prompting for user input in Python 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Prompting for user input in Python 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Python2 input or raw_input? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Prompting both Python 2 and Python 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Add numbers entered by the user (oups) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Add numbers entered by the user (fixed) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
How can I check if a string can be converted to a number? . . . . . . . . . . . . . . . . . . . 21
Converting string to int . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Converting float to int . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Conditionals: if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Conditionals: if - else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Conditionals: if - else (other example) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Conditionals: else if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Conditionals: elif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Ternary operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Case or Switch in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Exercise: Rectangular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Exercise: Calculator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Exercise: Standard Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Solution: Area of rectangular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Solution: Calculator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Command line arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Command line arguments - len . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Command line arguments - exit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Exercise: Rectangular (argv) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Exercise: Calculator (argv) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Solution: Area of rectangular (argv) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Solution: Calculator eval . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Solution: Calculator (argv) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Compilation vs. Interpretation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Is Python compiled or interpreted? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Flake8 checking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
CONTENTS
Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Operators for Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Integer division and the future . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Pseudo Random Number . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Fixed random numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Rolling dice - randrange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Random choice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
built-in method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Exception: TypeError: ‘module’ object is not callable . . . . . . . . . . . . . . . . . . . . . . . 39
Fixing the previous code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Exception: AttributeError: module ‘random’ has no attribute . . . . . . . . . . . . . . . . . . 40
Exercise: Number guessing game - level 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Exercise: Fruit salad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Solution: Number guessing game - level 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Solution: Fruit salad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Boolean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
if statement again . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
True and False . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Boolean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
True and False values in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Comparision operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Do NOT Compare different types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Boolean operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Boolean truth tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Short circuit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Short circuit fixed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Incorrect use of conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Exercise: compare numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Exercise: compare strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Solution: compare numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Solution: compare strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Single quoted and double quoted strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Long lines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Triple quoted strings (multiline) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
String length (len) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
String repetition and concatenation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
A character in a string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
String slice (instead of substr) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Change a string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
CONTENTS
How to change a string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
String copy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
String functions and methods (len, upper, lower) . . . . . . . . . . . . . . . . . . . . . . . . . . 57
index in string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
index in string with range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
rindex in string with range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
find in string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Find all in the string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
in string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
index if in string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Encodings: ASCII, Windows-1255, Unicode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
raw strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
ord . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
ord in a file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
chr - number to character . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Exercise: one string in another string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Exercise: to ASCII CLI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Exercise: from ASCII CLI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Solution: one string in another string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Solution: compare strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Solution: to ASCII CLI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Solution: from ASCII CLI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Loops: for-in and while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
for-in loop on strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
for-in loop on list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
for-in loop on range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Iterable, iterator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
for in loop with early end using break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
for in loop skipping parts using continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
for in loop with break and continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
while loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Infinite while loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
While with complex expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
While with break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
While True . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Duplicate input call . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Eliminate duplicate input call . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
do while loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
while with many continue calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Break out from multi-level loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Exit vs return vs break and continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
CONTENTS
Exercise: Print all the locations in a string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Exercise: Number guessing game . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Exercise: MasterMind . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Exercise: Count unique characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Solution: Print all the locations in a string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Solution 1 for Number Guessing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Solution for Number Guessing (debug) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Solution for Number Guessing (move) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Solution for Number Guessing (multi-game) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Solution: MasterMind . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Solution: Count unique characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
MasterMind to debug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
PyCharm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
PyCharm Intro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
PyCharm Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
PyCharm Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
PyCharm - run code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
PyCharm Python console at the bottom left . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Refactoring example (with and without pycharm) . . . . . . . . . . . . . . . . . . . . . . . . . 85
Formatted printing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
format - sprintf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Examples using format - indexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Examples using format with names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Format columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Examples using format - alignment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Format - string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Format characters and types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Format floating point number . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
f-strings (formatted string literals) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
printf using old %-syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Format braces, bracket, and parentheses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Examples using format with attributes of objects . . . . . . . . . . . . . . . . . . . . . . . . . 91
raw f-strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Anything can be a lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Any layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
List slice with steps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Change a List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Change with steps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
List assignment and list copy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
CONTENTS
join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
join list of numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
split . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
for loop on lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
in list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Where is the element in the list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Index improved . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
[ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
[ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
[ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Remove element by index [ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Remove first element of list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Remove several elements of list by index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Use list as a queue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Queue using deque from collections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Fixed size queue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
List as a stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
stack with deque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Exercies: Queue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Exercise: Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Solution: Queue with list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Solution: Queue with deque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Solution: Reverse Polish calculator (stack) with lists . . . . . . . . . . . . . . . . . . . . . . . . 108
Solution: Reverse Polish calculator (stack) with deque . . . . . . . . . . . . . . . . . . . . . . 109
Debugging Queue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
sort numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
sort mixed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
key sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Sort tuples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
sort with sorted . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
sort vs. sorted . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
key sort with sorted . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Sorting characters of a string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Looping over index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Enumerate lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
List operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
List of lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
List assignment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
List documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
tuple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Exercise: color selector menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
CONTENTS
Exercise: count digits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
Exercise: Create list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Exercise: Count words . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Exercise: Check if number is prime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Exercise: DNA sequencing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Solution: menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Solution: count digits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Solution: Create list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Solution: Count words . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Solution: Check if number is prime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Solution: DNA sequencing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Solution: DNA sequencing with filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Solution: DNA sequencing with filter and lambda . . . . . . . . . . . . . . . . . . . . . . . . . 124
[ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
append vs. extend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
split and extend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Open and read file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Filename on the command line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Filehandle with and without . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Filehandle with return . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Read file remove newlines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Read all the lines into a list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Read all the characters into a string (slurp) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Not existing file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Open file exception handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Open many files - exception handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Writing to file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Append to file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Binary mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Does file exist? Is it a file? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Exercise: count numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Exercise: strip newlines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Exercise: color selector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Exercise: ROT13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Exercise: Combine lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Solution: count numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Solution: strip newlines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Solution: color selector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Solution: Combine lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Read text file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Open and read file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
CONTENTS
Direct access of a line in a file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Dictionary (hash) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
What is a dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
When to use dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Loop over keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Loop using items . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Not existing key . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Get key . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Does the key exist? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Does the value exist? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Delete key . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
List of dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Shared dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
immutable collection: tuple as dictionary key . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
immutable numbers: numbers as dictionary key . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Sort dictionary by value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Sort dictionary keys by value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Insertion Order is kept . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
Change order of keys in dictionary - OrderedDict . . . . . . . . . . . . . . . . . . . . . . . . . 151
Set order of keys in dictionary - OrderedDict . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Exercise: count characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Exercise: count words . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Exercise: count words from a file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Exercise: Apache log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Exercise: Combine lists again . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Exercise: counting DNA bases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Exercise: Count Amino Acids . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Exercise: List of dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Exercise: Dictinoary of dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Solution: count characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Solution: count characters with default dict . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Solution: count words . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Solution: count words in file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Solution: Apache log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Solution: Combine lists again . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Solution: counting DNA bases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Solution: Count Amino Acids . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Loop over dictionary keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
CONTENTS
Do not change dictionary in loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
Default Dict . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
set operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
set intersection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
set subset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
set symmetric difference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
set union . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
set relative complement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
set examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
defining an empty set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Adding an element to a set (add) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Merging one set into another set (update) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Functions (subroutines) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Defining simple function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Defining a function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Parameters can be named . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
Mixing positional and named parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
Default values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Several defaults, using names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Arbitrary number of arguments * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Fixed parmeters before the others . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Arbitrary key-value pairs in parameters ** . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Extra key-value pairs in parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Every parameter option . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Duplicate declaration of functions (multiple signatures) . . . . . . . . . . . . . . . . . . . . . 177
Recursive factorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Recursive Fibonacci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Non-recursive Fibonacci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Unbound recursion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Variable assignment and change - Immutable . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Variable assignment and change - Mutable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Parameter passing of functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Passing references . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Function documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Sum ARGV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Copy-paste code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Copy-paste code fixed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Copy-paste code further improvement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Palindrome . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
CONTENTS
Exercise: statistics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Exercise: recursive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Exercise: Tower of Hanoi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Exercise: Merge and Bubble sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Solution: statistics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Solution: recursive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Solution: Tower of Hanoi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
Solution: Merge and Bubble sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Before modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Create modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
path to load modules from - The module search path . . . . . . . . . . . . . . . . . . . . . . . 192
sys.path - the module search path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Flat project directory structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Absolute path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Relative path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Python modules are compiled . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
How “import” and “from” work? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Runtime loading of modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Conditional loading of modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Duplicate importing of functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Script or library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Script or library - import . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Script or library - from import . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
assert to verify values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
mycalc as a self testing module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
doctest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Scope of import . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Export import . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Export import with all . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
import module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Execute at import time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Import multiple times . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Exercise: Number guessing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
Exercies: Scripts and modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
Exercise: Module my_sum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
Exercise: Convert your script to module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Exercise: Add doctests to your own code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Solution: Module my_sum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Regular Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
What are Regular Expressions (aka. Regexes)? . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
CONTENTS
What are Regular Expressions good for? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Where can I use it ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
grep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Regexes first match . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Match numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Capture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Capture more . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Capture even more . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
findall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
findall with capture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
findall with capture more than one . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Any Character . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Match dot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Character classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Common characer classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Negated character class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Optional character . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Regex 0 or more quantifier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Quantifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Quantifiers limit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Quantifiers on character classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Greedy quantifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Minimal quantifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Anchors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Anchors on both end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
Match ISBN numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Matching a section . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Matching a section - minimal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Matching a section negated character class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
DOTALL S (single line) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
MULTILINE M . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Two regex with logical or . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Alternatives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Grouping and Alternatives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Internal variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
More internal variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Regex DNA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Regex IGNORECASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Regex VERBOSE X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Substitution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
findall capture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Fixing dates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
CONTENTS
Duplicate numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Remove spaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Replace string in assembly code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Full example of previous . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Split with regex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Exercises: Regexes part 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Exercise: Regexes part 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Exercise: Sort SNMP numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Exercise: parse hours log file and give report . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Exercise: Parse ini file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Exercise: Replace Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Exercise: Extract phone numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Solution: Sort SNMP numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Solution: parse hours log file and give report . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Solution: Processing INI file manually . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Solution: Processing config file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
Solution: Extract phone numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Regular Expressions Cheat sheet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Fix bad JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
Fix very bad JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
Raw string or escape . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Remove spaces regex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Regex Unicode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Anchors Other example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
Python standard modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Some Standard modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
sys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Writing to standard error (stderr) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
Current directory (getcwd, pwd, chdir) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
OS dir (mkdir, makedirs, remove, rmdir) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
python which OS are we running on (os, platform) . . . . . . . . . . . . . . . . . . . . . . . . 255
Get process ID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
OS path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Traverse directory tree - list directories recursively . . . . . . . . . . . . . . . . . . . . . . . . 256
os.path.join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Directory listing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
expanduser - handle tilde ∼ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Listing specific files using glob . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
External command with system . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
subprocess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
subprocess in the background . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Accessing the system environment variables from Python . . . . . . . . . . . . . . . . . . . . 260
CONTENTS
Set env and run command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
shutil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
sleep in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
timer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Current date and time datetime now . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Converting string to datetime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
datetime arithmeticis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Rounding datetime object to nearest second . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Signals and Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Sending Signal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Catching Signal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Catching Ctrl-C on Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Catching Ctrl-C on Unix confirm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Alarm signal and timeouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
deep copy list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
deep copy dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
Exercise: Catching Ctrl-C on Unix 2nd time . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Exercise: Signals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Ctrl-z . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
JSON - JavaScript Object Notation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
dumps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
loads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
load . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Round trip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Pretty print JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Sort keys in JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
Set order of keys in JSON - OrderedDict . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Exercise: Counter in JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
Exercise: Phone book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
Exercise: Processes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
Solution: Counter in JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
Solution: Phone book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Command line arguments with argparse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Modules to handle the command line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
argparse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Basic usage of argparse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
Positional argument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Many positional argument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
CONTENTS
Convert to integers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Convert to integer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
Named arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
Boolean Flags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Short names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Exercise: Command line parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Exercise: argparse positional and named . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Exception handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
Hierarchy of calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
Handling errors as return values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
Handling errors as exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
A simple exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Working on a list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
Catch ZeroDivisionError exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Module to open files and calculate something . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
File for exception handling example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Open files - exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
Handle divide by zero exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Handle files - exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Catch all the exceptions and show their type . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
List exception types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
How to raise an exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Stack trace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
Exercies: Exception int conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
Exercies: Raise Exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Solution: Exception int conversion (specific) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Solution: Exception int conversion (all other) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Solution: Raise Exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Classes - OOP - Object Oriented Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
Why Object Oriented Programming? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
Generic Object Oriented Programming terms . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
OOP in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
OOP in Python (numbers, strings, lists) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
OOP in Python (argparse) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
Create a class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
Import module containing class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
Import class from module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
Initialize a class - constructor, attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
Attributes are not special . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
Create Point class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
CONTENTS
Initialize a class - constructor, attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
Stringify class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Inheritance - another level . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Modes of method inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Modes of method inheritance - implicit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Modes of method inheritance - override . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Modes of method inheritance - extend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Modes of method inheritance - delegate - provide . . . . . . . . . . . . . . . . . . . . . . . . . 315
Composition - Line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
Some comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Class in function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Serialization of instances with pickle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Quick Class definition and usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
Exercise: Add move_rad to based on radians . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
Exercise: Improve previous examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
Exercise: Polygon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
Exercise: Number . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
Exercise: Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
Exercise: Bookexchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
Exercise: Represent turtle graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
Solution - Polygon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
PyPi - Python Package Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
What is PyPi? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Easy Install . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
pip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Upgrade pip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
PYTHONPATH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Virtualenv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Virtualenv for Python 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
SQLite Database Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Connecting to SQLite database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Create TABLE in SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
INSERT data into SQLite database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
SELECT data from SQLite database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
A counter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Install MySQL support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Create database user (manually) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
CONTENTS
Create database (manually) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Create table (manually) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
Connect to MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
Connect to MySQL and Handle exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
Select data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
Select more data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Select all data fetchall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Select some data fetchmany . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Select some data WHERE clause . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Select into dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Insert data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Update data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Delete data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Exercise MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
Exercise: MySQL Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
Solution: MySQL Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
PostgreSQL install . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
Python and Postgresql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
PostgreSQL connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
INSERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
INSERT (from command line) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
DELETE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
SQLAlchemy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
SQLAlchemy hierarchy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
SQLAlchemy engine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
SQLAlchemy autocommit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
SQLAlchemy engine CREATE TABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
SQLAlchemy engine INSERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
SQLAlchemy engine SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
SQLAlchemy engine SELECT all . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
SQLAlchemy engine SELECT fetchall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
SQLAlchemy engine SELECT aggregate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
SQLAlchemy engine SELECT IN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
SQLAlchemy engine SELECT IN with placeholders . . . . . . . . . . . . . . . . . . . . . . . . 347
SQLAlchemy engine connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
SQLAlchemy engine transaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
SQLAlchemy engine using context managers . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
Exercise: Create table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
SQLAlchemy Metada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
CONTENTS
SQLAlchemy types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
SQLAlchemy ORM - Object Relational Mapping . . . . . . . . . . . . . . . . . . . . . . . . . . 352
SQLAlchemy ORM create . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
SQLAlchemy ORM schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
SQLAlchemy ORM reflection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
SQLAlchemy ORM INSERT after automap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
SQLAlchemy ORM INSERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
SQLAlchemy ORM SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
SQLAlchemy ORM SELECT cross tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
SQLAlchemy ORM SELECT and INSERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
SQLAlchemy ORM UPDATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
SQLAlchemy ORM logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
Solution: Create table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
Exercise: Inspector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
SQLAlchemy CREATE and DROP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
SQLAlchemy Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
SQLAlchemy Meta SQLite CREATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
SQLAlchemy Meta Reflection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
SQLAlchemy Meta INSERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
SQLAlchemy Meta SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
NoSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Types of NoSQL databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
MongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
MongoDB CRUD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Install MongoDB support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Python MongoDB insert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
MongoDB CLI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Python MongoDB find . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Python MongoDB find refine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
Python MongoDB update . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
Python MongoDB remove (delete) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
Redis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
Redis CLI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
Redis list keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
Redis set get . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
Redis incr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
Redis incrby . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
Redis setex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
Web client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
urllib the web client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
CONTENTS
urllib2 the web client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
httpbin.org . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
requests get . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
Download image using requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
Download image as a stream using requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
Download zip file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
Extract zip file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
Interactive Requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
requests get JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
requests get JSON UserAgent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
requests get JSON UserAgent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
requests get header . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
requests change header . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
requests post . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
Tweet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
API config file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
bit.ly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
Exercise: Combine web server and client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
Python Web server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Hello world web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Dump web environment info . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Web echo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
Web form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382
Python Flask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
Python Flask intro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
Python Flask installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
Flask: Hello World . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
Flask hello world   test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
Flask generated page - time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384
Flask: Echo GET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
Flask: Echo POST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
Flask: templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
Flask: templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
Flask: templates with parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
Flask: runner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
Exercise: Flask calculator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
Static files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
Flask Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Flask: Counter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Color selector without session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
CONTENTS
Session management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
Flask custom 404 page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
Flask Error page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
Flask URL routing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
Flask Path params . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
Flask Path params (int) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Flask Path params add (int) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Flask Path params add (path) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
Jinja loop, conditional, include . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
Exercise: Flask persistent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Exercise: Flask persistent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Flask Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Flask login . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Flask JSON API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Flask and AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
Flask and AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
passlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
Flask Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
Flask Deploy app . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
Flask Simple Authentication   test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Flask REST API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
Flask REST API - Echo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
Flask REST API - parameters in path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
Flask REST API - parameter parsing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
Flask REST API - parameter parsing - required . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
Networking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
Secure shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
ssh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
ssh from Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
Parallel ssh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
telnet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
prompt for password . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
Python nmap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
ftp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
Interactive shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
The Python interactive shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
REPL - Read Evaluate Print Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
Using Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Getting help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
Exercise: Interactive shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
Testing Demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
CONTENTS
How do you test your code? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
What is testing? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
What is testing really? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
Testing demo - AUT - Application Under Test . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
Testing demo - use the module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
Testing demo: doctets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
Testing demo: Unittest success . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428
Testing demo: Unittest failure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428
Testing demo: pytest using classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
Testing demo: pytest without classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
Testing demo: pytest run doctests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
Testing demo: pytest run unittest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
Exercise: Testing demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
Solution: Testing demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
Types in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
mypy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
Types of variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
Types of function parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
Types used properly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
TODO: mypy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
Testing Intro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
The software testing equasion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
The software testing equasion (fixed) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
The pieces of your software? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
Manual testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
What to tests? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
Continuous Integration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
Functional programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
Functional programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
Iterators (Iterables) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
range with list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
range vs. list size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
for loop with transformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
map delaying function call . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
map on many values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
map with list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
double with lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
What is lambda in Python? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
lambda returning tuple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
CONTENTS
map returning tuples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
lambda with two parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
map for more than one iterable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
map on uneven lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
replace None (for Python 2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
map on uneven lists - fixed (for Python 2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
map mixed iterators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
map fetch value from dict . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
Exercise: string to length . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Exercise: row to length . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Exercise: compare rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Solution: string to length . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Solution: row to length . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Solution: compare rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
filter with lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
filter - map example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
filter - map in one expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
Get indexes of values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459
reduce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
reduce with default . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
zip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
Creating dictionary from two lists using zip . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
all, any . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
Compare elements of list with scalar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
List comprehension - double . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
List comprehension - simple expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
List generator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
List comprehension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
Dict comprehension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
Lookup table with lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
Read lines without newlines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
Read key-value pairs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468
Create index-to-value mapping in a dictionary based on a list of values . . . . . . . . . . . 468
Exercise: min, max, factorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Exercise: Prime numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Exercise: Many validator functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Exercise: Calculator using lookup table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
Exercise: parse file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
Solution: min, max, factorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Solution: Prime numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
Solution: Many validator functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
Solution: Calculator using lookup table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
CONTENTS
map with condtion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
map with lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
map with lambda with condition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
List comprehension - complex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
Iterators - with and without Itertools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
Advantages of iterators and generators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
The Fibonacci research institute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
Fibonacci plain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
Fibonacci copy-paste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
Iterators Glossary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
What are iterators and iterables? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
A file-handle is an iterator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
range is iterable but it is not an iterator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
Iterator: a counter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
Using iterator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
Iterator without temporary variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
The type of the iterator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
Using iterator with next . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
Mixing for and next . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
Iterable which is not an iterator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
Iterator returning multiple values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484
Range-like iterator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484
Unbound or infinite iterator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
Unbound iterator Fibonacci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
Operations on Unbound iterator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
itertools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
itertools - count . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
itertools - cycle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
Exercise: iterators - reimplement the range function . . . . . . . . . . . . . . . . . . . . . . . 490
Exercise: iterators - cycle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
Exercise: iterators - alter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
Exercise: iterators - limit Fibonacci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
Exercise: iterators - Fibonacci less memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
Exercise: read char . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
Exercise: read section . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
Exercise: collect packets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492
Exercise: compare files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
Solution: iterators - limit Fibonacci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
Solution: iterators - Fibonacci less memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
Solution: read section . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
Solution: compare files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
Solution: collect packets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
CONTENTS
Generators and Generator Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
Generators Glossary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
Iterators vs Generators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
List comprehension and Generator Expression . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
List comprehension vs Generator Expression - less memory . . . . . . . . . . . . . . . . . . . 501
List comprehension vs Generator Expression - lazy evaluation . . . . . . . . . . . . . . . . . 503
Generator: function with yield - call next . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
Generators - call next . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505
Generator with yield . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505
Generators - fixed counter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
Generators - counter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
Generators - counter with parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507
Generators - my_range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508
Fibonacci - generator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
Infinite series . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
Integers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
Integers   3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
Integers   Integers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
Filtered Fibonacci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511
The series.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512
generator - unbound count (with yield) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513
iterator - cycle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513
Exercise: Alternator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
Exercise: Prime number generator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
Exercise: generator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
Exercise: Tower of Hanoi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
Exercise: Binary file reader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
Exercise: File reader with records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Simple logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Simple logging - set level . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Simple logging to a file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
Simple logging format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
Simple logging change date format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
getLogger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
Time-based logrotation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
Size-based logrotation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
Closures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
Counter local - not working . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
Counter with global . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
Create incrementors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
CONTENTS
Create internal function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
Create function by a function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524
Create function with parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524
Counter closure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
Make incrementor with def (closure) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526
Make incrementor with lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526
Exercise: closure bank . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
Solution: closure bank . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
Solution: counter with parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
Decorators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
Function assignment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
Function inside other function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
Decorator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
Use cases for decorators in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
A recursive Fibonacci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
trace fibo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
tron decorator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
Decorate with direct call . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
Decorate with parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
Decorator accepting parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
Decorate function with any signature . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
Decorate function with any signature - implementation . . . . . . . . . . . . . . . . . . . . . 535
Exercise: Logger decorator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536
Exercise: memoize decorator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536
Solution: Logger decorator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536
Solution: Logger decorator (testing) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537
Solution memoize decorator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538
Context managers (with statement) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540
Why use context managers? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540
Context Manager examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
cd in a function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
open in function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543
open in for loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544
open in function using with . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544
Plain context manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
Param context manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
Context manager that returns a value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Use my tempdir - return . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
Use my tempdir - exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
cwd context manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
tempdir context manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549
CONTENTS
Context manager with class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
Context managers with class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
Context manager: with for file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552
With - context managers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553
Exercise: Context manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553
Exercise: Tempdir on Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554
Solution: Context manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554
Advanced lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
Change list while looping: endless list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
Change list while looping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
Copy list before iteration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
for with flag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
for else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
enumerate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558
do while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558
list slice is copy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559
Advanced Exception handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560
Exceptions else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560
Exceptions finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561
Exit and finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562
Catching exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562
Home made exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563
Home made exception with attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564
Home made exception hierarcy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565
Home made exception hierarcy - 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565
Home made exception hierarcy - 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566
Home made exception hierarcy - 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566
Exercise: spacefight with exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 568
Exercies: Raise My Exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
Solution: spacefight with exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
Solution: Raise My Exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572
Exception finally return . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
Warnings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
Warnings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
CSV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
Reading CSV the naive way . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
CSV with quotes and newlines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
Reading a CSV file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576
CSV dialects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576
CSV to dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577
CONTENTS
Exercise: CSV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
Solution: CSV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580
Spreadsheets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580
Python Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580
Create an Excel file from scratch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580
Worksheets in Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
Add expressions to Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
Format field . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
Number series and chart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
Read Excel file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Update Excel file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Exercise: Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584
XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
XML Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
Expat - Callbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
XML DOM - Document Object Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586
XML SAX - Simple API for XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
SAX collect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
XML elementtree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589
SciPy - for Scientific Computing in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591
Data Science tools in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591
Data Analysis resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591
Python and Biology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
Biopython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
Biopython background . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
Bio python sequences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
Download data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594
Read FASTA, GenBank files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594
Search nucleotids . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595
Download nucleotids . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595
Exercise: Nucleotid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
Biology background . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Chemistry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598
Chemistry links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598
Bond length . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598
Covalent radius . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
Python energy landscape explorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
Other chemistry links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
CONTENTS
numpy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600
What is NumPy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600
Numpy - vector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600
NumPy 2D arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600
Numpy - set type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
NumPy arrays: ones and zeros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
Numpy: eye . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602
NumPy array random . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603
NumPy Random integers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603
NumPy array type change by division (int to float) . . . . . . . . . . . . . . . . . . . . . . . . 604
Numpy: Array methods: transpose . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604
Numpy: reference, not copy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
Numpy: copy array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606
Numpy: Elementwise Operations on Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606
Numpy: multiply, matmul, dot for vectors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Numpy: multiply, matmul, dot for vector and matrix . . . . . . . . . . . . . . . . . . . . . . . 607
Numpy: multiply, matmul, dot for matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608
Numpy: casting - converting from strings to integer. . . . . . . . . . . . . . . . . . . . . . . . 609
Numpy: indexing 1d array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610
Numpy: slice is a reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610
Numpy: slice - copy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611
Numpy: abs value on a Numpy array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611
Numpy: Logical not on a Numpy array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
Numpy: Vectorize a function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613
Numpy: Vectorize len . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614
Numpy: Vectorize lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614
Numpy: Filtering array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614
Numpy: Filter matrix values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
Numpy: Filter matrix rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616
Numpy: Stat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617
Numpy: Serialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617
Numpy: Load from Matlab file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618
Numpy: Save as Matlab file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618
Numpy: Horizontal stack vectors (hstack) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618
Numpy: Append or vertically stack vectors and matrices (vstack) . . . . . . . . . . . . . . . 619
Numpy uint8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
Numpy int8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620
Pandas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
Pandas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
Planets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
Pandas Planets - Dataframes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
Pandas Stocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
CONTENTS
Pandas Stocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623
Merge Dataframes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623
Analyze Alerts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
Analyze IFMetrics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
Create Excel file for experiment with random data . . . . . . . . . . . . . . . . . . . . . . . . 625
Calculate Genome metrics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626
Calculate Genome metrics - add columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
Calculate Genome metrics - vectorized . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628
Calculate Genome metrics - vectorized numpy . . . . . . . . . . . . . . . . . . . . . . . . . . . 628
Genes using Jupyter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
Combine columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
Pandas more . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630
Pandas Series . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631
Pandas Series with names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632
Matplotlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 634
About Matplotlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 634
Matplotlib Line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 634
Matplotlib Line with dates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
Matplotlib Simple Pie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636
Matplotlib Simple Pie with params . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637
Matplotlib Pie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638
Matplotlib Pie 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639
Plot, scatter, histogram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
Seaborn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641
Searborn use examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641
Seaborn tip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641
Seaborn Anscombes Quartet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642
Jupyter notebooks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
Jupyter on Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
Jupyter on Linux and OSX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
Jupyter add . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
Planets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
Jupyter notebook Planets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
Jupyter StackOverflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 646
Jupyter StackOverflow - selected columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
Jupyter processing chunks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
Jupyter StackOverflow - selected rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
Jupyter StackOverflow - biggest countries (in terms of number of responses) . . . . . . . . 648
Jupyter StackOverflow - historgram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649
Jupyter StackOverflow - filter by country . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649
Jupyter StackOverflow - OpenSourcer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649
CONTENTS
Jupyter StackOverflow - cross tabulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649
Jupyter StackOverflow - salaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 650
Jupyter StackOverflow - replace values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 650
Jupyter StackOverflow - selected rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 650
Jupyter notebook Intellisense (TAB completition) . . . . . . . . . . . . . . . . . . . . . . . . . 651
Jupyter examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 651
IPy Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 651
Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652
Traditional Organizations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652
Quality Assurance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652
Web age Organizations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652
TDD vs Testing as an Afterthought . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652
Why test? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653
Testing Modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653
Testing Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653
Testing What to test? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653
Testing in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 654
Testing Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 654
Testing Setup - Fixture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 654
Testing Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 654
Testing with unittest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655
Use a module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655
Test a module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655
The tested module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656
Testing - skeleton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656
Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
Test examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658
Testing with PyTest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659
Pytest features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659
Pytest setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659
Testing with Pytest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659
Testing functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 660
Testing class and methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 660
Pytest - execute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
Pytest - execute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
Pytest simple module to be tested . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
Pytest simple tests - success . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
Pytest simple tests - success output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662
Pytest simple tests - failure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662
Pytest simple tests - failure output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662
Exercise: test math functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
CONTENTS
Exercise: test this app . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
Exercise: test the csv module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 664
Solution: Pytest test math functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 664
Solution: Pytest test this app . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
Solution: test the csv module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
PyTest bank deposit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 666
PyTest expected exceptions (bank deposit) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 666
PyTest expected exceptions (bank deposit) - no exception happens . . . . . . . . . . . . . . . 667
PyTest expected exceptions (bank deposit) - different exception is raised . . . . . . . . . . . 668
PyTest expected exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668
PyTest expected exceptions output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668
PyTest expected exceptions (text changed) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669
PyTest expected exceptions (text changed) output . . . . . . . . . . . . . . . . . . . . . . . . . 669
PyTest expected exceptions (other exception) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669
PyTest expected exceptions (other exception) output . . . . . . . . . . . . . . . . . . . . . . . 670
PyTest expected exceptions (no exception) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670
PyTest expected exceptions (no exception) output . . . . . . . . . . . . . . . . . . . . . . . . . 671
PyTest: Multiple Failures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671
PyTest: Multiple Failures output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672
PyTest Selective running of test functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672
PyTest: stop on first failure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672
Pytest: expect a test to fail (xfail or TODO tests) . . . . . . . . . . . . . . . . . . . . . . . . . . 672
Pytest: expect a test to fail (xfail or TODO tests) . . . . . . . . . . . . . . . . . . . . . . . . . . 673
PyTest: show xfailed tests with -rx . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
Pytest: skipping tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674
Pytest: show skipped tests woth -rs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
Pytest: show extra test summmary info with -r . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
Pytest: skipping tests output in verbose mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
Pytest verbose mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676
Pytest quiet mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676
PyTest print STDOUT and STDERR using -s . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677
PyTest failure reports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677
PyTest compare numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677
PyTest compare numbers relatively . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677
PyTest compare strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678
PyTest compare long strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678
PyTest is one string in another strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679
PyTest test any expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
PyTest element in list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
PyTest compare lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
PyTest compare short lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681
PyTest compare short lists - verbose output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681
PyTest compare dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682
CONTENTS
PyTest compare dictionaries output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682
PyTest Fixtures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683
PyTest Fixture setup and teardown . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683
PyTest Fixture setup and teardown output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684
PyTest: Class setup and teardown . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685
PyTest: Class setup and teardown output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686
Pytest Dependency injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686
Pytest fixture - tmpdir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
Pytest capture STDOUT and STDERR with capsys . . . . . . . . . . . . . . . . . . . . . . . . 687
Pytest Fixture - home made fixtures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688
More fixtures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Pytest: Mocking - why? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
Pytest: Mocking - what? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
Pytest: One dimensional spacefight . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
Pytest: Mocking input and output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693
Pytest: Mocking random . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693
Pytest: Flask echo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694
Pytest: testing Flask echo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
PyTest: Run tests in parallel with xdist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696
PyTest: Order of tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696
PyTest: Randomize Order of tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696
PyTest: Force default order . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696
PyTest: no random order . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697
Anagram on the command line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697
PyTest testing CLI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697
PyTest test discovery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698
PyTest test discovery - ignore some tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699
PyTest select tests by name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 700
PyTest select tests by marker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 701
PyTest: Test Coverage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 702
Exercise: module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 702
Exercise: Open Source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703
Pytest resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703
Pytest and tempdir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703
PyTest compare short lists - output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704
PyTest with parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705
PyTest with parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706
Pytest reporting in JUnit XML format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706
No test selected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707
Advancted functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
Variable scopes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
Name resolution order (LEGB) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
CONTENTS
Scoping: global seen from fuction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
Assignment creates local scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
Local scope gone wrong . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709
Changing global variable from a function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710
Global variables mutable in functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710
Scoping issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710
sub in sub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
Scoping sub in sub (enclosing scope) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
Function objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712
Functions are created at run time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712
Mutable default . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713
Use None as default parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713
Inner function created every time the outer function runs . . . . . . . . . . . . . . . . . . . . 714
Static variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715
Static variable in generated function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715
Inspect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716
Variable number of function arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
Python function arguments - a reminder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
Functions with unknown number of argumerns . . . . . . . . . . . . . . . . . . . . . . . . . . 718
Variable length argument list with * and ** . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719
Passing arguments as they were received (but incorrectly) . . . . . . . . . . . . . . . . . . . . 719
Unpacking args before passing them on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 720
Exercise: implement the my_sum function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 720
Solution: implement the my_sum function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 721
Exercise: implement the reduce function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 721
Soluton: implement the reduce function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 721
Exercise: sort pairs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 722
Solution: sort pairs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 722
Python Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 724
Why Create package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 724
Create package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 724
Internal usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 724
use module in package - relative path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725
use package (does not work) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725
package importing (and exporting) module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 726
use package (module) with import . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 726
use package with import . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 726
Creating an installable Python package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 727
Create tar.gz file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 727
Install Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728
Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 729
CONTENTS
Add README file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 729
Add README file (setup.py) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 730
Include executables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 730
Add tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 731
Add tests calc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 732
Add tests all . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 732
setup.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
Run tests and create package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
Packaging applications (creating executable binaries) . . . . . . . . . . . . . . . . . . . . . . . 733
Using PyInstaller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734
Other PyInstaller examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734
Other . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734
Py2app for Mac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734
Exercise: package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735
Exercise: create executable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735
Ctypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 736
ctypes - hello . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 736
concat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 737
links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 738
Advanced OOP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739
Class count instances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739
Class Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739
Class Attributes in Instances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 740
Attributes with method access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741
Instance Attribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741
Methods are class attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 742
Monkey patching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 743
Classes: instance method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744
Class methods and class attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
Classes: constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746
Class methods - alternative constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 747
Abstract Base Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748
Abstract Base Class with abc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749
ABC working example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749
ABC - cannot instantiate the base-class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750
ABC - must implement methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750
Use Python @propery to fix bad interface (the bad interface) . . . . . . . . . . . . . . . . . . 751
Use Python @propery to fix bad interface (first attempt) . . . . . . . . . . . . . . . . . . . . . 751
Use Python @propery to fix bad API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 752
Use Python @propery decorator to fix bad API . . . . . . . . . . . . . . . . . . . . . . . . . . 753
Use Python @propery for value validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754
CONTENTS
class and static methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755
Destructor: del . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 757
Destructor delayed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758
Destructor delayed for both . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758
Opearator overloading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759
Operator overloading methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 760
Exercise: rectangular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 760
Exercise: SNMP numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 761
Exercise: Implement a Gene inheritance model combining DNA . . . . . . . . . . . . . . . . 761
Exercise: imaginary numbers - complex numbers . . . . . . . . . . . . . . . . . . . . . . . . . 761
Solution: Rectangular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 762
Solution: Implement a Gene inheritance model combining DNA . . . . . . . . . . . . . . . . 765
Instance counter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 766
2to3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767
Convertig from Python 2 to Python 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767
division . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767
print in Python 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767
print in Python 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767
input and raw_input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768
Code that works on both 2 and 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768
Compare different types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768
Octal numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769
2to3 Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769
Design Patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 770
What are Design Patterns? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 770
Don’t replace built-in objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 770
Facade - simple interface to complex system . . . . . . . . . . . . . . . . . . . . . . . . . . . . 770
Monkey Patching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 771
Creation DPs “Just One” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772
Singleton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772
Monostate (Borg) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773
Dispatch table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773
Parallel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 774
Types of Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 774
Types of solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 774
How many parallels to use? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 774
Dividing jobs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 774
Performance Monitoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775
Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 776
Python Threading docs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 776
CONTENTS
Threaded counters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 776
Simple threaded counters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 777
Simple threaded counters (parameterized) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 779
Pass parameters to threads - Counter with attributes . . . . . . . . . . . . . . . . . . . . . . . 780
Create a central counter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 782
Lock - acquire - release . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 782
Counter - plain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 783
GIL - Global Interpreter Lock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 784
Thread load . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 785
Exercise: thread files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 786
Exercise: thread URL requests. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 786
Exercise: thread queue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 789
Solution: thread queue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 790
Solution: thread URL requests. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 791
Forking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793
Fork . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793
Forking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793
Fork skeleton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 794
Fork with load . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 795
Fork load results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 796
Marshalling / Serialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 797
Fork with random . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798
Exercise: fork return data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798
Solution: fork return data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 799
Asyncronus programming with AsyncIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 801
Sync chores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 801
Async chores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 803
Explanation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 805
Coroutines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 806
More about asyncio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 806
Async files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 806
Asynchronus programming with Twisted . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 807
About Twisted . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 807
Echo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 807
Echo with log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 808
Simple web client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 809
Web client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 810
Multiprocess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 813
Multiprocess CPU count . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 813
Multiprocess Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 813
CONTENTS
Multiprocess N files: Pool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 813
Multiprocess load . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 814
Multiprocess: Pool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815
Multiprocess load async . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 816
Multiprocess and logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 817
Exercise: Process N files in parallel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 818
Exercise: Process N Excel files in parallel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 818
Exercise: Fetch URLs in parallel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 819
Exercise: Fetch URLs from one site. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 821
Solution: Fetch URLs in parallel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 822
Multitasking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 825
What is Multitasking? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 825
Multitasking example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 825
Multitasking example with wait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 826
Multitaksing - second loop waits for first one . . . . . . . . . . . . . . . . . . . . . . . . . . . . 827
Multitasking counter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828
Multitasking counter with thread locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 829
Improving Performance - Optimizing code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 830
Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 830
Optimization strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 830
Locate the source of the problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 830
Optimizing tactics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 830
DSU: Decorate Sort Undecorate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 831
Profile code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 831
Slow example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 831
profile slow code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 833
cProfile slow code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 833
Benchmarking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 834
Benchmarking subs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835
Levenshtein distance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835
Generate words . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 836
Levenshtein - pylev . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 836
Levenshtein - edittidtance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 837
Editdistance benchmark . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 837
A Tool to Generate text files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 837
Count characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 839
Memory leak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 840
Garbage collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 841
Weak reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 842
Exercise: benchmark list-comprehension, map, for . . . . . . . . . . . . . . . . . . . . . . . . . 843
Exercise: Benchmark Levenshtein . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843
CONTENTS
Exercise: sort files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843
Exercise: compare split words: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843
Exercise: count words . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 844
GUI with Python/Tk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 846
Sample Tk app . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 846
GUI Toolkits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 850
Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 850
Python Tk Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 851
Python Tk Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 851
Python Tk Button with action . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 852
Python Tk Label . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 852
Python Tk Label - font size and color . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853
Python Tk Keybinding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853
Python Tk Entry (one-line text entry) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 854
Python Tk Entry for passwords and other secrets (hidden text) . . . . . . . . . . . . . . . . . 855
Python Tk Checkbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855
Python Tk Radiobutton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 856
Python Tk Listbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857
Python Tk Listbox Multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857
Python Tk Menubar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 858
Python Tk Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 860
Python Tk Dialogs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 860
Python Tk Filedialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 860
Python Tk messagebox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 862
Python Tk Combobox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 863
Python Tk OptionMenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 864
Python Tk Scale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865
Python Tk Progressbar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 866
Python Tk Frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 866
Not so Simple Tk app with class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 868
Tk: Hello World . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 868
Tk: Quit button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869
Tk: File selector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 870
Tk: Checkbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 871
Tk: Runner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 872
Tk: Runner with threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 874
Getting started with Tk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 878
Exercise: Tk - Calculator one line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 879
Exercise: Tk Shopping list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 879
Exercise: Tk TODO list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 880
Exercise: Tk Notepad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 880
Exercise: Tk Copy files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 880
CONTENTS
Exercise: Tk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 880
Solution: Tk - Calculator one line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 880
Solution: Tk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 883
Solution: Tk Notepad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 884
Simple file dialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 886
Python Pitfalls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 887
Reuse of existing module name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 887
Use the same name more than once . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 887
Compare string and number . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 888
Compare different types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 889
Sort mixed data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 889
Linters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 891
Static Code Analyzis - Linters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 891
PEP8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 891
F811 - redefinition of unused . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 891
Warn when Redefining functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 891
Python .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 893
IronPython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 893
Use .NET libraries from Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 893
Python and .NET console . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 894
Python and .NET examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 894
Exercise Python and .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 896
Python and Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 897
Jython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 897
Calling Java from Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 897
Jython - Python running on the JVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 898
Jython Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 898
Jython Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 898
Jython load Java class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 898
Jython load Java class in code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 898
Jython test Java class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 899
PIL - Pillow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 900
Install Pillow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 900
Create First Image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 900
Write Text on Image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 900
Select font for Text on Image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 901
Font directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 901
Get size of an Image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 902
CONTENTS
Get size of text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 902
Resize an existing Image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 902
Crop an existing Image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 902
Combine two images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 903
Rotated text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 903
Rotated text in top-right corner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 904
Embed image (put one image on another one) . . . . . . . . . . . . . . . . . . . . . . . . . . . 904
Draw a triangle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 905
Draw a triangle and write text in it . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 905
Draw a triangle and write rotated text in it . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 906
Draw a rectangular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 907
Draw a rectangle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 907
Draw circle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 907
Draw heart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 907
Rectangle with rounded corners . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 908
TODO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 909
FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 910
How not to name example scirpts? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 910
Platform independent code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 910
How to profile a python code to find causes of slowness? . . . . . . . . . . . . . . . . . . . . 910
pdb = Python Debugger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 911
Avoid Redefining functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 911
Appendix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 912
print_function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 912
Dividers (no break or continue) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 912
Lambdas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 912
Abstract Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 913
Remove file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 914
Modules: more . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 914
import hooks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915
Python resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915
Progress bar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915
from future . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915
Variable scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 916
scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 917
type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 919
Look deeper in a list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 920
Exercise: iterators - count . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 920
Simple function (before generators) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 920
Other slides . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 922
Other slides . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 922
CONTENTS
Atom for Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 922
IDLE - Integrated DeveLopment Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . 923
sh-bang - executable on Linux/Apple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 923
Strings as Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 923
pydoc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 924
How can I check if a string can be converted to a number? . . . . . . . . . . . . . . . . . . . 924
Spyder Intro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 925
Interactive Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 925
Parameter passing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 926
Command line arguments and main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 926
Infinite loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 926
break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 926
continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 927
While with many conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 927
while loop with many conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 928
Format with conversion (stringifiation with str or repr) . . . . . . . . . . . . . . . . . . . . . 928
Name of the current function in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 929
Name of the caller function in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
Stack trace in Python using inspect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
Module Fibonacci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 932
PyTest - assertion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 932
PyTest - failure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933
PyTest - list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933
SAX with coroutine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 934
Getting the class name of an object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 936
Inheritance - super . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 937
Inheritance - super - other class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 938
iterator - pairwise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 939
iterator - grouped . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 939
itertools - groupby . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 940
Circular references . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 940
Context managers: with (file) experiments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 941
itertools - izip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 941
mixing iterators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 942
mixing iterators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 942
itertools - pairwise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 943
itertools - grouped . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 943
range vs xrange in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 944
profile (with hotshot) slow code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 944
Abstract Base Class without abc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 945
Abstract Base Class with abc Python 2 ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 946
Abstract Base Class with metaclass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 947
Create class with metaclass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 949
CONTENTS
Python Descriptors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 952
alter iterator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 952
Create a counter queue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 952
A Queue of tasks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 953
Filtered Fibonacci with ifilter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 954
Python from .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 954

标签: python python 100 000 py

实例下载地址

1000 Python Examples.pdf

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警