Table of Contents
python crash course 3rd edition pdf. A Hands-On, Project-Based Introduction to Programming. This is a collection of resources for the Python Crash Course, an introductory programming book. python crash course 3rd edition pdf by Eric Matthes.
Python crash course 3rd edition pdf Book Description
Python Crash Course stands out as the premier guide to mastering the Python programming language. Its dynamic approach swiftly propels you into the realm of coding, problem-solving, and application development.
Commencing with fundamental programming principles like variables, lists, classes, and loops, you’ll swiftly progress through each concept, honing your skills with hands-on exercises. Emphasis is placed on cultivating clean, efficient code. Additionally, you’ll delve into creating interactive programs and implementing safe code testing methodologies before integration.
Your newfound proficiency will be put to the test through practical projects, including the development of a Space Invaders-inspired arcade game, crafting compelling data visualizations leveraging Python’s robust libraries, and deploying a basic application online.
Throughout the journey, you’ll master:
- Harnessing the power of Python’s robust libraries and tools, encompassing pytest, Pygame, Matplotlib, Plotly, and Django.
- Crafting increasingly intricate 2D games with responsiveness to user inputs such as keypresses and mouse clicks.
- Generating immersive, interactive data visualizations utilizing diverse datasets.
- Constructing user-centric applications enabling account creation and data management, culminating in deployment online.
- Effective troubleshooting strategies for resolving coding errors and overcoming common programming challenges.
New to this edition:
In this third edition, Python Crash Course undergoes a comprehensive overhaul to incorporate the latest advancements in Python programming. Fresh and updated coverage encompasses essential tools such as VS Code for streamlined text editing, the pathlib module for seamless file handling, and pytest for robust code testing. Furthermore, you’ll explore the newest capabilities of Matplotlib, Plotly, and Django, ensuring you stay at the forefront of Python development.
If you’ve contemplated delving into the world of programming, Python Crash Course equips you with the essential skills to swiftly develop tangible programs. Don’t delay any further—ignite your coding journey today!
About the Author
Eric Matthes, a former high school teacher with 25 years of experience, is now a full-time writer and programmer. He’s deeply involved in diverse open-source projects, from predicting landslides to simplifying Django deployment. When not working, he enjoys mountain climbing and family time.
BRIEF CONTENTS
Preface to the Third Edition . . . . . . . . . . . .xxvii
Acknowledgments . . . . . . . . . . . . . . . . . . . .xxxi
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . xxxiii
PART I: BASICS . . . . . . . . . . . . . . . . . . . . . . .1
Chapter 1: Getting Started . . . . . . . . . . . . . 3
Setting Up Your Programming Environment . . . . . . . 3
Python Versions . . . . . . . . . . . . 4
Running Snippets of Python Code . . . . . . . . . . . . . . . . . 4
About the VS Code Editor . . . . . . . . . 4
Python on Different Operating Systems . . . . . . . . . . . 5
Python on Windows . . . . . . . . . . . . 5
Python on macOS . . . . . . . . . . . . . . . .7
Python on Linux . . . . . . . . . . . . . . . . . . 8
Running a Hello World Program . . . . . . . . . . . . 9
Installing the Python Extension for VS Code . . . . . . . . . . . 9
Running hello_world.py . . . . . . . . . . . . . . . . . . . . 10
Troubleshooting . . . . . . . . . . . . . . . . . . . . . 10
Running Python Programs from a Terminal . . . . . . . . . . . . . 11
On Windows………………………………………. 12
On macOS and Linux . . . . . . . . . . . . . . . . . . . . . 12
Exercise 1-1: python.org . . . . . . . . . . . . . . . . 13
Exercise 1-2: Hello World Typos . . . . . . . . . . . .13
Exercise 1-3: Infinite Skills . . . . . . . . . . . . . . . 13
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Chapter 2: Variables and Simple Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
What Really Happens When You Run hello_world.py . . . . . . . . . . . . . . . . . . . . . . . . . 15
Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Naming and Using Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Avoiding Name Errors When Using Variables . . . . . . . . . . . . . . . . . . . . . . . 17
Variables Are Labels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Exercise 2-1: Simple Message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Exercise 2-2: Simple Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Changing Case in a String with Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Using Variables in Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Adding Whitespace to Strings with Tabs or Newlines . . . . . . . . . . . . . . . . . . 21
Stripping Whitespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Removing Prefixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Avoiding Syntax Errors with Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Exercise 2-3: Personal Message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Exercise 2-4: Name Cases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Exercise 2-5: Famous Quote . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Exercise 2-6: Famous Quote 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Exercise 2-7: Stripping Names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Exercise 2-8: File Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Integers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Floats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Integers and Floats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Underscores in Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Multiple Assignment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Exercise 2-9: Number Eight . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Exercise 2-10: Favorite Number . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
How Do You Write Comments? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
What Kinds of Comments Should You Write? . . . . . . . . . . . . . . . . . . . . . . . . 29
Exercise 2-11: Adding Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
The Zen of Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Exercise 2-12: Zen of Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Chapter 3: Introducing Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
What Is a List? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Accessing Elements in a List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Index Positions Start at 0, Not 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Using Individual Values from a List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Exercise 3-1: Names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Exercise 3-2: Greetings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Exercise 3-3: Your Own List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Modifying, Adding, and Removing Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Modifying Elements in a List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Adding Elements to a List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Removing Elements from a List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Exercise 3-4: Guest List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Exercise 3-5: Changing Guest List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Exercise 3-6: More Guests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Exercise 3-7: Shrinking Guest List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Organizing a List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Sorting a List Permanently with the sort() Method . . . . . . . . . . . . . . . . . . . . . . 43
Sorting a List Temporarily with the sorted() Function . . . . . . . . . . . . . . . . . . . . 43
Printing a List in Reverse Order . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Contents in Detail xiii
Finding the Length of a List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Exercise 3-8: Seeing the World . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Exercise 3-9: Dinner Guests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Exercise 3-10: Every Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Avoiding Index Errors When Working with Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Exercise 3-11: Intentional Error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Chapter 4: Working with Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Looping Through an Entire List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
A Closer Look at Looping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Doing More Work Within a for Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Doing Something After a for Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Avoiding Indentation Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Forgetting to Indent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Forgetting to Indent Additional Lines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Indenting Unnecessarily . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Indenting Unnecessarily After the Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Forgetting the Colon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Exercise 4-1: Pizzas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Exercise 4-2: Animals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Making Numerical Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Using the range() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Using range() to Make a List of Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Simple Statistics with a List of Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
List Comprehensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Exercise 4-3: Counting to Twenty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Exercise 4-4: One Million . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Exercise 4-5: Summing a Million . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Exercise 4-6: Odd Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Exercise 4-7: Threes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Exercise 4-8: Cubes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Exercise 4-9: Cube Comprehension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Working with Part of a List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Slicing a List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Looping Through a Slice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Copying a List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Exercise 4-10: Slices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Exercise 4-11: My Pizzas, Your Pizzas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Exercise 4-12: More Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Tuples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Defining a Tuple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Looping Through All Values in a Tuple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Writing Over a Tuple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Exercise 4-13: Buffet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Styling Your Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
The Style Guide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Indentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Line Length . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Blank Lines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Other Style Guidelines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Exercise 4-14: PEP 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
Exercise 4-15: Code Review . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
Chapter 5: if Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
A Simple Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Conditional Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Checking for Equality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Ignoring Case When Checking for Equality . . . . . . . . . . . . . . . . . . . . . . . . . 73
Checking for Inequality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Numerical Comparisons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Checking Multiple Conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Checking Whether a Value Is in a List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Checking Whether a Value Is Not in a List…………………….. 76
Boolean Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Exercise 5-1: Conditional Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Exercise 5-2: More Conditional Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
if Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Simple if Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
if-else Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
The if-elif-else Chain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Using Multiple elif Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Omitting the else Block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Testing Multiple Conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Exercise 5-3: Alien Colors #1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Exercise 5-4: Alien Colors #2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Exercise 5-5: Alien Colors #3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Exercise 5-6: Stages of Life . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Exercise 5-7: Favorite Fruit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Using if Statements with Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Checking for Special Items . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Checking That a List Is Not Empty………………………….. 86
Using Multiple Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Exercise 5-8: Hello Admin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Exercise 5-9: No Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Exercise 5-10: Checking Usernames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Exercise 5-11: Ordinal Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Styling Your if Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Exercise 5-12: Styling if Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Exercise 5-13: Your Ideas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Chapter 6: Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
A Simple Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Working with Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Accessing Values in a Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Adding New Key-Value Pairs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Starting with an Empty Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Contents in Detail xv
Modifying Values in a Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Removing Key-Value Pairs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
A Dictionary of Similar Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Using get() to Access Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Exercise 6-1: Person . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Exercise 6-2: Favorite Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Exercise 6-3: Glossary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Looping Through a Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Looping Through All Key-Value Pairs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Looping Through All the Keys in a Dictionary………………….. 101
Looping Through a Dictionary’s Keys in a Particular Order . . . . . . . . . . . . . . 102
Looping Through All Values in a Dictionary . . . . . . . . . . . . . . . . . . . . . . . . 103
Exercise 6-4: Glossary 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Exercise 6-5: Rivers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Exercise 6-6: Polling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Nesting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
A List of Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
A List in a Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
A Dictionary in a Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Exercise 6-7: People . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Exercise 6-8: Pets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Exercise 6-9: Favorite Places . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Exercise 6-10: Favorite Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Exercise 6-11: Cities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Exercise 6-12: Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Chapter 7: User Input and while Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
How the input() Function Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Writing Clear Prompts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Using int() to Accept Numerical Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
The Modulo Operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Exercise 7-1: Rental Car . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Exercise 7-2: Restaurant Seating . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Exercise 7-3: Multiples of Ten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Introducing while Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
The while Loop in Action . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Letting the User Choose When to Quit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
Using a Flag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Using break to Exit a Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Using continue in a Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Avoiding Infinite Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Exercise 7-4: Pizza Toppings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Exercise 7-5: Movie Tickets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Exercise 7-6: Three Exits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Exercise 7-7: Infinity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Using a while Loop with Lists and Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Moving Items from One List to Another . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Removing All Instances of Specific Values from a List . . . . . . . . . . . . . . . . . . 125
Filling a Dictionary with User Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Exercise 7-8: Deli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Exercise 7-9: No Pastrami . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Exercise 7-10: Dream Vacation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Chapter 8: Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Defining a Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Passing Information to a Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Arguments and Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Exercise 8-1: Message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Exercise 8-2: Favorite Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Passing Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Positional Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Keyword Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Default Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Equivalent Function Calls………………………………. 135
Avoiding Argument Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Exercise 8-3: T-Shirt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Exercise 8-4: Large Shirts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Exercise 8-5: Cities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Return Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Returning a Simple Value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Making an Argument Optional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Returning a Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Using a Function with a while Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Exercise 8-6: City Names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Exercise 8-7: Album . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Exercise 8-8: User Albums . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Passing a List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Modifying a List in a Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Preventing a Function from Modifying a List . . . . . . . . . . . . . . . . . . . . . . . . 145
Exercise 8-9: Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Exercise 8-10: Sending Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Exercise 8-11: Archived Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Passing an Arbitrary Number of Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Mixing Positional and Arbitrary Arguments . . . . . . . . . . . . . . . . . . . . . . . . 147
Using Arbitrary Keyword Arguments……………………….. 148
Exercise 8-12: Sandwiches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Exercise 8-13: User Profile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Exercise 8-14: Cars . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Storing Your Functions in Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Importing an Entire Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
Importing Specific Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Using as to Give a Function an Alias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Using as to Give a Module an Alias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Importing All Functions in a Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Styling Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Exercise 8-15: Printing Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Exercise 8-16: Imports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Exercise 8-17: Styling Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Chapter 9: Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Creating and Using a Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Creating the Dog Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
The init() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Making an Instance from a Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Exercise 9-1: Restaurant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Exercise 9-2: Three Restaurants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Exercise 9-3: Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Working with Classes and Instances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
The Car Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Setting a Default Value for an Attribute . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
Modifying Attribute Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Exercise 9-4: Number Served . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
Exercise 9-5: Login Attempts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
The init() Method for a Child Class . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Defining Attributes and Methods for the Child Class . . . . . . . . . . . . . . . . . . 169
Overriding Methods from the Parent Class . . . . . . . . . . . . . . . . . . . . . . . . . 170
Instances as Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Modeling Real-World Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
Exercise 9-6: Ice Cream Stand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Exercise 9-7: Admin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Exercise 9-8: Privileges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Exercise 9-9: Battery Upgrade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Importing Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Importing a Single Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Storing Multiple Classes in a Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Importing Multiple Classes from a Module . . . . . . . . . . . . . . . . . . . . . . . . . 176
Importing an Entire Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Importing All Classes from a Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Importing a Module into a Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Using Aliases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Finding Your Own Workflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Exercise 9-10: Imported Restaurant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Exercise 9-11: Imported Admin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Exercise 9-12: Multiple Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
The Python Standard Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Exercise 9-13: Dice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Exercise 9-14: Lottery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Exercise 9-15: Lottery Analysis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Exercise 9-16: Python Module of the Week . . . . . . . . . . . . . . . . . . . . . . . . 180
Styling Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Chapter 10: Files and Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Reading from a File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Reading the Contents of a File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Relative and Absolute File Paths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Accessing a File’s Lines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Working with a File’s Contents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Large Files: One Million Digits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
Is Your Birthday Contained in Pi? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Exercise 10-1: Learning Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Exercise 10-2: Learning C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Exercise 10-3: Simpler Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Writing to a File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Writing a Single Line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Writing Multiple Lines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Exercise 10-4: Guest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Exercise 10-5: Guest Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Handling the ZeroDivisionError Exception . . . . . . . . . . . . . . . . . . . . . . . . . 192
Using try-except Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Using Exceptions to Prevent Crashes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
The else Block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Handling the FileNotFoundError Exception . . . . . . . . . . . . . . . . . . . . . . . . . 195
Analyzing Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Working with Multiple Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
Failing Silently . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Deciding Which Errors to Report . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Exercise 10-6: Addition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Exercise 10-7: Addition Calculator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Exercise 10-8: Cats and Dogs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Exercise 10-9: Silent Cats and Dogs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Exercise 10-10: Common Words . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Storing Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Using json.dumps() and json.loads() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Saving and Reading User-Generated Data . . . . . . . . . . . . . . . . . . . . . . . . . 202
Refactoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
Exercise 10-11: Favorite Number . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Exercise 10-12: Favorite Number Remembered . . . . . . . . . . . . . . . . . . . . . 206
Exercise 10-13: User Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Exercise 10-14: Verify User . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Chapter 11: Testing Your Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Installing pytest with pip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Updating pip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Installing pytest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Testing a Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Unit Tests and Test Cases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
A Passing Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Running a Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
A Failing Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Responding to a Failed Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Adding New Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Exercise 11-1: City, Country . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Exercise 11-2: Population . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Testing a Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
A Variety of Assertions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
A Class to Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Testing the AnonymousSurvey Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
Using Fixtures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Exercise 11-3: Employee . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
PART II: PROJECTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Chapter 12: A Ship That Fires Bullets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Planning Your Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Installing Pygame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Starting the Game Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Creating a Pygame Window and Responding to User Input . . . . . . . . . . . . . 229
Controlling the Frame Rate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Setting the Background Color . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Creating a Settings Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Adding the Ship Image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Creating the Ship Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Drawing the Ship to the Screen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Refactoring: The _check_events() and _update_screen() Methods……………. 237
The _check_events() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
The _update_screen() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Exercise 12-1: Blue Sky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Exercise 12-2: Game Character . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Piloting the Ship . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Responding to a Keypress . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Allowing Continuous Movement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Moving Both Left and Right . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Adjusting the Ship’s Speed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Limiting the Ship’s Range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
Refactoring _check_events() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Pressing Q to Quit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Running the Game in Fullscreen Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
A Quick Recap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
alien_invasion.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
settings.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
ship.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Exercise 12-3: Pygame Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Exercise 12-4: Rocket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Exercise 12-5: Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Shooting Bullets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
Adding the Bullet Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
Creating the Bullet Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
Storing Bullets in a Group . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
Firing Bullets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Deleting Old Bullets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Limiting the Number of Bullets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
Creating the _update_bullets() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
Exercise 12-6: Sideways Shooter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Chapter 13: Aliens! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Reviewing the Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Creating the First Alien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Creating the Alien Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Creating an Instance of the Alien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Building the Alien Fleet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Creating a Row of Aliens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Refactoring _create_fleet() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
Adding Rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Exercise 13-1: Stars . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Exercise 13-2: Better Stars . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Making the Fleet Move . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Moving the Aliens Right . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Creating Settings for Fleet Direction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Checking Whether an Alien Has Hit the Edge . . . . . . . . . . . . . . . . . . . . . . 265
Dropping the Fleet and Changing Direction . . . . . . . . . . . . . . . . . . . . . . . . 265
Exercise 13-3: Raindrops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Exercise 13-4: Steady Rain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Shooting Aliens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Detecting Bullet Collisions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Making Larger Bullets for Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Repopulating the Fleet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Speeding Up the Bullets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Refactoring _update_bullets() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Exercise 13-5: Sideways Shooter Part 2 . . . . . . . . . . . . . . . . . . . . . . . . . . 270
Ending the Game . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
Detecting Alien-Ship Collisions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
Responding to Alien-Ship Collisions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Aliens That Reach the Bottom of the Screen . . . . . . . . . . . . . . . . . . . . . . . . 273
Game Over! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Identifying When Parts of the Game Should Run . . . . . . . . . . . . . . . . . . . . . 275
Exercise 13-6: Game Over . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Chapter 14: Scoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
Adding the Play Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Creating a Button Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Drawing the Button to the Screen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
Starting the Game . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Resetting the Game . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Deactivating the Play Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
Hiding the Mouse Cursor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
Exercise 14-1: Press P to Play . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Exercise 14-2: Target Practice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Leveling Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Modifying the Speed Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Resetting the Speed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Exercise 14-3: Challenging Target Practice . . . . . . . . . . . . . . . . . . . . . . . . 286
Exercise 14-4: Difficulty Levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Scoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Displaying the Score…………………………………. 286
Making a Scoreboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
Updating the Score as Aliens Are Shot Down . . . . . . . . . . . . . . . . . . . . . . . 289
Resetting the Score . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Making Sure to Score All Hits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
Increasing Point Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
Rounding the Score . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
High Scores………………………………………. 292
Displaying the Level . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Displaying the Number of Ships . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Exercise 14-5: All-Time High Score . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Exercise 14-6: Refactoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Exercise 14-7: Expanding the Game . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Exercise 14-8: Sideways Shooter, Final Version . . . . . . . . . . . . . . . . . . . . . 299
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Chapter 15: Generating Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
Installing Matplotlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Plotting a Simple Line Graph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Changing the Label Type and Line Thickness . . . . . . . . . . . . . . . . . . . . . . . 303
Correcting the Plot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
Using Built-in Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
Plotting and Styling Individual Points with scatter() . . . . . . . . . . . . . . . . . . . . 306
Plotting a Series of Points with scatter() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
Calculating Data Automatically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
Customizing Tick Labels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
Defining Custom Colors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Using a Colormap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Saving Your Plots Automatically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Exercise 15-1: Cubes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Exercise 15-2: Colored Cubes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Random Walks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Creating the RandomWalk Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Choosing Directions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Plotting the Random Walk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Generating Multiple Random Walks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Styling the Walk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
Exercise 15-3: Molecular Motion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
Exercise 15-4: Modified Random Walks . . . . . . . . . . . . . . . . . . . . . . . . . . 319
Exercise 15-5: Refactoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
Rolling Dice with Plotly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
Installing Plotly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Creating the Die Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Rolling the Die . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Analyzing the Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Making a Histogram…………………………………. 322
Customizing the Plot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Rolling Two Dice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Further Customizations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Rolling Dice of Different Sizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
Saving Figures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Exercise 15-6: Two D8s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Exercise 15-7: Three Dice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Exercise 15-8: Multiplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Exercise 15-9: Die Comprehensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Exercise 15-10: Practicing with Both Libraries . . . . . . . . . . . . . . . . . . . . . . 328
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Chapter 16: Downloading Data………………………………….. 329
The CSV File Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
Parsing the CSV File Headers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
Printing the Headers and Their Positions . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Extracting and Reading Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Plotting Data in a Temperature Chart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
The datetime Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Plotting Dates……………………………………… 334
Plotting a Longer Timeframe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Plotting a Second Data Series . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Shading an Area in the Chart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
Error Checking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Downloading Your Own Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
Exercise 16-1: Sitka Rainfall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
Exercise 16-2: Sitka–Death Valley Comparison . . . . . . . . . . . . . . . . . . . . . 342
Exercise 16-3: San Francisco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
Exercise 16-4: Automatic Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
Exercise 16-5: Explore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
Mapping Global Datasets: GeoJSON Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
Downloading Earthquake Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
Examining GeoJSON Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
Making a List of All Earthquakes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
Extracting Magnitudes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
Extracting Location Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
Building a World Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
Representing Magnitudes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
Customizing Marker Colors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
Other Color Scales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Adding Hover Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Exercise 16-6: Refactoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
Exercise 16-7: Automated Title . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
Exercise 16-8: Recent Earthquakes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
Exercise 16-9: World Fires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
Chapter 17: Working with APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Using an API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Git and GitHub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
Requesting Data Using an API Call . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
Installing Requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
Processing an API Response . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
Working with the Response Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
Summarizing the Top Repositories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
Monitoring API Rate Limits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
Visualizing Repositories Using Plotly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
Styling the Chart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Adding Custom Tooltips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Adding Clickable Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
Customizing Marker Colors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
More About Plotly and the GitHub API . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
The Hacker News API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
Exercise 17-1: Other Languages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
Exercise 17-2: Active Discussions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
Exercise 17-3: Testing python_repos.py . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
Exercise 17-4: Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
Chapter 18: Getting Started with Django . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
Setting Up a Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
Writing a Spec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
Creating a Virtual Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
Activating the Virtual Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
Installing Django . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
Creating a Project in Django . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
Creating the Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
Viewing the Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
Exercise 18-1: New Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
Starting an App . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Defining Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Activating Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
The Django Admin Site . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
Defining the Entry Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384
Migrating the Entry Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
Registering Entry with the Admin Site . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
The Django Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
Exercise 18-2: Short Entries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
Exercise 18-3: The Django API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
Exercise 18-4: Pizzeria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
Making Pages: The Learning Log Home Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
Mapping a URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
Writing a View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
Writing a Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
xxiv Contents in Detail
Exercise 18-5: Meal Planner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Exercise 18-6: Pizzeria Home Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Building Additional Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Template Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
The Topics Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
Individual Topic Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Exercise 18-7: Template Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Exercise 18-8: Pizzeria Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Chapter 19: User Accounts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
Allowing Users to Enter Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Adding New Topics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Adding New Entries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
Editing Entries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
Exercise 19-1: Blog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
Setting Up User Accounts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
The accounts App . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
The Login Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
Logging Out . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
The Registration Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
Exercise 19-2: Blog Accounts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Allowing Users to Own Their Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Restricting Access with @login_required . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Connecting Data to Certain Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
Restricting Topics Access to Appropriate Users . . . . . . . . . . . . . . . . . . . . . . 427
Protecting a User’s Topics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428
Protecting the edit_entry Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
Associating New Topics with the Current User . . . . . . . . . . . . . . . . . . . . . . 429
Exercise 19-3: Refactoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
Exercise 19-4: Protecting new_entry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
Exercise 19-5: Protected Blog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
Chapter 20: Styling and Deploying an App . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
Styling Learning Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
The django-bootstrap5 App . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
Using Bootstrap to Style Learning Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
Modifying base.html . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
Styling the Home Page Using a Jumbotron . . . . . . . . . . . . . . . . . . . . . . . . . 440
Styling the Login Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
Styling the Topics Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
Styling the Entries on the Topic Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
Exercise 20-1: Other Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
Exercise 20-2: Stylish Blog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
Deploying Learning Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
Making a Platform.sh Account . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
Installing the Platform.sh CLI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
Installing platformshconfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
Contents in Detail xxv
Creating a requirements.txt File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
Additional Deployment Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
Adding Configuration Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
Modifying settings.py for Platform.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Using Git to Track the Project’s Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Creating a Project on Platform.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Pushing to Platform.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Viewing the Live Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
Refining the Platform.sh Deployment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
Creating Custom Error Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459
Ongoing Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
Deleting a Project on Platform.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
Exercise 20-3: Live Blog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
Exercise 20-4: Extended Learning Log . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
Appendix A: Installation and Troubleshooting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
Python on Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
Using py Instead of python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
Rerunning the Installer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
Python on macOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
Accidentally Installing Apple’s Version of Python . . . . . . . . . . . . . . . . . . . . . 464
Python 2 on Older Versions of macOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
Python on Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
Using the Default Python Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
Installing the Latest Version of Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
Checking Which Version of Python You’re Using . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
Python Keywords and Built-in Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
Python Keywords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
Python Built-in Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
Appendix B: Text Editors and IDEs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Working Efficiently with VS Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
Configuring VS Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
VS Code Shortcuts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
Other Text Editors and IDEs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
IDLE 474
Geany . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
Sublime Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
Emacs and Vim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
PyCharm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
Jupyter Notebooks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
Appendix C: Getting Help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
Appendix D: Using Git for Version Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
Installing Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484
Configuring Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484
Making a Project…………………………………………. 484
Ignoring Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484
Initializing a Repository . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
Checking the Status . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
Adding Files to the Repository . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
Making a Commit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
Checking the Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
The Second Commit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
Abandoning Changes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
Checking Out Previous Commits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
Deleting the Repository . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
Appendix E: Troubleshooting Deployments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
Understanding Deployments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
Basic Troubleshooting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
Follow Onscreen Suggestions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
Read the Log Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
OS-Specific Troubleshooting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
Deploying from Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
Deploying from macOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499
Deploying from Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499
Other Deployment Approaches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503
Python Crash course 3rd Edition Source Code
Book Info:
- Publisher : No Starch Press; 3nd edition (2023)
- Author: Eric Matthes
- Language : English
- Paperback : 544 pages
- File Type: PDF
- File SIZE: 8 MB
- FILE Name: Eric Matthes – Python Crash Course(2023).pdf
Book Review:
“Does what it says on the tin, and does it really well. . . . Presents a large number of useful exercises as well as three challenging and entertaining projects.”
—RealPython.com
“A fast-paced but comprehensive introduction to programming with Python, Python Crash Course is another superb book to add to your library and help you finally master Python.”
—TutorialEdge.net
“A brilliant option for complete beginners without any coding experience. If you’re looking for a solid, uncomplicated intro to this very deep language, I have to recommend this book.”
—WhatPixel.com
“Contains literally everything you need to know about Python and even more.”
—FireBearStudio.com
“While Python Crash Course uses Python to teach you to code, it also teaches clean programming skills that apply to most other languages.”
—Great Lakes Geek