Introduction
Credit: David Ascher, ActiveState, co-author of
Learning Python Programming languages are like natural
languages. Each has a set of qualities that polyglots generally agree
on as characteristics of the language. Russian and French are often
admired for their lyricism, while English is more often cited for its
precision and dynamism: unlike the Académie-defined French
language, the English language routinely grows words to suit its
speakers' needs, such as
"carjacking,"
"earwitness,"
"snailmail,"
"email,"
"googlewhacking," and
"blogging." In the world of
computer languages, Perl is well known for its many degrees of
freedom: TMTOWTDI (There's More Than One Way To Do
It) is one of the mantras of the Perl programmer. Conciseness is also
seen as a strong virtue in the Perl and APL communities. As
you'll see in many of the discussions of recipes
throughout this volume, in contrast, Python programmers often express
their belief in the value of clarity and elegance. As a well-known
Perl hacker once told me, Python's prettier, but
Perl is more fun. I agree with him that Python does have a strong (as
in well-defined) aesthetic, while Perl has more of a sense of
humor. The reason I mention these seemingly irrelevant characteristics at
the beginning of this chapter is that the recipes you see in this
chapter are directly related to Python's aesthetic
and social dynamics. If this book had been about Perl, the recipes in
a shortcuts chapter would probably elicit head scratching,
contemplation, an "a-ha"! moment,
and then a burst of laughter, as the reader grokked the genius behind
a particular trick. In contrast, in most of the recipes in this
chapter, the author presents a single elegant language feature, but
one that he feels is underappreciated. Much like I, a proud resident
of Vancouver, will go out of my way to show tourists the really neat
things about the city, from the parks to the beaches to the
mountains, a Python user will seek out friends and colleagues and
say, "You gotta see this!" For me
and most of the programmers I know, programming in Python is a shared
social pleasure, not a competitive pursuit. There is great pleasure
in learning a new feature and appreciating its design, elegance, and
judicious use, and there's a twin pleasure in
teaching another or another thousand about that feature.A word about the history of the chapter: back when we identified the
recipe categories for the first edition of this collection, our
driving notion was that there would be recipes of various kinds, each
with a specific goala soufflé, a tart, an osso
buco. Those recipes would naturally fall into fairly typical
categories, such as desserts, appetizers, and meat dishes, or their
perhaps less appetizing, nonmetaphorical equivalents, such as files,
algorithms, and so on. So we picked a list of categories, added the
categories to the Zope site used to collect recipes, and opened the
floodgates.Soon, it became clear that some submissions were hard to fit into the
predetermined categories. There's a reason for that,
and cooking helps explain why. The recipes in this chapter are the
Pythonic equivalent of making a roux (a cooked mixture of fat and
flour, used in making sauces, for those of you without a classic
French cooking background), kneading dough, flouring, separating
eggs, flipping a pan's contents, blanching, and the
myriad other tricks that any accomplished cook knows, but that you
won't find in a typical cookbook. Many of these
tricks and techniques are used in preparing meals, but
it's hard to pigeonhole them as relevant for a given
type of dish. And if you're a novice cook looking up
a fancy recipe, you're likely to get frustrated
quickly because serious cookbook authors assume you know these
techniques, and they explain them (with illustrations!) only in books
with titles such as Cooking for Divorced Middle-Aged
Men. We didn't want to exclude this
precious category of tricks from this book, so a new category was
born (sorry, no illustrations).In the introduction to this chapter in the first edition, I
presciently said:
I believe that the recipes in this chapter are among the most
time-sensitive of the recipes in this volume. That's
because the aspects of the language that people consider shortcuts or
noteworthy techniques seem to be relatively straightforward,
idiomatic applications of recent language features.
I can proudly say that I was right. This new edition, significantly
focused on the present definition of the language, makes many of the
original recipes irrelevant. In the two Python releases since the
book's first edition, Python 2.3 and 2.4, the
language has evolved to incorporate the ideas of those recipes into
new syntactic features or library functions, just as it had done with
every previous major release, making a cleaner, more compact, and yet
more powerful language that's as much fun to use
today as it was over ten years ago.All in all, about half the recipes in this chapter (roughly the same
proportion as in the rest of the book) are entirely new ones, while
the other half are vastly revised (mostly simplified) versions of
recipes that were in the first edition. Thanks to the
simplifications, and to the focus on just two language versions (2.3
and 2.4) rather than the whole panoply of older versions that was
covered by the first edition, this chapter, as well as the book as a
whole, has over one-third more recipes than the first edition did.It's worth noting in closing that many of the
recipes that are in this newly revised chapter touch on some of the
most fundamental, unchanging aspects of the language: the semantics
of assignment, binding, copy, and references; sequences;
dictionaries. These ideas are all keys to the Pythonic approach to
programming, and seeing these recipes live for several years makes me
wonder whether Python will evolve in the next few years in related
directions.