Tải bản đầy đủ (.pdf) (641 trang)

beginning python - from novice to professional (2005)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (13.26 MB, 641 trang )

Beginning Python
From Novice to Professional
■■■
Magnus Lie Hetland
Hetland_519XFront.fm Page i Tuesday, August 23, 2005 5:04 AM
Beginning Python: From Novice to Professional
Copyright © 2005 by Magnus Lie Hetland
All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording, or by any information storage or retrieval
system, without the prior written permission of the copyright owner and the publisher.
ISBN (pbk): 1-59059-519-X
Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1
Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence
of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark
owner, with no intention of infringement of the trademark.
Lead Editor: Jason Gilmore
Editor: Matt Moodie
Technical Reviewer: Jeremy Jones
Editorial Board: Steve Anglin, Dan Appleman, Ewan Buckingham, Gary Cornell, Tony Davis, Jason Gilmore,
Jonathan Hassell, Chris Mills, Dominic Shakeshaft, Jim Sumser
Associate Publisher: Grace Wong
Project Manager: Beckie Stones
Copy Edit Manager: Nicole LeClerc
Copy Editor: Ami Knox
Assistant Production Director: Kari Brooks-Copony
Production Editor: Linda Marousek
Compositor: Susan Glinert Stevens
Proofreader: Liz Welch
Indexer: Michael Brinkman
Interior Designer: Van Winkle Design Group


Cover Designer: Kurt Krames
Manufacturing Director: Tom Debolski
Distributed to the book trade worldwide by Springer-Verlag New York, Inc., 233 Spring Street, 6th Floor,
New York, NY 10013. Phone 1-800-SPRINGER, fax 201-348-4505, e-mail , or
visit .
For information on translations, please contact Apress directly at 2560 Ninth Street, Suite 219, Berkeley, CA
94710. Phone 510-549-5930, fax 510-549-5939, e-mail , or visit .
The information in this book is distributed on an “as is” basis, without warranty. Although every precaution
has been taken in the preparation of this work, neither the author(s) nor Apress shall have any liability to
any person or entity with respect to any loss or damage caused or alleged to be caused directly or indirectly
by the information contained in this work.
The source code for this book is available to readers at in the Source Code section.
Hetland_519XFront.fm Page ii Tuesday, August 23, 2005 5:04 AM
For Ranveig
Hetland_519XFront.fm Page iii Tuesday, August 23, 2005 5:04 AM
Hetland_519XFront.fm Page iv Tuesday, August 23, 2005 5:04 AM
v
Contents at a Glance
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiii
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxv
Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix
■CHAPTER 1 Instant Hacking: The Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
■CHAPTER 2 Lists and Tuples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
■CHAPTER 3 Working with Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
■CHAPTER 4 Dictionaries: When Indices Won’t Do . . . . . . . . . . . . . . . . . . . . . . . . . . 67
■CHAPTER 5 Conditionals, Loops, and Some Other Statements . . . . . . . . . . . . . . 81
■CHAPTER 6 Abstraction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
■CHAPTER 7 More Abstraction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
■CHAPTER 8 Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159

■CHAPTER 9 Magic Methods, Properties, and Iterators . . . . . . . . . . . . . . . . . . . . 173
■CHAPTER 10 Batteries Included . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
■CHAPTER 11 Files and Stuff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
■CHAPTER 12 Graphical User Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
■CHAPTER 13 Database Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
■CHAPTER 14 Network Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
■CHAPTER 15 Python and the Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
■CHAPTER 16 Testing, 1-2-3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
■CHAPTER 17 Extending Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
■CHAPTER 18 Packaging Your Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
■CHAPTER 19 Playful Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
■CHAPTER 20 Project 1: Instant Markup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
■CHAPTER 21 Project 2: Painting a Pretty Picture . . . . . . . . . . . . . . . . . . . . . . . . . . 411
■CHAPTER 22 Project 3: XML for All Occasions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
Hetland_519XFront.fm Page v Tuesday, August 23, 2005 5:04 AM
■CHAPTER 23 Project 4: In the News . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
■CHAPTER 24 Project 5: A Virtual Tea Party . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
■CHAPTER 25 Project 6: Remote Editing with CGI . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
■CHAPTER 26 Project 7: Your Own Bulletin Board . . . . . . . . . . . . . . . . . . . . . . . . . . 483
■CHAPTER 27 Project 8: File Sharing with XML-RPC . . . . . . . . . . . . . . . . . . . . . . . . 499
■CHAPTER 28 Project 9: File Sharing II—Now with GUI! . . . . . . . . . . . . . . . . . . . . 517
■CHAPTER 29 Project 10: Do-It-Yourself Arcade Game . . . . . . . . . . . . . . . . . . . . . . 527
■APPENDIX A The Short Version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
■APPENDIX B Python Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
■APPENDIX C Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
Hetland_519XFront.fm Page vi Tuesday, August 23, 2005 5:04 AM
vii
Contents
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiii

