دسترسی نامحدود
برای کاربرانی که ثبت نام کرده اند
برای ارتباط با ما می توانید از طریق شماره موبایل زیر از طریق تماس و پیامک با ما در ارتباط باشید
در صورت عدم پاسخ گویی از طریق پیامک با پشتیبان در ارتباط باشید
برای کاربرانی که ثبت نام کرده اند
درصورت عدم همخوانی توضیحات با کتاب
از ساعت 7 صبح تا 10 شب
ویرایش:
نویسندگان: Mike Driscoll
سری:
ISBN (شابک) : 9781484232378
ناشر: Apress
سال نشر: 2018
تعداد صفحات: 352
زبان: english
فرمت فایل : PDF (درصورت درخواست کاربر به PDF، EPUB یا AZW3 تبدیل می شود)
حجم فایل: 4 مگابایت
در صورت تبدیل فایل کتاب wxPython Recipes به فرمت های PDF، EPUB، AZW3، MOBI و یا DJVU می توانید به پشتیبان اطلاع دهید تا فایل مورد نظر را تبدیل نمایند.
توجه داشته باشید کتاب دستور العمل های wxPython نسخه زبان اصلی می باشد و کتاب ترجمه شده به فارسی نمی باشد. وبسایت اینترنشنال لایبرری ارائه دهنده کتاب های زبان اصلی می باشد و هیچ گونه کتاب ترجمه شده یا نوشته شده به فارسی را ارائه نمی دهد.
به سرعت راهحلهایی برای مشکلات رایج کشف کنید، بهترین روشها را بیاموزید و همه چیزهایی که wxPython ارائه میدهد را درک کنید. این کتاب برای کسانی است که مایلند در مورد نحوه استفاده از جعبه ابزار دسکتاپ wxPython اطلاعات بیشتری کسب کنند. برخی از دانش قبلی پایتون و درک کلی از توسعه wxPython یا GUI را فرض میکند و حاوی بیش از 50 دستور العمل است که وظایف و جنبههای مختلف جعبه ابزار را پوشش میدهد. wxPython Recipes شما را گام به گام راهنمایی می کند. این کتاب شما را با نحوه ایجاد رابط کاربری در پایتون آشنا میکند، از جمله افزودن ویجتها، تغییر تصاویر پسزمینه، دستکاری دیالوگها، مدیریت دادهها و موارد دیگر. نمونهها هم پایتون 2.x و هم 3.x را هدف قرار میدهند و هر دو wxPython 3.0 و Phoenix را پوشش میدهند و مجموعه کاملی از ایدهها را برای بهبود توسعه رابط کاربری گرافیکی ارائه میدهند. آنچه یاد خواهید گرفت کار با عناصر رابط کاربری مانند ویجت ها، دکمه ها، تصاویر، جعبه ها و موارد دیگر مدیریت داده ها در فایل ها و نوت بوک ها پیاده سازی XML و استفاده از منابع XML (XRC) سفارشی کردن رفتار پانل ها و اشیاء این کتاب برای افرادی که قبلاً با زبان برنامه نویسی پایتون آشنا هستند و همچنین درک اولیه ای از wxPython دارند. خوانندگانی که حلقههای رویداد و اصول اولیه ایجاد رابطهای کاربری را با جعبه ابزار پایتون UI دیگر مانند Tkinter یا PyQt درک میکنند.
Quickly discover solutions to common problems, learn best practices, and understand everything wxPython has to offer. This book is for anyone wanting to learn more about how to use the wxPython desktop GUI toolkit. It assumes some prior knowledge of Python and a general understanding of wxPython or GUI development, and contains more than 50 recipes covering various tasks and aspects of the toolkit. wxPython Recipes guides you step by step. The book takes you through how to create user interfaces in Python, including adding widgets, changing background images, manipulating dialogs, managing data, and much more. Examples target both Python 2.x and 3.x, and cover both wxPython 3.0 and Phoenix, offering a complete collection of ideas to improve your GUI development. What You'll Learn Work with UI elements such as widgets, buttons, images, boxes, and more Handle data in files and notebooks Implement XML and using XML resources (XRC) Customize the behavior of panels and objects Who This Book Is For People who are already familiar with the Python programming language and also have a basic understanding of wxPython. Readers who understand event loops and the basics of creating user interfaces with another Python UI toolkit, such as Tkinter or PyQt.
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