\section{Built-in Functions}
\label{built-in-funcs}

The Python interpreter has a number of functions built into it that
are always available.  They are listed here in alphabetical order.


\setindexsubitem{(built-in function)}

\begin{funcdesc}{__import__}{name\optional{, globals\optional{, locals\optional{, fromlist}}}}
This function is invoked by the \code{import} statement.  It
mainly exists so that you can replace it with another
function that has a compatible interface, in order to change the
semantics of the \code{import} statement.  For examples of why and
how you would do this, see the standard library modules \code{ni},
\code{ihooks} and \code{rexec}.  See also the built-in module
\code{imp}, which defines some useful operations out of which you can
build your own \code{__import__()} function.
\stindex{import}
\refstmodindex{ni}
\refstmodindex{ihooks}
\refstmodindex{rexec}
\refbimodindex{imp}

For example, the statement \code{import} \code{spam} results in the
following call:
\code{__import__('spam',} \code{globals(),} \code{locals(), [])};
the statement \code{from} \code{spam.ham import} \code{eggs} results
in \code{__import__('spam.ham',} \code{globals(),} \code{locals(),}
\code{['eggs'])}.
Note that even though \code{locals()} and \code{['eggs']} are passed
in as arguments, the \code{__import__()} function does not set the
local variable named \code{eggs}; this is done by subsequent code that
is generated for the import statement.  (In fact, the standard
implementation does not use its \var{locals} argument at all, and uses
its \var{globals} only to determine the package context of the
\code{import} statement.)

When the \var{name} variable is of the form \code{package.module},
normally, the top-level package (the name up till the first dot) is
returned, \emph{not} the module named by \var{name}.  However, when a
non-empty \var{fromlist} argument is given, the module named by
\var{name} is returned.  This is done for compatibility with the
bytecode generated for the different kinds of import statement; when
using \code{import spam.ham.eggs}, the top-level package \code{spam}
must be placed in the importing namespace, but when using \code{from
spam.ham import eggs}, the \code{spam.ham} subpackage must be used to
find the \code{eggs} variable.
\end{funcdesc}

\begin{funcdesc}{abs}{x}
  Return the absolute value of a number.  The argument may be a plain
  or long integer or a floating point number.  If the argument is a
  complex number, its magnitude is returned.
\end{funcdesc}

\begin{funcdesc}{apply}{function\, args\optional{, keywords}}
The \var{function} argument must be a callable object (a user-defined or
built-in function or method, or a class object) and the \var{args}
argument must be a tuple.  The \var{function} is called with
\var{args} as argument list; the number of arguments is the the length
of the tuple.  (This is different from just calling
\code{\var{func}(\var{args})}, since in that case there is always
exactly one argument.)
If the optional \var{keywords} argument is present, it must be a
dictionary whose keys are strings.  It specifies keyword arguments to
be added to the end of the the argument list.
\end{funcdesc}

\begin{funcdesc}{callable}{object}
Return true if the \var{object} argument appears callable, false if
not.  If this returns true, it is still possible that a call fails,
but if it is false, calling \var{object} will never succeed.  Note
that classes are callable (calling a class returns a new instance);
class instances are callable if they have an attribute \code{__call__}.
\end{funcdesc}

\begin{funcdesc}{chr}{i}
  Return a string of one character whose \ASCII{} code is the integer
  \var{i}, e.g., \code{chr(97)} returns the string \code{'a'}.  This is the
  inverse of \code{ord()}.  The argument must be in the range [0..255],
  inclusive.
\end{funcdesc}

\begin{funcdesc}{cmp}{x\, y}
  Compare the two objects \var{x} and \var{y} and return an integer
  according to the outcome.  The return value is negative if \code{\var{x}
  < \var{y}}, zero if \code{\var{x} == \var{y}} and strictly positive if
  \code{\var{x} > \var{y}}.
\end{funcdesc}

\begin{funcdesc}{coerce}{x\, y}
  Return a tuple consisting of the two numeric arguments converted to
  a common type, using the same rules as used by arithmetic
  operations.
\end{funcdesc}

\begin{funcdesc}{compile}{string\, filename\, kind}
  Compile the \var{string} into a code object.  Code objects can be
  executed by an \code{exec} statement or evaluated by a call to
  \code{eval()}.  The \var{filename} argument should
  give the file from which the code was read; pass e.g. \code{'<string>'}
  if it wasn't read from a file.  The \var{kind} argument specifies
  what kind of code must be compiled; it can be \code{'exec'} if
  \var{string} consists of a sequence of statements, \code{'eval'}
  if it consists of a single expression, or \code{'single'} if
  it consists of a single interactive statement (in the latter case,
  expression statements that evaluate to something else than
  \code{None} will printed).
