实例介绍
【实例简介】近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
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论