About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxv
Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix
■CHAPTER 1 Instant Hacking: The Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Installing Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Linux and UNIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Macintosh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Other Distributions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Keeping In Touch and Up to Date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
The Interactive Interpreter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Algo . . . What? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Numbers and Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Large Integers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Hexadecimals and Octals. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Getting Input from the User . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
cmath and Complex Numbers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Back to the _ _future_ _ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Saving and Executing Your Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Running Your Python Scripts from a Command Prompt . . . . . . . . . 20
Making Your Scripts Behave Like Normal Programs . . . . . . . . . . . . 21
Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Contents
Hetland_519XFront.fm Page vii Tuesday, August 23, 2005 5:04 AM
309bf486554ecadb7baa4eaae4c03308
viii

■CONTENTS
Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Single-Quoted Strings and Escaping Quotes. . . . . . . . . . . . . . . . . . . 23
Concatenating Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
String Representations, str and repr. . . . . . . . . . . . . . . . . . . . . . . . . . 25
input vs. raw_input. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Long Strings, Raw Strings, and Unicode . . . . . . . . . . . . . . . . . . . . . . 26
A Quick Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
New Functions in This Chapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
■CHAPTER 2 Lists and Tuples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Common Sequence Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Indexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Slicing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Adding Sequences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Multiplication. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Membership . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Length, Minimum, and Maximum. . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Lists: Python’s Workhorse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
The list Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Basic List Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
List Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Tuples: Immutable Sequences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
The tuple Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Basic Tuple Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
So What’s the Point? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
A Quick Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
New Functions in This Chapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
■CHAPTER 3 Working with Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

Basic String Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
String Formatting: The Short Version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
String Formatting: The Long Version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Simple Conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Width and Precision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Signs, Alignment, and Zero-Padding . . . . . . . . . . . . . . . . . . . . . . . . . 58
Hetland_519XFront.fm Page viii Tuesday, August 23, 2005 5:04 AM
■CONTENTS
ix
String Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
find . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
lower . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
replace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
split. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
strip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
translate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
A Quick Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
New Functions in This Chapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
■CHAPTER 4 Dictionaries: When Indices Won’t Do . . . . . . . . . . . . . . . . . . . . 67
But What Are They For? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Dictionary Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
The dict Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Basic Dictionary Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
String Formatting with Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Dictionary Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
clear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
copy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
fromkeys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

get . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
has_key . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
items and iteritems. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
keys and iterkeys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
pop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
popitem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
setdefault. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
update . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
values and itervalues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
A Quick Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
New Functions in This Chapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Hetland_519XFront.fm Page ix Tuesday, August 23, 2005 5:04 AM
x
■CONTENTS
■CHAPTER 5 Conditionals, Loops, and Some Other Statements . . . . . . . 81
More About print and import . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Printing with Commas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Importing Something As Something Else. . . . . . . . . . . . . . . . . . . . . . 82
Assignment Magic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Sequence Unpacking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Chained Assignments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Augmented Assignments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Blocks: The Joy of Indentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Conditions and Conditional Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
So That’s What Those Boolean Values Are For . . . . . . . . . . . . . . . . . 86
Conditional Execution and the if Statement. . . . . . . . . . . . . . . . . . . . 87
else Clauses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
elif Clauses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Nesting Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

