Learning Python, 2nd Edition
from the new-skin-on-snake dept.
| Learning Python 2nd Edition | |
| author | Mark Lutz & David Ascher |
| pages | 591 |
| publisher | O'Reilly & Associates, Inc. |
| rating | 10 |
| reviewer | Ursus Maximus |
| ISBN | 0596002815 |
| summary | An introduction to Python programming |
Python is a dynamic, interpreted, object oriented language used for both scripting and systems programming. Python is known for being easy to learn and use, while also being powerful enough to be used for such projects as Zope and the Chandler project. Its growing popularity is also based on its reputation for fostering programmer productivity and program maintainability. One drawback sometime cited is its relatively slow execution speed compared to compiled languages such as C.
For myself, I have probably read too many books about Python, but that is because I am an amateur hacker who learns programming slowly, and I find that reading several books about the same topic, covering the subject matter from different angles, allows me to better absorb the material. For me, this was a good review of the core language and a welcome refresher course on the newer aspects introduced in versions 2.2 and 2.3. For anyone who is new to Python and wants to learn from the ground up, this book would be a great place to start.
Mark Lutz is an authority on Python and one if its leading teachers, with both Learning and O'Reilly's Programming Python to his credit, as well as the courses and seminars he teaches professionally. In updating the original version, which was already very good, Mark has polished the chapters on the core language to a nearly perfect level, while his co-author David Ascher has done the same on the more advanced aspects of the book. In addition, Mr Lutz has benefited from extensive feedback from students and readers, and his explanations therefore anticipate common misunderstandings. Each chapter is accompanied by a problem and exercise section and answers are included at the back of the book.
A major addition to the new edition is a chapter on "Advanced Function Topics," including list comprehensions, generators and iterators. Python is sometimes used with a functional programing style almost similar to Lisp, although to List purists that may sound like heresy. The recent versions of the language have significantly upgraded Python's support for the functional style. Functions cover three chapters in the 2nd edition instead of just one.
Another major change since the first edition is extended coverage of Modules, which now occupies four chapter instead of just one. Python modules are a high level package structure for code and data, and they help facilitate code reuse. Yet another addition is coverage of Python's "new style classes." Coverage of classes and object oriented programming has been greatly expanded and now includes five whole chapters and almost 100 pages. Coverage of exceptions now is expanded to three chapters.
If you have been considering learning Python, now would be a great time since this new book is the perfect introductory text. If you already know Python and have read the first edition of Learning Python or another introductory text, then this book may not be essential since the new language features are covered pretty well on the web in various places, and you might be better advised to read one of the other fine books on non-introductory aspects of Python. But this book is about as good an introduction to the language as you are likely to find. The book does not cover all of the Python libraries nor many other topics, but it does briefly touch on the major libraries, frameworks, gui toolkits, and community resources.
If you want to learn the core Python language quickly, this may be your best bet. Learning Python only covers the basics, but it is deep in information on what it does cover. Well written, understandable, and in a very logical arrangement, this book is densely packed with info.
I have often found myself returning to the original book, and the new book will now fill this role. It is deep in information, well written, and a joy to read. For an experienced programmer who is just learning Python, it may be possible to thoroughly learn everything about the core language in one reading of this book. For relative newbies, it will be an often-used resource.
To read more reviews of books about Python, visit the Python Learning Foundation. You can purchase the Learning Python, 2nd Ed. from bn.com. Slashdot welcomes readers' book reviews -- to see your own review here, read the book review guidelines, then visit the submission page.
A nice comparison of Python with other languages.. (Score:5, Informative)
(http://tomcopeland.blogs.com/)
I prefer Ruby [rubyforge.org], but there seem to be a lot of healthy discussions of various language features and ideas across the scripting language community. The "Python comparison page", for example, has a link to John Ousterhout's paper on why scripting languages are useful - even thought he wrote the paper about Tcl, it's just as applicable to Python or Ruby.
Re:A nice comparison of Python with other language (Score:5, Insightful)
(http://www.lumenera.com/)
1) I prefer the Python example. It's easier to read. And easier to write the first time. That's the reason Python is better than Ruby: when you write code, you get it right the first time more often. And that's such a huge advantage.
Of course, you screwed up. (I assume you wanted to print the value of k rather than the letter k)
2) You used a comprehension in Ruby but not in Python. And adict.items() would have been easier than adict.keys()
To be more fair:
adict = {'key':'val','key2':'val2','key3':3.14}
[sys.stdout.write(k+'-> '+str(v)+'\n') for k,v in adict.items()]
But if I was writing the code, I'd use a for loop rather than a comprehension.
But for penis length competitions, we'll use the latter.
Bryan
Lisp vs Python comparison (Score:4, Informative)
(http://www.plone.org/ | Last Journal: Monday January 05 2004, @04:45PM)
Python? (Score:5, Informative)
Open source, expressive (very short code can achieve a lot), readable (very short expressive code is easily groked -- fewer bugs), no direct pointer manipulation (safe -- fewer bugs), integrates nicely with other languages, runs on a variety of platforms, very easy to learn.
I, too would recommend learning python. It is a very good, language. Zeolotry is another thing though. Keep your mind open. Learn all the languages you can. This book, I can't comment, although I received it a week ago I haven't gotten around to reading it yet.
Re:Python? (Score:5, Interesting)
(http://honeypot.net/ | Last Journal: Thursday November 15, @11:49AM)
The importance and utility of this can't be overstated. Python absolutely rocks as a rapid development environment. I have not personally experienced a language that lets me go from concept to implementation nearly so quickly. Once an application is up and running, Python provides a great toolset for profiling your project and making it easy to replace performance-critical sections with the low-level language of your choice.
Does your crypto application need a faster random generator? Replace parts of that module with C. The rest of your project still gets the benefits of a strongly typed, object-oriented language with a robust library of string manipulation, pattern matching, and GUI interfacing functions.
It really is a project manager's dream come true. Python has replaced Perl as my language of choice for all new development.
1st edition (Score:4, Informative)
(http://metricnut.com/)
Maybe its just me though.
Re:1st edition = PAPERWEIGHT (Score:4, Interesting)
Anyway. I immediately ran off to the nearest bookstore and grabbed the first edition of the book. I read it once through and it--along with a lot of googling--helped me understand what I was doing, but once I had gone through it once I couldn't use it to recall the details of what I had been taught. If I wanted to look up something that I knew I had learned *from the book* I would have to look it up *on the web* (e.g. syntax or the required parameters of a function) because the index was useless. I never found anything I needed from that book once I did the initial once-through reading.
Though let's not gloss over the fact that I obviously learned python fairly well from this book because I did get the job! So sure, if you need to learn the language, the first edition did the job, but you'd better buy a *real* python book while you're there at the bookstore because as soon as you were done with Learning... it was nothing more than a paperweight.
on par with TCL except for C (Score:3, Interesting)
(http://cafepress.com/phototravel?pid=5934485)
While TCL remains my personal favorite, Python is really good, except for the creating-your-own-extensions part. The Python's C API needs a lot of catching up to do to match the excellence of TCL's.
Re:on par with TCL except for C (Score:4, Informative)
It uses C++ and lots of template mojo, but you don't really need to understand all that to use it.
Python is amazing (Score:5, Informative)
(http://arvindn.livejournal.com/ | Last Journal: Monday June 16 2003, @12:39AM)
This is not a religious argument; I'm not advocating that python is the one language you should use or anything like that. In fact, not having an "ideology" is one of python's major strengths.
If you're asking "why python [linuxjournal.com]", ESR has said it better than I ever could.
I'm yet another of those who experienced extremely small turnaround times for python programs. It took me a week, working part time (I estimate about 30 hours) totally, to release 1.0 of gretools [ernet.in], starting from scratch. I had not written a single line of python code before that, mind you.
Why python is great:
Its not a religion. It doesn't force its style of thinking on you. Functional programming, excellent string manipulation tools, classes, inheritance, exceptions, polymorphism, operating system integration, they're all available. This is python's biggest advantage. Whichever background you're coming from, you can very quickly become effective at python.
Incredibly compact code. This is largely a consequence of the previous point. Apart from that it is dynamically typed, and has lots of other cool features. Like doing away with braces for delimiting blocks. People who know nothing about the language flame it for using indentation, but I have never found it confusing, and it makes the code smaller far more readable.
A user-friendly programming language! You aren't going to believe this until you've actually programmed in python. Its got this amazing property that if you can express a thought in constant space mentally, then you can code it in a constant number of lines, most of the time in a single line. In other words, the abstractions of the programming language match the "natural" abstractions of programmers very closely. After just a couple of days I got so used to this that I began to "predict" language features intuitively. At one point I just knew there had to be a language construct for something I was trying to do, and found that it was the reduce function.
Simple syntax. Python manages to have all these features while retaining a very simple syntax, perhaps even simpler than C. This is a big plus, because it gets out of the way and Does What You Mean.
Convinced? Get started now!
Re:Python is amazing (Score:5, Interesting)
(http://members.cox.net/bungi/)
I guess Perl is just traditionally what you do these things with. It's not necessarily better. Perl also doesn't support Windows directly like Python does - if you want Perl in Win32 you pretty much have to go with ActiveState whereas Python.org has a Win32 specific distribution. Then again, it's difficult to compete against CPAN's sheer size.
But anyway, it doesn't matter. We use what we want/like and it's cool that we have choices.
However, over the past year or so I've also been looking at Ruby. Not to get into a religious argument (as you say) over which language is better, but if you like Python you should take a look at Ruby. If you're a Windows user there's an installer [sourceforge.net] available, which comes with a full book (in CHM format) that can get you running in no time if you already know Python. As Perl and Python, Ruby has extensions and so on. I do like the OO features in Ruby a bit better than Python.
And least but not least, there's Lua. I wouldn't use Lua the same way I use Python, but Lua is a joy to embed, much more so than Python.
Ahhh, language wars. Cheers =)
Upgrade? (Score:2)
If there's anything I hate, it's these big, thick, 1000-page (or 500-odd page) books which tell me how to use the Help system in Appendix 42.
So, I'm always wary.
O'Reilly & Python (Score:3, Informative)
For experienced programmers (Score:5, Insightful)
Free Python Books (Score:5, Informative)
(http://itsbeenconfirmed.com/ | Last Journal: Sunday May 04 2003, @02:33AM)
Even if you do mind reading books on your computer screen, most of these books (actually I think all of them) are also available as physical printed books as well.
Thinking In Python [mindview.net] by Bruce Eckel
An Introduction to Python [network-theory.co.uk] by Guido van Rossum, and Fred L. Drake, Jr. (Editor)
How To Think Like a Computer Scientist: Learning with Python [greenteapress.com] by Allen Downey, Jeff Elkner and Chris Meyers
Dive Into Python: Python for Experienced Programmers [diveintopython.org] by Mark Pilgrim
Text Processing In Python [gnosis.cx] by David Mertz
Python Language Reference Manual [network-theory.co.uk] by Guido van Rossum
python runtime (Score:4, Insightful)
Re:python runtime (Score:4, Interesting)
Please don't confuse performance and size. Larger systems don't require bigger performance, performance is needed in tight inmost loops. And those you can implement in C while retaining the rest of the Python code.
doubtful (Score:1)
As for this book... I have the first edition and they're programming python book. I consider them both lousy and don't deserve the same names as the perl equivalent books in the same series. Other better books are available fortunately.
Test of a language (Score:5, Insightful)
def quicksort(list):
if len(list) > 1:
pivot = list[0]
left = [x for x in list if x < pivot]
right = [x for x in list if x > pivot]
pivot = [x for x in list if x == pivot]
return quicksort(left) + pivot + quicksort(right)
return list
I'd say this speaks for itself. Enjoy.
Silly trolling article writer. (Score:5, Informative)
A mention of the Psyco [sourceforge.net] Python runtime compiler is in order. It's simple to use as well - all you do is put this at the top of your entry script:All routines called are then compiled from bytecode on-the-fly into native x86 code. It's not quite as fast as C - but with Psyco you can easily get close, especially if you design your algorithms properly.
While I'm here, these are the Python packages that I find essential once I have the base installation [python.org] (which includes the IDLE IDE). I've used these packages under Windows, but most work on Linux as well:
You need a book? (Score:5, Funny)
(Last Journal: Tuesday December 02 2003, @06:03AM)
You need a book to learn Python?!??!!? My god, I'm an old C++ programmer, Python is like a gift from a god!
You just have to bang your head against the keyboard a couple of times and I bet you it compiles!
Python getting to big (Score:1)
Sadly, I think Python has grown to large recently. It has lost part of its cohesion because of this. The language has been getting fatter as fast as this book between editions (+60 % pages, I mean c'mon). It doesn't fit it my head like it used to.
What would be nice ... (Score:2)
(http://www.milksucks.com/ | Last Journal: Monday September 15 2003, @12:30PM)
Is a book review that wasn't for lavae [catb.org].
It's like going to the local bookstore and hoping for something more to buy than Learn VB in 24 Hours.
I would love to use Python (Score:5, Insightful)
That said I can't justify the switch. There are just too many good modules available in Perl (esp for the engineering work I do). When python has the bredth of packages that Perl does, and when they have a nicely organized way to access said modules, I'll be happy to switch.
My review (Score:2, Insightful)
However, they are absolutely spot on when comparing this to Perl or Tcl. Perl is powerful, but its code looks like assembler. Perl gurus tend to shrug when you point this out, usually saying they understand it, with the not-so-implicit suggestion that if you can't, it is your fault. But this leads to a real maintenance problem and a barrier to entry to others. The cleaner Python syntax can show coding intent far clearer. Plus, and more importantly, the object oriented nature of Python lets you scale up to much larger programs. This has always been a problem with scripting languages, all the way back to the various unix shell scripts and DOS bat files. Often, the most those ever gave you in terms of modular capabilities was the equivalent of subroutines. Which is strictly procedural and not OO.
By the way, there is a small contradiction between the above claim that Python is more understandable than Perl and the claim that it has an advantage over C++ or Java because it is not as verbose as those. Typically, in increasing amount of source code, you have Perl -> Python -> (C++,Java). If you think that Python is more understandable than Perl, then by that same logic, we could conclude that C++ or Java is more understandable than Python.
So if you are using Perl or Tcl and want something better, Python is a good choice. A good upgrade path.
But if you are currently using C or C++, with maybe X for graphics, or Java, then I suggest you stay with those. All three languages, with their graphics, give you a far richer toolset. Python would be a retrograde choice.
Re:My review (Score:4, Informative)
Important correction - Perl can look like assembler... but it doesn't have to. A Perl script can be as clean and readable as you want it to be. Ugly code is a result of lazy programmers, not the language itself.
And if I can learn it, so can you (Score:1)
(http://www.possum.in...scot/scot_index.html)
That didn't work with Java -- I couldn't even remember that long initialization thingy at the start from sitting to sitting. Freshing up C was to much of a problem, since I was never good enough for it to go subconscious and it takes forever to even say "Hallo World" -- and I have neither the time nor the problems that require such a low level language. Perl looked fun for a while, but two months later I couldn't figure out what I had been trying to do.
So at some point I found Python, and used Learning Python, First Edition as my introduction. If the Second Edition is even close, go for it. Beautiful language, very friendly people on the Tutor list, and if I'm forced to take a few weeks off from the keyboard, I can come right back and still be productive.
No, I will never be a real programmer, let alone a "Hacker", but I am able to get the computer to do the few simple things that I want it to do. Thanks to Guido van Rossum and his cast of thousands for a free, simple but powerful language that lets us mere mortals do just that.
Also available via Safari (Score:2)
(http://hircus.wordpress.com/ | Last Journal: Monday October 30 2006, @09:12AM)
They do have some O'Reilly books at English-language bookshops in Indonesia, but the mark-up is anywhere from 30%-50%.
Re:There's one major reason I choose Python over P (Score:2, Interesting)
(http://www.example.com/ | Last Journal: Tuesday October 15 2002, @12:42PM)
Re:There's one major reason I choose Python over P (Score:4, Interesting)
(http://del.icio.us/Abcd1234/)
OTOH, Perl as a language is unbelievably flexible and convenient to work with, but it's most definitely a more "hackish" language, in that it's grown more than it's been designed. As such, it's definitely more of a developer's language (ie, has many of the features which, while not necessarily incredibly elegant, are *really* convenient) than a theorist's language.
So, then, why pick one over the other? Frankly, in the end, I suspect it's just personal preference (or predjudice).
Re:There's one major reason I choose Python over P (Score:4, Informative)
(http://slashdot.org/ | Last Journal: Thursday October 31 2002, @01:54PM)
Re:Python and Perl... (Score:3, Funny)
(http://tomcopeland.blogs.com/)
> a real Unix professional can do with Python
> or Perl that he or she can't do with awk, sed,
> and grep.
Awk? Sed? Bah! There's nothing you can do in awk and sed that you can't do with plain, simple assembly language opcodes!
Re:There's one major reason I choose Python over P (Score:5, Informative)
Python doesn't have static typing; it has dynamic typing like Lisp, Ruby, Perl, etc. The difference between Python and Perl is that Perl has rather weak dynamic typing. For example, Perl tries to treat strings and numbers as the same type (resulting in the use of strange constructs such as the value "0 but true"). Python and most other dynamically typed languages have stronger typing, with distinctions between strings, integers, floats, etc.
Static typing means that each variable is only allowed to hold values of one type. Usually the variable types are manually declared (as in C or Java), but some languages (like Haskell, IIRC) can infer the types.
Re:There's one major reason I choose Python over P (Score:3, Funny)
(http://www.pdrap.org/ | Last Journal: Monday January 21 2002, @02:40PM)
Re:There's one major reason I choose Python over P (Score:5, Informative)
(http://supybot.sf.net/)
Strong typing is when your language will only allow appropriate operations to be performed on values of the appropriate type.
Weak typing is the opposite, where a language will implicitly convert between (possibly incompatible) types or will simply allow any operation to occur.
Static typing is when a language enforces its typesystem (whether it be strong or weak) at compile time.
Dynamic typing is the opposite, when a language enforces its typesystem at runtime.
Python is strongly, dynamically typed. If you try to perform an integer operation on a string, it will check this at runtime and raise an exception. It will not perform the operation.
Perl is weakly, dynamically typed. If you try to perform an integer operation on a string, it will implicitly convert that string to an integer (using 0 in the case of strings that aren't a valid representation of an integer). It does this at runtime.
Haskell is strongly, statically typed. If the compiler cannot prove that all your operations are performed on values of the appropriate type, it will not compile your program.
C is weakly, statically typed. It will implicitly convert beteween incompatible values (pointers and ints, for instance) but it will determine which implicit conversions will occur at compile time (as well as reject some other conversions or type errors).
Python is not in any way statically typed. Perhaps only moderators who actually know Python should get mod points on articles such as these (yes, I know that'd be impossible, but it'd ridiculous that the parent post got modded up to 5, interesting when it's blatantly and obviously wrong).
Jeremy
Re:Bad foundations. (Score:5, Informative)
Python's intellectual ancestor was the language ABC, not Perl or TCL. Python's object system is very clean and well thought out, not accreted into the language. New style classes are an elaboration of that, merging the concept of a type and a class.
I'm not sure which "aspects from Camel" fuck up the whole situation. You're one example about continuations and GC "occultism" doesn't really help. 99% of the wonderful Python applications out there have no need of such stuff, and if you did, maybe Stackless Python (a variant) might interest you.
Python has all the necessary features to build very robust and maintainable systems. It's library is excellent, and it's C API is extremely clean for both embedding and extending.
A valid criticism for *some* applications is that it's slower than C or C++. This should come as no surprise since Python is interpreted and highly dynamic. Fortunately, Python can easily be extended such that critical sections can be coded in C, although most applications won't need to bother. It's also an excellent prototyping language so that if you *did* want to rewrite it in a static language like C++, you'd have an excellent basis for it.
swallowing the flamebait (Score:5, Insightful)
No way in hell. Python tries its best to avoid perlisms, and TCL/Tk doesn't even come close. Python has a strongly typed object system with one namespace.
I don't think that we really have to discuss the problems of Perl's "object system"
Perls object system is a hack. Python object system fits like a glove. ISTR that Larry kinda "copied" the objsystem from Python (and not vice versa), but it didn't really fit perl.
or the shortcomings of TCL/TK.
Shortcomings of TCL/Tk have really nothing to do with the topic. Don't try to sneak TCL/Tk into this. This has got to be the clumsiest strawman argument I've seen in a while. Chewbacca lives on Endor?
The result can be seen when you try to program a caller frame instance-preserving continuation in Python.
What do you mean? Closures (or "nested scopes" as they are referred to in the language docs - look them up before whining) work as expected. Can you give an example of the thing you are talking about in a language you know (assuming you know one). Are talking about what Stackless Python is trying to do?
But when the project advances they suddenly notice that python doesn't provide all necessary features and a whole rewrite is in order.
You don't really need "features", you can use libraries to add "features" and the core language is flexible enough for pretty much any tasks.
Re:Bad foundations. (Score:5, Insightful)
Yeah, it's really sad how many large projects fail because they're implemented in a language that doesn't properly support continuations....
Wait a minute, I've been in the computer industry for decades, and other than myself, I could probably count on one hand the number of people I've met who even know what a continuation is. Other than as an amusing tool to utterly confuse any but the most advanced developers, continuations are probably only useful for coroutines, and coroutines are mostly useful for iterator generators, which recent versions of Python have generators nicely packaged in an easy-to-understand syntax (the yield statement).
Since few if any other popular languages give you even this much, it must be truly amazing that any software works at all.
Re:While we're on the subject of Python (Score:4, Interesting)
It's too easy to accidentally use do-while when you should have just used while. It actually makes the language less error-prone, because in those few cases where you do have an unconditional first pass, you are forced to structure the code differently and actually think about what you're doing.
You can always transform: do stmt while foo into stmt while foo stmt which isn't even longer (if stmt is actually many statements, it should be a function anyway). It's not worth introducing an abusable language construct just so you get to be lazy and not code a function when you should.
Re:Python and Perl... (Score:3, Insightful)
(http://www.linuxiso.org/)
Re:There's one major reason I choose Python over P (Score:2)
(http://www.perlworks.com/ | Last Journal: Monday January 06 2003, @05:06PM)
uh? Care to differentiate between lists and arrays? Or are you trying to spread a little FUD to make it sound more complicated then it is.
Explain how using and referencing extra dimensional data types (list and hashes) are different in Python.
Re:There's one major reason I choose Python over P (Score:2)
(Last Journal: Friday December 08 2006, @04:42PM)
There's one major reason I use scheme instead of silly languages like Python or Perl, lack of static typing. Scheme's type predicates are much more flexible.
Re:Still doesn't have a maintained, up-to-date (Score:3, Informative)