\end{funcdesc}

\begin{funcdesc}{complex}{real\optional{, imag}}
  Create a complex number with the value \var{real} + \var{imag}*j.
  Each argument may be any numeric type (including complex).
  If \var{imag} is omitted, it defaults to zero and the function
  serves as a numeric conversion function like \code{int}, \code{long}
  and \code{float}.
\end{funcdesc}

\begin{funcdesc}{delattr}{object\, name}
  This is a relative of \code{setattr}.  The arguments are an
  object and a string.  The string must be the name
  of one of the object's attributes.  The function deletes
  the named attribute, provided the object allows it.  For example,
  \code{delattr(\var{x}, '\var{foobar}')} is equivalent to
  \code{del \var{x}.\var{foobar}}.
\end{funcdesc}

\begin{funcdesc}{dir}{}
  Without arguments, return the list of names in the current local
  symbol table.  With an argument, attempts to return a list of valid
  attribute for that object.  This information is gleaned from the
  object's \code{__dict__}, \code{__methods__} and \code{__members__}
  attributes, if defined.  The list is not necessarily complete; e.g.,
  for classes, attributes defined in base classes are not included,
  and for class instances, methods are not included.
  The resulting list is sorted alphabetically.  For example:

\begin{verbatim}
>>> import sys
>>> dir()
['sys']
>>> dir(sys)
['argv', 'exit', 'modules', 'path', 'stderr', 'stdin', 'stdout']
>>> 
\end{verbatim}
\end{funcdesc}

\begin{funcdesc}{divmod}{a\, b}
  Take two numbers as arguments and return a pair of numbers consisting
  of their quotient and remainder when using long division.  With mixed
  operand types, the rules for binary arithmetic operators apply.  For
  plain and long integers, the result is the same as
  \code{(\var{a} / \var{b}, \var{a} \%{} \var{b})}.
  For floating point numbers the result is the same as
  \code{(math.floor(\var{a} / \var{b}), \var{a} \%{} \var{b})}.
\end{funcdesc}

\begin{funcdesc}{eval}{expression\optional{\, globals\optional{\, locals}}}
  The arguments are a string and two optional dictionaries.  The
  \var{expression} argument is parsed and evaluated as a Python
  expression (technically speaking, a condition list) using the
  \var{globals} and \var{locals} dictionaries as global and local name
  space.  If the \var{locals} dictionary is omitted it defaults to
  the \var{globals} dictionary.  If both dictionaries are omitted, the
  expression is executed in the environment where \code{eval} is
  called.  The return value is the result of the evaluated expression.
  Syntax errors are reported as exceptions.  Example:

\begin{verbatim}
>>> x = 1
>>> print eval('x+1')
2
>>> 
\end{verbatim}
%
  This function can also be used to execute arbitrary code objects
  (e.g.\ created by \code{compile()}).  In this case pass a code
  object instead of a string.  The code object must have been compiled
  passing \code{'eval'} to the \var{kind} argument.

  Hints: dynamic execution of statements is supported by the
  \code{exec} statement.  Execution of statements from a file is
  supported by the \code{execfile()} function.  The \code{globals()}
  and \code{locals()} functions returns the current global and local
  dictionary, respectively, which may be useful
  to pass around for use by \code{eval()} or \code{execfile()}.

\end{funcdesc}

\begin{funcdesc}{execfile}{file\optional{\, globals\optional{\, locals}}}
  This function is similar to the
  \code{exec} statement, but parses a file instead of a string.  It is
  different from the \code{import} statement in that it does not use
  the module administration --- it reads the file unconditionally and
  does not create a new module.\footnote{It is used relatively rarely
  so does not warrant being made into a statement.}

  The arguments are a file name and two optional dictionaries.  The
  file is parsed and evaluated as a sequence of Python statements
  (similarly to a module) using the \var{globals} and \var{locals}
  dictionaries as global and local name space.  If the \var{locals}
  dictionary is omitted it defaults to the \var{globals} dictionary.
  If both dictionaries are omitted, the expression is executed in the
  environment where \code{execfile()} is called.  The return value is
  \code{None}.
\end{funcdesc}