More Complex Conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Assertions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
while Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
for Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Iterating Over Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Some Iteration Utilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Breaking Out of Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
else Clauses in Loops. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
List Comprehension—Slightly Loopy . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
And Three for the Road . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Nothing Happened!. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Deleting with del. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Executing and Evaluating Strings with exec and eval . . . . . . . . . . 104
A Quick Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
New Functions in This Chapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
■CHAPTER 6 Abstraction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Laziness Is a Virtue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Abstraction and Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Creating Your Own Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Documenting Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Functions That Aren’t Really Functions . . . . . . . . . . . . . . . . . . . . . . 112
Hetland_519XFront.fm Page x Tuesday, August 23, 2005 5:04 AM
■CONTENTS
xi
The Magic of Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Where Do the Values Come From?. . . . . . . . . . . . . . . . . . . . . . . . . . 113
Can I Change a Parameter?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Keyword Parameters and Defaults . . . . . . . . . . . . . . . . . . . . . . . . . . 119

Collecting Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Scoping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Rebinding Global Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Recursion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Two Classics: Factorial and Power. . . . . . . . . . . . . . . . . . . . . . . . . . 130
Another Classic: Binary Search. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Throwing Functions Around . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
reduce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
apply. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
A Quick Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
New Functions in This Chapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
■CHAPTER 7 More Abstraction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
The Magic of Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Polymorphism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Encapsulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Inheritance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Classes and Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
What Is a Class, Exactly? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Making Your Own Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Attributes, Functions, and Methods . . . . . . . . . . . . . . . . . . . . . . . . . 149
Throwing Methods Around. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
The Class Namespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Specifying a Superclass. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Investigating Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Multiple Superclasses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Interfaces and Introspection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Some Thoughts on Object-Oriented Design . . . . . . . . . . . . . . . . . . . . . . 156

A Quick Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
New Functions in This Chapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Hetland_519XFront.fm Page xi Tuesday, August 23, 2005 5:04 AM
xii
■CONTENTS
■CHAPTER 8 Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
What Is an Exception? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Making Things Go Wrong . . . Your Way . . . . . . . . . . . . . . . . . . . . . . . . . . 160
The raise Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Custom Exception Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Catching Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Look, Ma, No Arguments! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
More Than One except Clause . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Catching Two Exceptions with One Block . . . . . . . . . . . . . . . . . . . . . . . . 164
Catching the Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
A Real Catchall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
When All Is Well . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
And Finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Exceptions and Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
The Zen of Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
A Quick Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
New Functions in This Chapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
■CHAPTER 9 Magic Methods, Properties, and Iterators . . . . . . . . . . . . . . 173
Before We Begin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Overriding the Constructor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Calling the Unbound Superclass Constructor . . . . . . . . . . . . . . . . . 177
Using the super Function. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178

Item Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
The Basic Sequence and Mapping Protocol . . . . . . . . . . . . . . . . . . 180
Subclassing list, dict, and str . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
More Magic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
The property Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
__getattr__, __setattr__, and Friends. . . . . . . . . . . . . . . . . . . . . . 188
Iterators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
The Iterator Protocol. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Making Sequences from Iterators. . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Generators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Making a Generator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
A Recursive Generator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Generators in General. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Avoiding Generators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Hetland_519XFront.fm Page xii Tuesday, August 23, 2005 5:04 AM
■CONTENTS
xiii
The Eight Queens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Backtracking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
The Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
State Representation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Finding Conflicts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
The Base Case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
The Recursive Case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Wrapping It Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
A Quick Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
New Functions in This Chapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
■CHAPTER 10 Batteries Included . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203

Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Modules Are Programs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Modules Are Used to Define Things . . . . . . . . . . . . . . . . . . . . . . . . . 205
Making Your Modules Available . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Exploring Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
What’s in a Module?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Getting Help with help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Use the Source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
The Standard Library: A Few Favorites . . . . . . . . . . . . . . . . . . . . . . . . . . 215
sys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
os . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
fileinput . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Sets, Heaps, and Deques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
random. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
shelve. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
re . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Other Interesting Standard Modules. . . . . . . . . . . . . . . . . . . . . . . . . 251
A Quick Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
New Functions in This Chapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Hetland_519XFront.fm Page xiii Tuesday, August 23, 2005 5:04 AM
xiv
■CONTENTS
■CHAPTER 11 Files and Stuff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Opening Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
The Mode Argument. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Buffering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257

