Python 101

This document was uploaded by one of our users. The uploader already confirmed that they had the permission to publish it. If you are author/publisher or own the copyright of this documents, please report to us by using this DMCA report form.

Simply click on the Download Book button.

Yes, Book downloads on Ebookily are 100% Free.

Sometimes the book is free on Amazon As well, so go ahead and hit "Search on Amazon"

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