|
It has also been called an agile programming language[?] [1] (http://www.pycs.net/altis/2003/04/04.html).
Popularized explicitly in contrast to Perl, Python has many similarities to that language. However, Python's designers reject Perl's exuberant syntax in favor of a more spare, less cluttered one. As with Perl, Python's developers have expressly forwarded a particular "culture" or ideology of what they want their language to be -- favoring language forms they see as "beautiful", "explicit", and "simple". [2] (http://python.org/dev/culture.html)
Though -- again as with Perl -- Python is sometimes classed as a "scripting language", it has been used to develop many large software projects such as the Zope application server and the Mnet[?] file sharing system.
It supports the usual panoply of string operations, with one exception: strings in Python are immutable objects, so any string operation that might elsewhere alter a string (such as a substitution of characters) will instead return a new string.
Python values, not variables, carry type -- meaning that Python is a dynamically typed language, like Lisp and unlike Java or C. All values are passed by reference.
Among dynamically typed languages, Python is moderately type-checked. It is neither as loose as Perl nor as strict as Caml. Implicit conversion is defined for numeric types, so one may validly multiply a complex number by a long integer (for instance) without explicit casting. However, there is no implicit conversion between (e.g.) numbers and strings; unlike in Perl, a number is an invalid argument to a string operation.
The purpose for all this immutability comes in with dictionaries, a type known elsewhere as hashes, associative arrays, or maps. To preserve consistency under pass-by-reference, the keys of a dictionary must be of immutable type. Dictionary values, on the other hand, may be of any type.
The language supports extensive introspection of types and classes. Types can be read and compared -- indeed, as in Smalltalk, types are a type. The attributes of an object can be extracted as a dictionary.
Operators can be overloaded in Python by defining special member functions -- for instance, defining __add__
on a class permits one to use the +
operator on members of that class. (Compare C++'s operator+
and similar method names.)
For instance, Python has only two structured loop forms -- for
, which loops over elements of a list or iterator (like Perl foreach
); and while
, which loops as long as a Boolean expression is true. It thus lacks C-style complex for
, a do
...while
, and Perl's until
, though of course equivalents can be expressed. Likewise, it has only if
...elif
...else
for branching -- no switch
or labeled goto
.
In languages that use the block structure ultimately derived from Algol -- languages including Pascal, C, and Perl -- blocks of code are set off with braces or keywords. (C and Perl use { }
; Pascal uses begin
and end
.) In all these languages, however, programmers conventionally indent the code within a block, to set it off visually from the surrounding code.
Python, instead, borrows a feature from the lesser-known language Occam -- instead of punctuation or keywords, it uses this indentation itself to indicate the run of a block. A brief example will make this clear. Here are C and Python functions which do the same thing -- computing the factorial of an integer:
Factorial function in C:
int factorial(int x) { if (x == 0) { return(1); } else { return(x * factorial(x-1)); } }
Factorial function in Python:
def factorial(x): if x == 0: return 1 else: return x * factorial(x-1)
Some programmers used to Algol-style languages, in which whitespace is semantically empty, at first find this confusing. A few have drawn unflattering comparison to the column-oriented style used on punched-card Fortran systems: once, it was a major development to have "free-form" languages in which only symbols mattered and not their position on the line.
To Python programmers, however, "the whitespace thing" is simply an extrapolation of a convention that programmers in Algol-style languages already follow anyway.
numbers = [1, 2, 3, 4, 5] powers_of_two = [ 2 ** n for n in numbers ]
Because Python permits functions as arguments, it is also possible to express more subtle functional constructs, such as the continuation (http://www.ps.uni-sb.de/~duchier/python/continuations.html).
Python's lambda keyword may misdirect some functional-programming fans. Python lambda blocks may contain only expressions, not statements. Thus, they are not the most general way to return a function. Instead, the usual thing to do is to just define and return a function using a locally scoped name, as in the following example of a simple curried function:
def add_and_print_maker(x): def temp(y): print "%d + %d = %d" % (x, y, x+y) return temp
Exceptions permit more concise and reliable error checking than many other ways of reporting erroneous or exceptional events. Exceptions are thread-safe; they tend not to clutter up code in the way that testing for returned error codes does in C; and they can easily propagate up the calling stack when an error must be reported to a higher level of the program.
Python style calls for the use of exceptions whenever an error condition might arise. Indeed, rather than testing for access to a file or resource before actually using it, it is conventional in Python to just go ahead and try to use it -- catching the exception if access is rejected.
The standard library is one of Python's greatest strengths. The bulk of it is cross-platform compatible, meaning that even heavily leveraged Python programs can often run on Unix, Windows, Macintosh, and other platforms without change.
Python also includes a unit testing framework for creating exhaustive test suites. While static-typing aficionados see this as a replacement for a static type-checking system, Python programmers largely do not share this view.
wikipedia.org dumped 2003-03-17 with terodump