The Basic File Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Reading and Writing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Reading and Writing Lines. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
Closing Your Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Iterating Over File Contents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Doing It Byte by Byte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
One Line at a Time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Reading Everything. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Lazy Line Iteration with fileinput and xreadlines. . . . . . . . . . . . . . . 265
The New Kids on the Block: File Iterators . . . . . . . . . . . . . . . . . . . . 266
A Quick Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
New Functions in This Chapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
■CHAPTER 12 Graphical User Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
An Example GUI Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
A Plethora of Platforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
Downloading and Installing wxPython . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Creating Windows and Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
Labels and Positions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
More Intelligent Layout. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Event Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
The Finished Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
But I’d Rather Use . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
Using Tkinter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Using Jython and Swing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
Using Something Else. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
A Quick Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Hetland_519XFront.fm Page xiv Tuesday, August 23, 2005 5:04 AM

309bf486554ecadb7baa4eaae4c03308
■CONTENTS
xv
■CHAPTER 13 Database Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
The Python DB API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Global Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
Connections and Cursors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Downloading and Installing pysqlite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
An Example Database Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Creating and Populating Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
Searching and Dealing with Results. . . . . . . . . . . . . . . . . . . . . . . . . 294
A Quick Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
New Functions in This Chapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
■CHAPTER 14 Network Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
A Handful of Networking Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
socket. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
urllib and urllib2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
Other Modules. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
SocketServer and Friends . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
More Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Multiple Connections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Forking and Threading with SocketServers. . . . . . . . . . . . . . . . . . . 305
Asynchronous I/O with select and poll . . . . . . . . . . . . . . . . . . . . . . . 305
Twisted . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
Downloading and Installing Twisted. . . . . . . . . . . . . . . . . . . . . . . . . 308
Writing a Twisted Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309

A Quick Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
New Functions in This Chapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
■CHAPTER 15 Python and the Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Screen Scraping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Tidy and XHTML Parsing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Beautiful Soup. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
Hetland_519XFront.fm Page xv Tuesday, August 23, 2005 5:04 AM
xvi
■CONTENTS
Dynamic Web Pages with CGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Step 1. Preparing the Web Server . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Step 2. Adding the Pound Bang Line . . . . . . . . . . . . . . . . . . . . . . . . 321
Step 3. Setting the File Permissions. . . . . . . . . . . . . . . . . . . . . . . . . 322
CGI Security Risks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
A Simple CGI Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Debugging with cgitb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Using the cgi Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
A Simple Form. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
One Step Up: mod_python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Installing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
CGI Handler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
PSP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
The Publisher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Web Services: Scraping Done Right . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
RSS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
XML-RPC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
A Quick Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
New Functions in This Chapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339

■CHAPTER 16 Testing, 1-2-3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
Test First, Code Later . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
Precise Requirement Specification. . . . . . . . . . . . . . . . . . . . . . . . . . 342
Planning for Change. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
The 1-2-3 (and 4) of Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
Tools for Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
doctest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
unittest. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
Beyond Unit Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
PyChecker and PyLint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
Profiling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
A Quick Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
New Functions in This Chapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Hetland_519XFront.fm Page xvi Tuesday, August 23, 2005 5:04 AM
■CONTENTS
xvii
■CHAPTER 17 Extending Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
The Really Easy Way: Jython and IronPython . . . . . . . . . . . . . . . . . . . . . 358
Writing C Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
A Swig of . . . SWIG. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
Hacking It on Your Own . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
A Quick Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
New Functions in This Chapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
■CHAPTER 18 Packaging Your Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
Distutils Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
Basic Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
Wrapping Things Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
Compiling Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378

Creating Executable Programs with py2exe . . . . . . . . . . . . . . . . . . . . . . 379
A Quick Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
New Functions in This Chapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
■CHAPTER 19 Playful Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
Why Playful? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
The Ju-Jitsu of Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
Prototyping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382
Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
Extracting Constants. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
Configuration Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384
Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
If You Can’t Be Bothered . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
Project Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
A Quick Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
Hetland_519XFront.fm Page xvii Tuesday, August 23, 2005 5:04 AM
xviii
■CONTENTS
■CHAPTER 20 Project 1: Instant Markup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
What’s the Problem? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
Specific Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Useful Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Preparations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
First Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
Adding Some Markup. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
Second Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
Handlers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
A Handler Superclass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399

A Rule Superclass. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Filters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
The Parser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Constructing the Rules and Filters . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Putting It All Together. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
■CHAPTER 21 Project 2: Painting a Pretty Picture . . . . . . . . . . . . . . . . . . . . . 411
What’s the Problem? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Specific Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
Useful Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
How Does It Work? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
Preparations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
First Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
Drawing with ReportLab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
Constructing Some PolyLines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
The Prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
Second Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
Getting the Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
Using the LinePlot Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
Hetland_519XFront.fm Page xviii Tuesday, August 23, 2005 5:04 AM
■CONTENTS
xix
■CHAPTER 22 Project 3: XML for All Occasions . . . . . . . . . . . . . . . . . . . . . . . . 421
What’s the Problem? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
Specific Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
Useful Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
Preparations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423

First Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
Creating a Simple Content Handler. . . . . . . . . . . . . . . . . . . . . . . . . . 425
Creating HTML Pages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428
Second Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
A Dispatcher Mix-In Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
Factoring Out the Header, Footer, and Default Handling . . . . . . . . 432
Support for Directories. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
The Event Handlers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
■CHAPTER 23 Project 4: In the News . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
What’s the Problem? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
Specific Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
Useful Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
Preparations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
First Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
Second Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
■CHAPTER 24 Project 5: A Virtual Tea Party . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
What’s the Problem? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Specific Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Useful Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
What’s It For? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
Preparations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
First Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
The ChatServer Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
The ChatSession Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459
Putting It Together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
Hetland_519XFront.fm Page xix Tuesday, August 23, 2005 5:04 AM

xx
■CONTENTS
Second Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
Basic Command Interpretation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
Rooms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
Login and Logout Rooms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
The Main Chat Room . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
The New Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
■CHAPTER 25 Project 6: Remote Editing with CGI . . . . . . . . . . . . . . . . . . . . . . 473
What’s the Problem? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
Specific Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
Useful Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
Preparations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
First Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
Second Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
index.html . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
edit.cgi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
save.cgi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
Running the Editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
■CHAPTER 26 Project 7: Your Own Bulletin Board . . . . . . . . . . . . . . . . . . . . . 483
What’s the Problem? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
Specific Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
Useful Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484
Preparations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484
First Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
Second Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489

main.cgi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
view.cgi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492
edit.cgi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
save.cgi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
Trying It Out. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
Hetland_519XFront.fm Page xx Tuesday, August 23, 2005 5:04 AM
■CONTENTS
xxi
■CHAPTER 27 Project 8: File Sharing with XML-RPC . . . . . . . . . . . . . . . . . . . 499
What’s the Problem? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499
Specific Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
Useful Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
Preparations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
First Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
Second Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
The Client Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
The Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
Validating File Names. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
Trying Out the Second Implementation . . . . . . . . . . . . . . . . . . . . . . 511
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
■CHAPTER 28 Project 9: File Sharing II—Now with GUI! . . . . . . . . . . . . . . . 517
What’s the Problem? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Specific Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Useful Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Preparations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
First Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
Second Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521

Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
■CHAPTER 29 Project 10: Do-It-Yourself Arcade Game . . . . . . . . . . . . . . . . 527
What’s the Problem? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
Specific Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
Useful Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
pygame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
pygame.locals. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
pygame.display. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
pygame.font . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
pygame.sprite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
pygame.mouse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
pygame.event . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
pygame.image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
Hetland_519XFront.fm Page xxi Tuesday, August 23, 2005 5:04 AM
309bf486554ecadb7baa4eaae4c03308
xxii
■CONTENTS
Preparations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
First Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
Second Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
What Now? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
■APPENDIX A The Short Version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
The Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549
Objects and Stuff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
Some Loose Ends . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554
■APPENDIX B Python Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557

Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566
Simple Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566
Compound Statements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
■APPENDIX C Online Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
Python Distributions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
Python Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572
Useful Toolkits and Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572
Newsgroups and Mailing Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
Hetland_519XFront.fm Page xxii Tuesday, August 23, 2005 5:04 AM
xxiii
About the Author
■MAGNUS LIE HETLAND is an associate professor of algorithms at the
Norwegian University of Science and Technology, NTNU. Even though
he loves learning new programming languages—even quite obscure
ones—Magnus has been a devoted Python fan and an active member
of the Python community for many years, and is the author of the
popular online tutorials “Instant Python” and “Instant Hacking.” His
publications include the forerunner to this book, Practical Python
(Apress, 2002), as well as several scientific papers. When he isn’t busy
staring at a computer screen, he may be found reading (even while bicycling), acting (in a local
theater group), or gaming (mostly roleplaying games).
Hetland_519XFront.fm Page xxiii Tuesday, August 23, 2005 5:04 AM
Hetland_519XFront.fm Page xxiv Tuesday, August 23, 2005 5:04 AM

×