Author(s): Michael Driscoll
Edition: 2
Publisher: leanpub.com
Year: 2020
Language: English
Pages: 531
Tags: python, Python, python 101
Contents
About the Technical Reviewers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Ethan Furman . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Martin Breuss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Part I - The Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Part II - Intermediate Materials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Part III - Tutorials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Part IV - Python Packaging and Distribution . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Target Audience . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Book Source Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Reader Feedback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Errata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Part I - The Python Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Chapter 1 - Installing Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Installing on Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Installing on Mac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Installing on Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Android / iOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Other Operating Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Other Python Variants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Chapter 2 - Python Editors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
What About the REPL? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Getting Started with IDLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Getting Started with PyCharm Community Edition . . . . . . . . . . . . . . . . . . . . . . . . 36
Getting Started with Wing Personal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
CONTENTS
Getting Started with Visual Studio Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Chapter 3 - Documenting Your Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
What are Comments? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Commenting Out . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Multiline Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Learning About docstrings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Python’s Style Guide: PEP8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Tools that can help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Chapter 4 - Working with Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Creating Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
String Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
String Formatting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Formatting Strings Using %s (printf-style) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Formatting Strings Using .format() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Formatting Strings with f-strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
String Concatenation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
String Slicing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Chapter 5 - Numeric Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Integers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Floats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Complex Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Numeric Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Augmented Assignment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Chapter 6 - Learning About Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Creating Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
List Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
List Slicing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Copying a List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Chapter 7 - Learning About Tuples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Creating Tuples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
CONTENTS
Working With Tuples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Concatenating Tuples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Special Case Tuples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Chapter 8 - Learning About Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Creating Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Accessing Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Dictionary Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Modifying Your Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Deleting Items From Your Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Chapter 9 - Learning About Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Creating a Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Accessing Set Members . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Changing Items . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Adding Items . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Removing Items . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Clearing or Deleting a Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Set Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Chapter 10 - Boolean Operations and None . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
The bool() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
What About None? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Chapter 11 - Conditional Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Comparison Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Creating a Simple Conditional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Branching Conditional Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Nesting Conditionals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Logical Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Special Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Chapter 12 - Learning About Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Creating a for Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
CONTENTS
Looping Over a String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
Looping Over a Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
Extracting Multiple Values in a Tuple While Looping . . . . . . . . . . . . . . . . . . . . . . . 119
Using enumerate with Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Creating a while Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Breaking Out of a Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Using continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Loops and the else Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Nesting Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Chapter 13 - Python Comprehensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
List Comprehensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Nested List Comprehensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Dictionary Comprehensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Set Comprehensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Chapter 14 - Exception Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
The Most Common Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Handling Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Raising Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Examining the Exception Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Using the finally Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Using the else Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Chapter 15 - Working with Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
The open() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Reading Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Reading Binary Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Writing Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Seeking Within a File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Appending to Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Catching File Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Chapter 16 - Importing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Using import . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Using from to Import Specific Bits & Pieces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
CONTENTS
Using as to assign a new name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
Importing Everything . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Chapter 17 - Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Creating a Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Calling a Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Passing Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Type Hinting Your Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Passing Keyword Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Required and Default Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
What are *args and **kwargs? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Positional-only Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Chapter 18 - Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
Class Creation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Figuring Out self . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Public and Private Methods / Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Subclass Creation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
Polymorphism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Making the Class Nicer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Part II - Beyond the Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Chapter 19 - Introspection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Using the type() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Using the dir() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Getting help() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Other Built-in Introspection Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Chapter 20 - Installing Packages with pip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Installing a Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Exploring Command Line Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
Installing with requirements.txt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Upgrading a Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Checking What’s Installed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
CONTENTS
Uninstalling Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Alternatives to pip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Chapter 21 - Python Virtual Environments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Python’s venv Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
The virtualenv Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Other Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Chapter 22 - Type Checking in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
Pros and Cons of Type Hinting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
Built-in Type Hinting / Variable Annotation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Collection Type Hinting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Hinting Values That Could be None . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Type Hinting Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
What To Do When Things Get Complicated . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Decorators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Aliasing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Other Type Hints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
Type Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
Static Type Checking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Chapter 23 - Creating Multiple Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Pros of Using Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Cons of Using Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Creating Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Subclassing Thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Writing Multiple Files with Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Chapter 24 - Creating Multiple Processes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Pros of Using Processes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Cons of Using Processes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Creating Processes with multiprocessing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Subclassing Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Creating a Process Pool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
CONTENTS
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Chapter 25 - Launching Subprocesses with Python . . . . . . . . . . . . . . . . . . . . . . . . . 223
The subprocess.run() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
The subprocess.Popen() Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
The subprocess.Popen.communicate() Function . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Reading and Writing with stdin and stdout . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Chapter 26 - Debugging Your Code with pdb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Starting pdb in the REPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Starting pdb on the Command Line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Stepping Through Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Adding Breakpoints in pdb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Creating a Breakpoint with set_trace() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Using the built-in breakpoint() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Getting Help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Chapter 27 - Learning About Decorators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Creating a Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Creating a Decorator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Applying a Decorator with @ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Creating a Decorator for Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Stacking Decorators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Passing Arguments to Decorators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Using a Class as a Decorator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
Python’s Built-in Decorators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Python Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
Chapter 28 - Assignment Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Using Assignment Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
What You Cannot Do With Assignment Expressions . . . . . . . . . . . . . . . . . . . . . . . 257
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Chapter 29 - Profiling Your Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Learning How to Profile with cProfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Profiling a Python Script with cProfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Working with Profile Data Using pstats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
CONTENTS
Other Profilers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Chapter 30 - An Introduction to Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Using doctest in the Terminal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Using doctest in Your Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Using doctest From a Separate File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Using unittest For Test Driven Development . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Chapter 31 - Learning About the Jupyter Notebook . . . . . . . . . . . . . . . . . . . . . . . . . 284
Installing The Jupyter Notebook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
Creating a Notebook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Adding Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Adding an Extension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Exporting Notebooks to Other Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Part III - Practical Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Chapter 32 - How to Create a Command-line Application with argparse . . . . . . . . . . . 300
Parsing Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
Creating Helpful Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Adding Aliases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
Using Mutually Exclusive Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
Creating a Simple Search Utility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Chapter 33 - How to Parse XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Parsing XML with ElementTree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Creating XML with ElementTree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Editing XML with ElementTree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
Manipulating XML with lxml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Chapter 34 - How to Parse JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Encoding a JSON String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Saving JSON to Disk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Decoding a JSON String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
CONTENTS
Loading JSON from Disk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Validating JSON with json.tool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Chapter 35 - How to Scrape a Website . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
Rules for Web Scraping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
Preparing to Scrape a Website . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
Scraping a Website . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Downloading a File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Chapter 36 - How to Work with CSV files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Reading a CSV File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Reading a CSV File with DictReader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
Writing a CSV File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
Writing a CSV File with DictWriter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
Chapter 37 - How to Work with a Database Using sqlite3 . . . . . . . . . . . . . . . . . . . . 346
Creating a SQLite Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
Adding Data to Your Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
Searching Your Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Editing Data in Your Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
Deleting Data From Your Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Chapter 38 - Working with an Excel Document in Python . . . . . . . . . . . . . . . . . . . . 356
Python Excel Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
Getting Sheets from a Workbook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
Reading Cell Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
Iterating Over Rows and Columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
Writing Excel Spreadsheets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
Adding and Removing Sheets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Adding and Deleting Rows and Columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
Chapter 39 - How to Generate a PDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
Installing ReportLab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
Creating a Simple PDF with the Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
CONTENTS
Creating Drawings and Adding Images Using the Canvas . . . . . . . . . . . . . . . . . . . . 371
Creating Multi-page Documents with PLATYPUS . . . . . . . . . . . . . . . . . . . . . . . . . 375
Creating a Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382
Chapter 40 - How to Create Graphs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
Installing Matplotlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
Creating a Simple Line Chart with PyPlot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
Creating a Bar Chart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
Creating a Pie Chart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
Adding Labels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Adding Titles to Plots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
Creating a Legend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
Showing Multiple Figures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
Chapter 41 - How to Work with Images in Python . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Installing Pillow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Opening Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
Cropping Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
Using Filters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Adding Borders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
Resizing Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
Chapter 42 - How to Create a Graphical User Interface . . . . . . . . . . . . . . . . . . . . . . 425
Installing wxPython . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
Learning About Event Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
How to Create Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
How to Lay Out Your Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
How to Add Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
How to Create an Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
Part IV - Distributing Your Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
Chapter 43 - How to Create a Python Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
Creating a Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
Creating a Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
Packaging a Project for PyPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
CONTENTS
Creating Project Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Creating setup.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
Generating a Python Wheel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Uploading to PyPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
Chapter 44 - How to Create an Exe for Windows . . . . . . . . . . . . . . . . . . . . . . . . . . 457
Installing PyInstaller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
Creating an Executable for a Command-Line Application . . . . . . . . . . . . . . . . . . . . 458
Creating an Executable for a GUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
Chapter 45 - How to Create an Installer for Windows . . . . . . . . . . . . . . . . . . . . . . . 464
Installing Inno Setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
Creating an Installer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
Testing Your Installer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
Chapter 46 - How to Create an “exe” for Mac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
Installing PyInstaller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
Creating an Executable with PyInstaller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
Review Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
Afterword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484
Appendix A - Version Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
Version Control Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
Distributed vs Centralized Versioning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
Common Terminology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
Python IDE Version Control Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
Appendix B - Version Control with Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
Installing Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
Configuring Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
Creating a Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492
Ignoring Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
Initializing a Repository . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
Checking the Project Status . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
Adding Files to a Repository . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
CONTENTS
Committing Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
Viewing the Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
Changing a File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
Reverting a File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
Checking Out Previous Commits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
Pushing to Github . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
Wrapping Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
Review Question Answer Key . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
Chapter 3 - Documenting Your Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
Chapter 4 - Working with Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
Chapter 5 - Numeric Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503
Chapter 6 - Learning About Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
Chapter 7 - Learning About Tuples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505
Chapter 8 - Learning About Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
Chapter 9 - Learning About Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507
Chapter 10 - Boolean Operations and None . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508
Chapter 11 - Conditional Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
Chapter 12 - Learning About Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
Chapter 13 - Python Comprehensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511
Chapter 14 - Exception Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512
Chapter 15 - Working with Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512
Chapter 16 - Importing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513
Chapter 17 - Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
Chapter 18 - Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
Chapter 19 - Introspection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
Chapter 20 - Installing Packages with pip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
Chapter 21 - Python Virtual Environments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Chapter 22 - Type Checking in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
Chapter 23 - Creating Multiple Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
Chapter 24 - Creating Multiple Processes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
Chapter 25 - Launching Subprocesses with Python . . . . . . . . . . . . . . . . . . . . . . . . 519
Chapter 26 - Debugging Your Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
Chapter 27 - Learning About Decorators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
Chapter 28 - Assignment Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
Chapter 29 - Profiling Your Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
Chapter 30 - An Introduction to Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
Chapter 31 - Learning About the Jupyter Notebook . . . . . . . . . . . . . . . . . . . . . . . . 523
Chapter 32 - How to Create a Command Line Application with argparse . . . . . . . . . . 523
Chapter 33 - How to Parse XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524
Chapter 34 - How to Parse JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524
Chapter 35 - How to Scrape a Website . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
Chapter 36 - How to Work with CSV files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
CONTENTS
Chapter 37 - How to Work with a Database Using sqlite . . . . . . . . . . . . . . . . . . . . 526
Chapter 38 - Working with an Excel Document in Python . . . . . . . . . . . . . . . . . . . . 527
Chapter 39 - How to Generate a PDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
Chapter 40 - How to Create Graphs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
Chapter 41 - How to Work with Images in Python . . . . . . . . . . . . . . . . . . . . . . . . . 528
Chapter 42 - How to Create a Graphical User Interface . . . . . . . . . . . . . . . . . . . . . . 529
Chapter 43 - How to Create a Python Package . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
Chapter 44 - How to Create an Exe for Windows . . . . . . . . . . . . . . . . . . . . . . . . . 530
Chapter 45 - How to Create an Installer for Windows . . . . . . . . . . . . . . . . . . . . . . 531
Chapter 46 - How to Create an “exe” for Mac . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531