\begin{funcdesc}{filter}{function\, list}
Construct a list from those elements of \var{list} for which
\var{function} returns true.  If \var{list} is a string or a tuple,
the result also has that type; otherwise it is always a list.  If
\var{function} is \code{None}, the identity function is assumed,
i.e.\ all elements of \var{list} that are false (zero or empty) are
removed.
\end{funcdesc}

\begin{funcdesc}{float}{x}
  Convert a string or a number to floating point.  If the argument is a
  string, it must contain a possibly singed decimal or floating point
  number, possibly embedded in whitespace;
  this behaves identical to \code{string.atof(\var{x})}.
  Otherwise, the argument may be a plain or
  long integer or a floating point number, and a floating point number
  with the same value (within Python's floating point precision) is
  returned.
\end{funcdesc}

\begin{funcdesc}{getattr}{object\, name}
  The arguments are an object and a string.  The string must be the
  name
  of one of the object's attributes.  The result is the value of that
  attribute.  For example, \code{getattr(\var{x}, '\var{foobar}')} is equivalent to
  \code{\var{x}.\var{foobar}}.
\end{funcdesc}

\begin{funcdesc}{globals}{}
Return a dictionary representing the current global symbol table.
This is always the dictionary of the current module (inside a
function or method, this is the module where it is defined, not the
module from which it is called).
\end{funcdesc}

\begin{funcdesc}{hasattr}{object\, name}
  The arguments are an object and a string.  The result is 1 if the
  string is the name of one of the object's attributes, 0 if not.
  (This is implemented by calling \code{getattr(object, name)} and
  seeing whether it raises an exception or not.)
\end{funcdesc}

\begin{funcdesc}{hash}{object}
  Return the hash value of the object (if it has one).  Hash values
  are integers.  They are used to quickly compare dictionary
  keys during a dictionary lookup.  Numeric values that compare equal
  have the same hash value (even if they are of different types, e.g.
  1 and 1.0).
\end{funcdesc}

\begin{funcdesc}{hex}{x}
  Convert an integer number (of any size) to a hexadecimal string.
  The result is a valid Python expression.  Note: this always yields
  an unsigned literal, e.g. on a 32-bit machine, \code{hex(-1)} yields
  \code{'0xffffffff'}.  When evaluated on a machine with the same
  word size, this literal is evaluated as -1; at a different word
  size, it may turn up as a large positive number or raise an
  \code{OverflowError} exception.
\end{funcdesc}

\begin{funcdesc}{id}{object}
  Return the `identity' of an object.  This is an integer which is
  guaranteed to be unique and constant for this object during its
  lifetime.  (Two objects whose lifetimes are disjunct may have the
  same id() value.)  (Implementation note: this is the address of the
  object.)
\end{funcdesc}

\begin{funcdesc}{input}{\optional{prompt}}
  Almost equivalent to \code{eval(raw_input(\var{prompt}))}.  Like
  \code{raw_input()}, the \var{prompt} argument is optional, and the
  \code{readline} module is used when loaded.  The difference
  is that a long input expression may be broken over multiple lines using
  the backslash convention.
\end{funcdesc}

\begin{funcdesc}{intern}{string}
  Enter \var{string} in the table of ``interned'' strings and return
  the interned string -- which is \var{string} itself or a copy.
  Interning strings is useful to gain a little performance on
  dictionary lookup -- if the keys in a dictionary are interned, and
  the lookup key is interned, the key comparisons (after hashing) can
  be done by a pointer compare instead of a string compare.  Normally,
  the names used in Python programs are automatically interned, and
  the dictionaries used to hold module, class or instance attributes
  have interned keys.  Interned strings are immortal (i.e. never get
  garbage collected).
\end{funcdesc}

\begin{funcdesc}{int}{x}
  Convert a string or number to a plain integer.  If the argument is a
  string, it must contain a possibly singed decimal number
  representable as a Python integer, possibly embedded in whitespace;
  this behaves identical to \code{string.atoi(\var{x})}.
  Otherwise, the argument may be a plain or
  long integer or a floating point number.  Conversion of floating
  point numbers to integers is defined by the C semantics; normally
  the conversion truncates towards zero.\footnote{This is ugly --- the
  language definition should require truncation towards zero.}
\end{funcdesc}

\begin{funcdesc}{isinstance}{object, class}
Return true if the \var{object} argument is an instance of the
\var{class} argument, or of a (direct or indirect) subclass thereof.
Also return true if \var{class} is a type object and \var{object} is
an object of that type.  If \var{object} is not a class instance or a
object of the given type, the function always returns false.  If
\var{class} is neither a class object nor a type object, a
\code{TypeError} exception is raised.
\end{funcdesc}

\begin{funcdesc}{issubclass}{class1, class2}
Return true if \var{class1} is a subclass (direct or indirect) of
\var{class2}.  A class is considered a subclass of itself.  If either
argument is not a class object, a \code{TypeError} exception is raised.
\end{funcdesc}

\begin{funcdesc}{len}{s}
  Return the length (the number of items) of an object.  The argument
  may be a sequence (string, tuple or list) or a mapping (dictionary).
\end{funcdesc}

\begin{funcdesc}{list}{sequence}
Return a list whose items are the same and in the same order as
\var{sequence}'s items.  If \var{sequence} is already a list,
a copy is made and returned, similar to \code{\var{sequence}[:]}.  
For instance, \code{list('abc')} returns
returns \code{['a', 'b', 'c']} and \code{list( (1, 2, 3) )} returns
\code{[1, 2, 3]}.
\end{funcdesc}

\begin{funcdesc}{locals}{}
Return a dictionary representing the current local symbol table.
Inside a function, modifying this dictionary does not always have the
desired effect.
\end{funcdesc}

\begin{funcdesc}{long}{x}
  Convert a string or number to a long integer.  If the argument is a
  string, it must contain a possibly singed decimal number of
  arbitrary size, possibly embedded in whitespace;
  this behaves identical to \code{string.atol(\var{x})}.
  Otherwise, the argument may be a plain or
  long integer or a floating point number, and a long integer with
  the same value is returned.    Conversion of floating
  point numbers to integers is defined by the C semantics;
  see the description of \code{int()}.
\end{funcdesc}

\begin{funcdesc}{map}{function\, list\, ...}
Apply \var{function} to every item of \var{list} and return a list
of the results.  If additional \var{list} arguments are passed, 
\var{function} must take that many arguments and is applied to
the items of all lists in parallel; if a list is shorter than another
it is assumed to be extended with \code{None} items.  If
\var{function} is \code{None}, the identity function is assumed; if
there are multiple list arguments, \code{map} returns a list
consisting of tuples containing the corresponding items from all lists
(i.e. a kind of transpose operation).  The \var{list} arguments may be
any kind of sequence; the result is always a list.
\end{funcdesc}

\begin{funcdesc}{max}{s}
  Return the largest item of a non-empty sequence (string, tuple or
  list).
\end{funcdesc}

\begin{funcdesc}{min}{s}
  Return the smallest item of a non-empty sequence (string, tuple or
  list).
\end{funcdesc}

\begin{funcdesc}{oct}{x}
  Convert an integer number (of any size) to an octal string.  The
  result is a valid Python expression.  Note: this always yields
  an unsigned literal, e.g. on a 32-bit machine, \code{oct(-1)} yields
  \code{'037777777777'}.  When evaluated on a machine with the same
  word size, this literal is evaluated as -1; at a different word
  size, it may turn up as a large positive number or raise an
  \code{OverflowError} exception.
\end{funcdesc}

\begin{funcdesc}{open}{filename\optional{\, mode\optional{\, bufsize}}}
  Return a new file object (described earlier under Built-in Types).
  The first two arguments are the same as for \code{stdio}'s
  \code{fopen()}: \var{filename} is the file name to be opened,
  \var{mode} indicates how the file is to be opened: \code{'r'} for
  reading, \code{'w'} for writing (truncating an existing file), and
  \code{'a'} opens it for appending (which on \emph{some} \UNIX{}
  systems means that \emph{all} writes append to the end of the file,
  regardless of the current seek position).
  Modes \code{'r+'}, \code{'w+'} and
  \code{'a+'} open the file for updating, provided the underlying
  \code{stdio} library understands this.  On systems that differentiate
  between binary and text files, \code{'b'} appended to the mode opens
  the file in binary mode.  If the file cannot be opened, \code{IOError}
  is raised.
If \var{mode} is omitted, it defaults to \code{'r'}.
The optional \var{bufsize} argument specifies the file's desired
buffer size: 0 means unbuffered, 1 means line buffered, any other
positive value means use a buffer of (approximately) that size.  A
negative \var{bufsize} means to use the system default, which is
usually line buffered for for tty devices and fully buffered for other
files.%
\footnote{Specifying a buffer size currently has no effect on systems
that don't have \code{setvbuf()}.  The interface to specify the buffer
size is not done using a method that calls \code{setvbuf()}, because
that may dump core when called after any I/O has been performed, and
there's no reliable way to determine whether this is the case.}
\end{funcdesc}

\begin{funcdesc}{ord}{c}
  Return the \ASCII{} value of a string of one character.  E.g.,
  \code{ord('a')} returns the integer \code{97}.  This is the inverse of
  \code{chr()}.
\end{funcdesc}

\begin{funcdesc}{pow}{x\, y\optional{\, z}}
  Return \var{x} to the power \var{y}; if \var{z} is present, return
  \var{x} to the power \var{y}, modulo \var{z} (computed more
  efficiently than \code{pow(\var{x}, \var{y}) \% \var{z}}).
  The arguments must have
  numeric types.  With mixed operand types, the rules for binary
  arithmetic operators apply.  The effective operand type is also the
  type of the result; if the result is not expressible in this type, the
  function raises an exception; e.g., \code{pow(2, -1)} or \code{pow(2,
  35000)} is not allowed.
\end{funcdesc}

\begin{funcdesc}{range}{\optional{start\,} stop\optional{\, step}}
  This is a versatile function to create lists containing arithmetic
  progressions.  It is most often used in \code{for} loops.  The
  arguments must be plain integers.  If the \var{step} argument is
  omitted, it defaults to \code{1}.  If the \var{start} argument is
  omitted, it defaults to \code{0}.  The full form returns a list of
  plain integers \code{[\var{start}, \var{start} + \var{step},
  \var{start} + 2 * \var{step}, \ldots]}.  If \var{step} is positive,
  the last element is the largest \code{\var{start} + \var{i} *
  \var{step}} less than \var{stop}; if \var{step} is negative, the last
  element is the largest \code{\var{start} + \var{i} * \var{step}}
  greater than \var{stop}.  \var{step} must not be zero (or else an
  exception is raised).  Example:

\begin{verbatim}
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1, 11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> range(0, 30, 5)
[0, 5, 10, 15, 20, 25]
>>> range(0, 10, 3)
[0, 3, 6, 9]
>>> range(0, -10, -1)
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> range(0)
[]
>>> range(1, 0)
[]
>>> 
\end{verbatim}
\end{funcdesc}

\begin{funcdesc}{raw_input}{\optional{prompt}}
  If the \var{prompt} argument is present, it is written to standard output
  without a trailing newline.  The function then reads a line from input,
  converts it to a string (stripping a trailing newline), and returns that.
  When \EOF{} is read, \code{EOFError} is raised. Example:

\begin{verbatim}
>>> s = raw_input('--> ')
--> Monty Python's Flying Circus
>>> s
"Monty Python's Flying Circus"
>>> 
\end{verbatim}

If the \code{readline} module was loaded, then
\code{raw_input()} will use it to provide elaborate
line editing and history features.
\end{funcdesc}

\begin{funcdesc}{reduce}{function\, list\optional{\, initializer}}
Apply the binary \var{function} to the items of \var{list} so as to
reduce the list to a single value.  E.g.,
\code{reduce(lambda x, y: x*y, \var{list}, 1)} returns the product of
the elements of \var{list}.  The optional \var{initializer} can be
thought of as being prepended to \var{list} so as to allow reduction
of an empty \var{list}.  The \var{list} arguments may be any kind of
sequence.
\end{funcdesc}

\begin{funcdesc}{reload}{module}
Re-parse and re-initialize an already imported \var{module}.  The
argument must be a module object, so it must have been successfully
imported before.  This is useful if you have edited the module source
file using an external editor and want to try out the new version
without leaving the Python interpreter.  The return value is the
module object (i.e.\ the same as the \var{module} argument).

There are a number of caveats:

If a module is syntactically correct but its initialization fails, the
first \code{import} statement for it does not bind its name locally,
but does store a (partially initialized) module object in
\code{sys.modules}.  To reload the module you must first
\code{import} it again (this will bind the name to the partially
initialized module object) before you can \code{reload()} it.

When a module is reloaded, its dictionary (containing the module's
global variables) is retained.  Redefinitions of names will override
the old definitions, so this is generally not a problem.  If the new
version of a module does not define a name that was defined by the old
version, the old definition remains.  This feature can be used to the
module's advantage if it maintains a global table or cache of objects
--- with a \code{try} statement it can test for the table's presence
and skip its initialization if desired.

It is legal though generally not very useful to reload built-in or
dynamically loaded modules, except for \code{sys}, \code{__main__} and
\code{__builtin__}.  In certain cases, however, extension modules are
not designed to be initialized more than once, and may fail in
arbitrary ways when reloaded.

If a module imports objects from another module using \code{from}
\ldots{} \code{import} \ldots{}, calling \code{reload()} for the other
module does not redefine the objects imported from it --- one way
around this is to re-execute the \code{from} statement, another is to
use \code{import} and qualified names (\var{module}.\var{name})
instead.

If a module instantiates instances of a class, reloading the module
that defines the class does not affect the method definitions of the
instances --- they continue to use the old class definition.  The same
is true for derived classes.
\end{funcdesc}

\begin{funcdesc}{repr}{object}
Return a string containing a printable representation of an object.
This is the same value yielded by conversions (reverse quotes).
It is sometimes useful to be able to access this operation as an
ordinary function.  For many types, this function makes an attempt
to return a string that would yield an object with the same value
when passed to \code{eval()}.
\end{funcdesc}

\begin{funcdesc}{round}{x\, n}
  Return the floating point value \var{x} rounded to \var{n} digits
  after the decimal point.  If \var{n} is omitted, it defaults to zero.
  The result is a floating point number.  Values are rounded to the
  closest multiple of 10 to the power minus \var{n}; if two multiples
  are equally close, rounding is done away from 0 (so e.g.
  \code{round(0.5)} is \code{1.0} and \code{round(-0.5)} is \code{-1.0}).
\end{funcdesc}

\begin{funcdesc}{setattr}{object\, name\, value}
  This is the counterpart of \code{getattr}.  The arguments are an
  object, a string and an arbitrary value.  The string must be the name
  of one of the object's attributes.  The function assigns the value to
  the attribute, provided the object allows it.  For example,
  \code{setattr(\var{x}, '\var{foobar}', 123)} is equivalent to
  \code{\var{x}.\var{foobar} = 123}.
\end{funcdesc}

\begin{funcdesc}{slice}{\optional{start\,} stop\optional{\, step}}
Return a slice object representing the set of indices specified by
\code{range(\var{start}, \var{stop}, \var{step})}.  The \var{start}
and \var{step} arguments default to None.  Slice objects have
read-only data attributes \code{start}, \code{stop} and \code{step}
which merely return the argument values (or their default).  They have
no other explicit functionality; however they are used by Numerical
Python and other third party extensions.  Slice objects are also
generated when extended indexing syntax is used, e.g. for
\code{a[start:stop:step]} or \code{a[start:stop, i]}.
\end{funcdesc}

\begin{funcdesc}{str}{object}
Return a string containing a nicely printable representation of an
object.  For strings, this returns the string itself.  The difference
with \code{repr(\var{object})} is that \code{str(\var{object})} does not
always attempt to return a string that is acceptable to \code{eval()};
its goal is to return a printable string.
\end{funcdesc}

\begin{funcdesc}{tuple}{sequence}
Return a tuple whose items are the same and in the same order as
\var{sequence}'s items.  If \var{sequence} is already a tuple, it
is returned unchanged.  For instance, \code{tuple('abc')} returns
returns \code{('a', 'b', 'c')} and \code{tuple([1, 2, 3])} returns
\code{(1, 2, 3)}.
\end{funcdesc}

\begin{funcdesc}{type}{object}
Return the type of an \var{object}.  The return value is a type
object.  The standard module \code{types} defines names for all
built-in types.
\refstmodindex{types}
\obindex{type}
For instance:

\begin{verbatim}
>>> import types
>>> if isinstance(x, types.StringType): print "It's a string"
\end{verbatim}
\end{funcdesc}

\begin{funcdesc}{vars}{\optional{object}}
Without arguments, return a dictionary corresponding to the current
local symbol table.  With a module, class or class instance object as
argument (or anything else that has a \code{__dict__} attribute),
returns a dictionary corresponding to the object's symbol table.
The returned dictionary should not be modified: the effects on the
corresponding symbol table are undefined.%
\footnote{In the current implementation, local variable bindings
cannot normally be affected this way, but variables retrieved from
other scopes (e.g. modules) can be.  This may change.}
\end{funcdesc}

\begin{funcdesc}{xrange}{\optional{start\,} stop\optional{\, step}}
This function is very similar to \code{range()}, but returns an
``xrange object'' instead of a list.  This is an opaque sequence type
which yields the same values as the corresponding list, without
actually storing them all simultaneously.  The advantage of
\code{xrange()} over \code{range()} is minimal (since \code{xrange()}
still has to create the values when asked for them) except when a very
large range is used on a memory-starved machine (e.g. MS-DOS) or when all
of the range's elements are never used (e.g. when the loop is usually
terminated with \code{break}).
\end{funcdesc}
