八、Python的函数编程(之二)
2013-10-08 17:23
441 查看
八、Python的函数编程(之二)
----From a high school
student's view to learn Python
关键字:
python 高中生学编程 MIT公开课视频
Python函数编程 递归 递归函数 递归调用
四、Python’s Built-in
Functions
Python包含了很多内置的函数:
int()、float()、len()、type()、range()、print()、input()、abs()、str()、tuple()
在Python.org上有详细的描述
但在开头列的那几个函数,使用度非常高,应该仔细掌握,主要从以下几个方面进行了解:
函数的作用是什么?
函数的参数是什么类型、缺省参数是什么?
函数的返回值是什么类型?
dir([object])
Without arguments, return the
list of names in the current local scope. With an argument, attempt
to return a list of valid attributes for that object.
If the object has a method
named __dir__(),
this method will be called and must return the list of attributes.
This allows objects that implement a
custom __getattr__() or __getattribute__() function
to customize the way dir() reports
their attributes.
If the object does not
provide __dir__(),
the function tries its best to gather information from the
object’s __dict__ attribute,
if defined, and from its type object. The resulting list is not
necessarily complete, and may be inaccurate when the object has a
custom __getattr__().
The
default dir() mechanism
behaves differently with different types of objects, as it attempts
to produce the most relevant, rather than complete,
information:
If the object is a module
object, the list contains the names of the module’s
attributes.
If the object is a type or
class object, the list contains the names of its attributes, and
recursively of the attributes of its bases.
Otherwise, the list contains
the object’s attributes’ names, the names of its class’s
attributes, and recursively of the attributes of its class’s base
classes.
The resulting list is sorted
alphabetically. For example:
>>>
>>>
import struct
>>>
dir()
#
show the names in the module namespace
['__builtins__', '__doc__',
'__name__', 'struct']
>>>
dir(struct)
#
show the names in the struct module
['Struct', '__builtins__',
'__doc__', '__file__', '__name__',
'__package__', '_clearcache',
'calcsize', 'error', 'pack', 'pack_into',
'unpack',
'unpack_from']
>>>
class Shape(object):
def
__dir__(self):
return ['area', 'perimeter',
'location']
>>>
s = Shape()
>>>
dir(s)
['area', 'perimeter',
'location']
Note
Because dir() is
supplied primarily as a convenience for use at an interactive
prompt, it tries to supply an interesting set of names more than it
tries to supply a rigorously or consistently defined set of names,
and its detailed behavior may change across releases. For example,
metaclass attributes are not in the result list when the argument
is a class.
这是在一本书上找的两个练习:
1. dir()内建函数
启动
Python 交互式解释器, 通过直接键入 dir() 回车以执行 dir() 内建函数。你看到 什么? 显示你看到的每一个列表元素的值,记下实际值和你想像的值
你会问, dir() 函数是干什么的?我们已经知道在 dir 后边加上一对括号可以执行 dir() 内建函数, 如果不加括号会如何?
试一试。
解释器返回给你什么信息? 你认为这个信息表
示什么意思 ?
type() 内建函数接收任意的 Python
对象做为参数并返回他们的类型。 在解释器中键
入 type(dir),
看看你得到的是什
本练习的最后一部分,
我们来瞧一瞧 Python 的文档字符串。 通过
dir.__doc__
可以访问
dir() 内建函数的文档字符串。print
dir.__doc__可以显示这个字符串的内容。 许多内建 函数,方法,模块及模块属性都有相应的文档字符串。我们希望你在你的代码中也要书写文档 字符串, 它会对使用这些代码的人提供及时方便的帮助。
2. 利用 dir() 找出 sys
模块中更多的东西。
启动Python交互解释器, 执行dir()函数,然后键入 import sys 以导入 sys 模块。 再次执行 dir() 函数以确认
sys 模块被正确的导入。 然后执行 dir(sys) , 你就可以看到 sys
模块的所有属性了。
显示 sys 模块的版本号属性及平台变量。记住在属性名前一定要加 sys. ,这表示这个属性是 sys 模块的。其中 version 变量保存着你使用的 Python 解释器版本, platform 属性则包含你运行 Python 时使用的计算机平台信息。
最后, 调用 sys.exit() 函数。 这是一种热键之外的另一种退出
Python 解释器的方式。
五、常用内建函数的使用
我们先从一些实际的例子着手:
how do you convert values to
strings? Luckily, Python has ways to convert any value to a string:
pass it to the repr() or str() functions.
The str() function is meant to
return representations of values which are fairly human-readable,
while repr() is meant to generate representations which can be read
by the interpreter (or will force a SyntaxError if there is not
equivalent syntax). For objects which don’t have a particular
representation for human consumption, str() will return the same
value as repr(). Many values, such as numbers or structures like
lists and dictionaries, have the same representation using either
function. Strings and floating point numbers, in particular, have
two distinct representations.
Here are two ways to write a
table of squares and cubes:
>>>
for x in range(1, 11):
...
print repr(x).rjust(2),
repr(x*x).rjust(3),
...
# Note trailing comma on previous
line
...
print repr(x*x*x).rjust(4)
...
1
1
1
2
4
8
3
9 27
4 16
64
5
25 125
6
36 216
7
49 343
8
64 512
9
81 729
10 100 1000
>>>
for x in range(1,11):
...
print '{0:2d} {1:3d} {2:4d}'.format(x, x*x,
x*x*x)
...
1
1
1
2
4
8
3
9 27
4 16
64
5
25 125
6
36 216
7
49 343
8
64 512
9
81 729
10 100 1000
使用print进行格式化的结果输出,注意print、range等函数的使用
常用函数:
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.
all(iterable)
Return True if all elements of
the iterable are true (or if the iterable is empty). Equivalent
to:
def all(iterable):
for element in iterable:
if not
element:
return False
return True
any(iterable)
Return True if any element of
the iterable is true. If the iterable is empty, return False.
Equivalent to:
def any(iterable):
for element in iterable:
if
element:
return True
return False
New in version 2.5.
bin(x)
Convert an integer number to a
binary string. The result is a valid Python expression. If x is not
a Python int object, it has to define an __index__() method that
returns an integer.
New in version 2.6.
bool([x])
Convert a value to a Boolean,
using the standard truth testing procedure. If x is false or
omitted, this returns False; otherwise it returns True. bool is
also a class, which is a subclass of int. Class bool cannot be
subclassed further. Its only instances are False and
True.
New in version
2.2.1.
Changed in version 2.3: If no
argument is given, this function returns False.
cmp(x, y)
Compare the two objects x and y
and return an integer according to the outcome. The return value is
negative if x < y, zero if x == y and strictly
positive if x > y.
complex([real[,
imag]])
Create a complex number with
the value real + imag*j or convert a string or number to a complex
number. If the first parameter is a string, it will be interpreted
as a complex number and the function must be called without a
second parameter. The second parameter can never be a string. Each
argument may be any numeric type (including complex). If imag is
omitted, it defaults to zero and the function serves as a numeric
conversion function like int(), long() and float(). If both
arguments are omitted, returns 0j.
The complex type is described
in Numeric Types — int, float, long, complex.
dir([object])
Without arguments, return the
list of names in the current local scope. With an argument, attempt
to return a list of valid attributes for that object.
If the object has a method
named __dir__(), this method will be called and must return the
list of attributes. This allows objects that implement a custom
__getattr__() or __getattribute__() function to customize the way
dir() reports their attributes.
If the object does not provide
__dir__(), the function tries its best to gather information from
the object’s __dict__ attribute, if defined, and from its type
object. The resulting list is not necessarily complete, and may be
inaccurate when the object has a custom __getattr__().
The default dir() mechanism
behaves differently with different types of objects, as it attempts
to produce the most relevant, rather than complete,
information:
If the object is a module
object, the list contains the names of the module’s
attributes.
If the object is a type or
class object, the list contains the names of its attributes, and
recursively of the attributes of its bases.
Otherwise, the list contains
the object’s attributes’ names, the names of its class’s
attributes, and recursively of the attributes of its class’s base
classes.
The resulting list is sorted
alphabetically. For example:
>>>
import struct
>>>
dir() # doctest: +SKIP
['__builtins__', '__doc__',
'__name__', 'struct']
>>>
dir(struct) # doctest:
+NORMALIZE_WHITESPACE
['Struct', '__builtins__',
'__doc__', '__file__', '__name__',
'__package__',
'_clearcache', 'calcsize', 'error', 'pack', 'pack_into',
'unpack',
'unpack_from']
>>>
class Foo(object):
...
def __dir__(self):
...
return
["kan", "ga", "roo"]
...
>>>
f = Foo()
>>>
dir(f)
['ga', 'kan', 'roo']
Note Because dir() is supplied
primarily as a convenience for use at an interactive prompt, it
tries to supply an interesting set of names more than it tries to
supply a rigorously or consistently defined set of names, and its
detailed behavior may change across releases. For example,
metaclass attributes are not in the result list when the argument
is a class.
divmod(a, b)
Take two (non complex) 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 (a // b, a % b). For
floating point numbers the result is (q, a % b), where q is usually
math.floor(a / b) but may be 1 less than that. In any case q * b +
a % b is very close to a, if a % b is non-zero it has the same sign
as b, and 0 <= abs(a % b) <
abs(b).
Changed in version 2.3: Using
divmod() with complex numbers is deprecated.
enumerate(sequence[,
start=0])
Return an enumerate object.
sequence must be a sequence, an iterator, or some other object
which supports iteration. The next() method of the iterator
returned by enumerate() returns a tuple containing a count (from
start which defaults to 0) and the corresponding value obtained
from iterating over iterable. enumerate() is useful for obtaining
an indexed series: (0, seq[0]), (1, seq[1]), (2, seq[2]), .... For
example:
>>>
for i, season in enumerate(['Spring', 'Summer', 'Fall',
'Winter']):
...
print i, season
0 Spring
1 Summer
2 Fall
3 Winter
New in version 2.3.
New in version 2.6: The start
parameter.
float([x])
Convert a string or a number to
floating point. If the argument is a string, it must contain a
possibly signed decimal or floating point number, possibly embedded
in whitespace. The argument may also be [+|-]nan or [+|-]inf.
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. If no
argument is given, returns 0.0.
Note When passing in a string,
values for NaN and Infinity may be returned, depending on the
underlying C library. Float accepts the strings nan, inf and -inf
for NaN and positive or negative infinity. The case and a leading +
are ignored as well as a leading - is ignored for NaN. Float always
represents NaN and infinity as nan, inf or -inf.
The float type is described in
Numeric Types — int, float, long, complex.
help([object])
Invoke the built-in help
system. (This function is intended for interactive use.) If no
argument is given, the interactive help system starts on the
interpreter console. If the argument is a string, then the string
is looked up as the name of a module, function, class, method,
keyword, or documentation topic, and a help page is printed on the
console. If the argument is any other kind of object, a help page
on the object is generated.
This function is added to the
built-in namespace by the site module.
New in version 2.2.
hex(x)
Convert an integer number (of
any size) to a hexadecimal string. The result is a valid Python
expression.
Note To obtain a hexadecimal
string representation for a float, use the float.hex()
method.
Changed in version 2.4:
Formerly only returned an unsigned literal.
int([x[,
base]])
Convert a string or number to a
plain integer. If the argument is a string, it must contain a
possibly signed decimal number representable as a Python integer,
possibly embedded in whitespace. The base parameter gives the base
for the conversion (which is 10 by default) and may be any integer
in the range [2, 36], or zero. If base is zero, the proper radix is
determined based on the contents of string; the interpretation is
the same as for integer literals. (See Numeric literals.) If base
is specified and x is not a string, TypeError is raised. Otherwise,
the argument may be a plain or long integer or a floating point
number. Conversion of floating point numbers to integers truncates
(towards zero). If the argument is outside the integer range a long
object will be returned instead. If no arguments are given, returns
0.
The integer type is described
in Numeric Types — int, float, long, complex.
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).
list([iterable])
Return a list whose items are
the same and in the same order as iterable‘s items. iterable may be
either a sequence, a container that supports iteration, or an
iterator object. If iterable is already a list, a copy is made and
returned, similar to iterable[:]. For instance, list('abc') returns
['a', 'b', 'c'] and list( (1, 2, 3) ) returns [1, 2, 3]. If no
argument is given, returns a new empty list, [].
list is a mutable sequence
type, as documented in Sequence Types — str, unicode, list, tuple,
buffer, xrange. For other containers see the built in dict, set,
and tuple classes, and the collections module.
max(iterable[, args...][,
key])
With a single argument
iterable, return the largest item of a non-empty iterable (such as
a string, tuple or list). With more than one argument, return the
largest of the arguments.
The optional key argument
specifies a one-argument ordering function like that used for
list.sort(). The key argument, if supplied, must be in keyword form
(for example, max(a,b,c,key=func)).
Changed in version 2.5: Added
support for the optional key argument.
min(iterable[, args...][,
key])
With a single argument
iterable, return the smallest item of a non-empty iterable (such as
a string, tuple or list). With more than one argument, return the
smallest of the arguments.
The optional key argument
specifies a one-argument ordering function like that used for
list.sort(). The key argument, if supplied, must be in keyword form
(for example, min(a,b,c,key=func)).
Changed in version 2.5: Added
support for the optional key argument.
oct(x)
Convert an integer number (of
any size) to an octal string. The result is a valid Python
expression.
Changed in version 2.4:
Formerly only returned an unsigned literal.
print([object, ...][, sep='
'][, end='\n'][, file=sys.stdout])
Print object(s) to the stream
file, separated by sep and followed by end. sep, end and file, if
present, must be given as keyword arguments.
All non-keyword arguments are
converted to strings like str() does and written to the stream,
separated by sep and followed by end. Both sep and end must be
strings; they can also be None, which means to use the default
values. If no object is given, print() will just write
end.
The file argument must be an
object with a write(string) method; if it is not present or None,
sys.stdout will be used.
Note This function is not
normally available as a built-in since the name print is recognized
as the print statement. To disable the statement and use the
print() function, use this future statement at the top of your
module:
from __future__ import
print_function
New in version 2.6.
range([start], stop[,
step])
This is a versatile function to
create lists containing arithmetic progressions. It is most often
used in for loops. The arguments must be plain integers. If the
step argument is omitted, it defaults to 1. If the start argument
is omitted, it defaults to 0. The full form returns a list of plain
integers [start, start + step, start + 2 * step, ...]. If step is
positive, the last element is the largest start + i * step less
than stop; if step is negative, the last element is the smallest
start + i * step greater than stop. step must not be zero (or else
ValueError is raised). Example:
>>>
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)
[]
raw_input([prompt])
If the 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, EOFError is raised. Example:
>>>
s = raw_input('--> ')
--> Monty
Python's Flying Circus
>>>
s
"Monty Python's Flying
Circus"
If the readline module was
loaded, then raw_input() will use it to provide elaborate line
editing and history features.
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 eval_r(),
otherwise the representation is a string enclosed in angle brackets
that contains the name of the type of the object together with
additional information often including the name and address of the
object. A class can control what this function returns for its
instances by defining a __repr__() method.
reversed(seq)
Return a reverse iterator. seq
must be an object which has a __reversed__() method or supports the
sequence protocol (the __len__() method and the __getitem__()
method with integer arguments starting at 0).
New in version 2.4.
Changed in version 2.6: Added
the possibility to write a custom __reversed__() method.
round(x[, n])
Return the floating point value
x rounded to n digits after the decimal point. If 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 n; if two
multiples are equally close, rounding is done away from 0 (so. for
example, round(0.5) is 1.0 and round(-0.5) is -1.0).
sorted(iterable[, cmp[,
key[, reverse]]])
Return a new sorted list from
the items in iterable.
The optional arguments cmp,
key, and reverse have the same meaning as those for the list.sort()
method (described in section Mutable Sequence Types).
cmp specifies a custom
comparison function of two arguments (iterable elements) which
should return a negative, zero or positive number depending on
whether the first argument is considered smaller than, equal to, or
larger than the second argument: cmp=lambda x,y: cmp(x.lower(),
y.lower()). The default value is None.
key specifies a function of one
argument that is used to extract a comparison key from each list
element: key=str.lower. The default value is None.
reverse is a boolean value. If
set to True, then the list elements are sorted as if each
comparison were reversed.
In general, the key and reverse
conversion processes are much faster than specifying an equivalent
cmp function. This is because cmp is called multiple times for each
list element while key and reverse touch each element only once. To
convert an old-style cmp function to a key function, see the
CmpToKey recipe in the ASPN cookbook.
New in version 2.4.
str([object])
Return a string containing a
nicely printable representation of an object. For strings, this
returns the string itself. The difference with repr(object) is that
str(object) does not always attempt to return a string that is
acceptable to eval_r(); its goal is to return a printable string.
If no argument is given, returns the empty string, ''.
For more information on strings
see Sequence Types — str, unicode, list, tuple, buffer, xrange
which describes sequence functionality (strings are sequences), and
also the string-specific methods described in the String Methods
section. To output formatted strings use template strings or the %
operator described in the String Formatting Operations section. In
addition see the String Services section. See also
unicode().
sum(iterable[,
start])
Sums start and the items of an
iterable from left to right and returns the total. start defaults
to 0. The iterable‘s items are normally numbers, and are not
allowed to be strings. The fast, correct way to concatenate a
sequence of strings is by calling ''.join(sequence). Note that
sum(range(n), m) is equivalent to reduce(operator.add, range(n), m)
To add floating point values with extended precision, see
math.fsum().
New in version 2.3.
tuple([iterable])
Return a tuple whose items are
the same and in the same order as iterable‘s items. iterable may be
a sequence, a container that supports iteration, or an iterator
object. If iterable is already a tuple, it is returned unchanged.
For instance, tuple('abc') returns ('a', 'b', 'c') and tuple([1, 2,
3]) returns (1, 2, 3). If no argument is given, returns a new empty
tuple, ().
tuple is an immutable sequence
type, as documented in Sequence Types — str, unicode, list, tuple,
buffer, xrange. For other containers see the built in dict, list,
and set classes, and the collections module.
type(object)
Return the type of an object.
The return value is a type object. The isinstance() built-in
function is recommended for testing the type of an
object.
With three arguments, type()
functions as a constructor as detailed below.
xrange([start], stop[,
step])
This function is very similar
to 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 xrange() over range() is minimal
(since xrange() still has to create the values when asked for them)
except when a very large range is used on a memory-starved machine
or when all of the range’s elements are never used (such as when
the loop is usually terminated with break).
CPython implementation detail:
xrange() is intended to be simple and fast. Implementations may
impose restrictions to achieve this. The C implementation of Python
restricts all arguments to native C longs (“short” Python
integers), and also requires that the number of elements fit in a
native C long. If a larger range is needed, an alternate version
can be crafted using the itertools module: islice(count(start,
step), (stop-start+step-1)//step).
六、递归
------
如果函数包含了对其自身的调用,该函数就是递归的。如果一个新的调用能在相同过程中较早的调用结束之前开始,那么该过程就是递归的。
可以看一段MIT公开课视频:
递归广泛地应用于使用递归函数的数学应用中,类似数学归纳法。
拿阶乘函数的定义来说明:
N! == factorial(N) == 1 * 2 * 3
... * N
我们可以用这种方式来看阶乘:
factorial(N) = N!
= N * (N-1)!
= N * (N-1) * (N-2)!
…
= N * (N-1) * (N-2) ... * 3 * 2 * 1
我们现在可以看到阶乘是递归的,因为
factorial(N) = N*
factorial(N-1)
换句话说,为了获得 factorial(N)的值,需要计算
factorial(N-1),而且,为了找到 factorial(N-1),需要计算
factorial(N-2)等等。我们现在给出阶乘函数的递归版本。
>>>
def factorial(n):
...
if n==0 or n==1:
...
return 1
...
else:
...
return
n*factorial(n-1)
...
>>>
factorial(21)
51090942171709440000L
>>>
factorial(4)
24
>>>
factorial(1)
1
>>>
factorial(0)
1
特别强调:
递归函数必须有一个终止执行的条件,如我们的例子中,当n=0或者n=1时,会终止;否则,程序将进入一个无限循环的状态,俗称“死循环”
递归虽然使程序看起来非常的简单,但是递归程序如果递归的次数很大的话,将会严重的消耗计算机的内存,甚至可能导致系统的崩溃
下面给出一段视频,里面是以经典的递归问题:斐波那契数列作为例子进行讲解的,值得学习!
【插入视频】
我的更多文章:
Python程序调试的一些体会(2013-10-06 22:57:35)
十四、Python编程计算24点(之二)(2013-10-03 22:18:28)
十三、Python编程计算24点(之一)
(2013-10-02 22:15:46)
十二、Python简单数据结构应用(之二)(2013-10-02 22:10:41)
十一、Python简单数据结构应用(之一)(2013-09-23 23:31:49)
十、Python编程解决组合问题(之二)
(2013-09-21 23:37:27)
九、Python编程解决组合问题(之一)(2013-09-21 23:32:54)
七、Python的函数编程(之一)
(2013-09-20 23:09:10)
六、Python的程序流程(2013-09-19 16:53:58)
高中生如何学编程(2013-09-02 19:26:01)
----From a high school
student's view to learn Python
关键字:
python 高中生学编程 MIT公开课视频
Python函数编程 递归 递归函数 递归调用
四、Python’s Built-in
Functions
Python包含了很多内置的函数:
int()、float()、len()、type()、range()、print()、input()、abs()、str()、tuple()
在Python.org上有详细的描述
但在开头列的那几个函数,使用度非常高,应该仔细掌握,主要从以下几个方面进行了解:
函数的作用是什么?
函数的参数是什么类型、缺省参数是什么?
函数的返回值是什么类型?
dir([object])
Without arguments, return the
list of names in the current local scope. With an argument, attempt
to return a list of valid attributes for that object.
If the object has a method
named __dir__(),
this method will be called and must return the list of attributes.
This allows objects that implement a
custom __getattr__() or __getattribute__() function
to customize the way dir() reports
their attributes.
If the object does not
provide __dir__(),
the function tries its best to gather information from the
object’s __dict__ attribute,
if defined, and from its type object. The resulting list is not
necessarily complete, and may be inaccurate when the object has a
custom __getattr__().
The
default dir() mechanism
behaves differently with different types of objects, as it attempts
to produce the most relevant, rather than complete,
information:
If the object is a module
object, the list contains the names of the module’s
attributes.
If the object is a type or
class object, the list contains the names of its attributes, and
recursively of the attributes of its bases.
Otherwise, the list contains
the object’s attributes’ names, the names of its class’s
attributes, and recursively of the attributes of its class’s base
classes.
The resulting list is sorted
alphabetically. For example:
>>>
>>>
import struct
>>>
dir()
#
show the names in the module namespace
['__builtins__', '__doc__',
'__name__', 'struct']
>>>
dir(struct)
#
show the names in the struct module
['Struct', '__builtins__',
'__doc__', '__file__', '__name__',
'__package__', '_clearcache',
'calcsize', 'error', 'pack', 'pack_into',
'unpack',
'unpack_from']
>>>
class Shape(object):
def
__dir__(self):
return ['area', 'perimeter',
'location']
>>>
s = Shape()
>>>
dir(s)
['area', 'perimeter',
'location']
Note
Because dir() is
supplied primarily as a convenience for use at an interactive
prompt, it tries to supply an interesting set of names more than it
tries to supply a rigorously or consistently defined set of names,
and its detailed behavior may change across releases. For example,
metaclass attributes are not in the result list when the argument
is a class.
这是在一本书上找的两个练习:
1. dir()内建函数
启动
Python 交互式解释器, 通过直接键入 dir() 回车以执行 dir() 内建函数。你看到 什么? 显示你看到的每一个列表元素的值,记下实际值和你想像的值
你会问, dir() 函数是干什么的?我们已经知道在 dir 后边加上一对括号可以执行 dir() 内建函数, 如果不加括号会如何?
试一试。
解释器返回给你什么信息? 你认为这个信息表
示什么意思 ?
type() 内建函数接收任意的 Python
对象做为参数并返回他们的类型。 在解释器中键
入 type(dir),
看看你得到的是什
本练习的最后一部分,
我们来瞧一瞧 Python 的文档字符串。 通过
dir.__doc__
可以访问
dir() 内建函数的文档字符串。print
dir.__doc__可以显示这个字符串的内容。 许多内建 函数,方法,模块及模块属性都有相应的文档字符串。我们希望你在你的代码中也要书写文档 字符串, 它会对使用这些代码的人提供及时方便的帮助。
2. 利用 dir() 找出 sys
模块中更多的东西。
启动Python交互解释器, 执行dir()函数,然后键入 import sys 以导入 sys 模块。 再次执行 dir() 函数以确认
sys 模块被正确的导入。 然后执行 dir(sys) , 你就可以看到 sys
模块的所有属性了。
显示 sys 模块的版本号属性及平台变量。记住在属性名前一定要加 sys. ,这表示这个属性是 sys 模块的。其中 version 变量保存着你使用的 Python 解释器版本, platform 属性则包含你运行 Python 时使用的计算机平台信息。
最后, 调用 sys.exit() 函数。 这是一种热键之外的另一种退出
Python 解释器的方式。
五、常用内建函数的使用
我们先从一些实际的例子着手:
>>> s = 'Hello, world.' >>> str(s) 'Hello, world.' >>> repr(s) "'Hello, world.'" >>> str(0.1) '0.1' >>> repr(0.1) '0.10000000000000001' >>> x = 10 * 3.25 >>> y = 200 * 200 >>> s = 'The value of x is ' + repr(x) + ', and y is ' + repr(y) + '...' >>> print s The value of x is 32.5, and y is 40000... >>> # The repr() of a string adds string quotes and backslashes: ... hello = 'hello, world\n' >>> hellos = repr(hello) >>> print hellos 'hello, world\n' >>> # The argument to repr() may be any Python object: ... repr((x, y, ('spam', 'eggs'))) "(32.5, 40000, ('spam', 'eggs'))" |
strings? Luckily, Python has ways to convert any value to a string:
pass it to the repr() or str() functions.
The str() function is meant to
return representations of values which are fairly human-readable,
while repr() is meant to generate representations which can be read
by the interpreter (or will force a SyntaxError if there is not
equivalent syntax). For objects which don’t have a particular
representation for human consumption, str() will return the same
value as repr(). Many values, such as numbers or structures like
lists and dictionaries, have the same representation using either
function. Strings and floating point numbers, in particular, have
two distinct representations.
Here are two ways to write a
table of squares and cubes:
>>>
for x in range(1, 11):
...
print repr(x).rjust(2),
repr(x*x).rjust(3),
...
# Note trailing comma on previous
line
...
print repr(x*x*x).rjust(4)
...
1
1
1
2
4
8
3
9 27
4 16
64
5
25 125
6
36 216
7
49 343
8
64 512
9
81 729
10 100 1000
>>>
for x in range(1,11):
...
print '{0:2d} {1:3d} {2:4d}'.format(x, x*x,
x*x*x)
...
1
1
1
2
4
8
3
9 27
4 16
64
5
25 125
6
36 216
7
49 343
8
64 512
9
81 729
10 100 1000
使用print进行格式化的结果输出,注意print、range等函数的使用
常用函数:
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.
all(iterable)
Return True if all elements of
the iterable are true (or if the iterable is empty). Equivalent
to:
def all(iterable):
for element in iterable:
if not
element:
return False
return True
any(iterable)
Return True if any element of
the iterable is true. If the iterable is empty, return False.
Equivalent to:
def any(iterable):
for element in iterable:
if
element:
return True
return False
New in version 2.5.
bin(x)
Convert an integer number to a
binary string. The result is a valid Python expression. If x is not
a Python int object, it has to define an __index__() method that
returns an integer.
New in version 2.6.
bool([x])
Convert a value to a Boolean,
using the standard truth testing procedure. If x is false or
omitted, this returns False; otherwise it returns True. bool is
also a class, which is a subclass of int. Class bool cannot be
subclassed further. Its only instances are False and
True.
New in version
2.2.1.
Changed in version 2.3: If no
argument is given, this function returns False.
cmp(x, y)
Compare the two objects x and y
and return an integer according to the outcome. The return value is
negative if x < y, zero if x == y and strictly
positive if x > y.
complex([real[,
imag]])
Create a complex number with
the value real + imag*j or convert a string or number to a complex
number. If the first parameter is a string, it will be interpreted
as a complex number and the function must be called without a
second parameter. The second parameter can never be a string. Each
argument may be any numeric type (including complex). If imag is
omitted, it defaults to zero and the function serves as a numeric
conversion function like int(), long() and float(). If both
arguments are omitted, returns 0j.
The complex type is described
in Numeric Types — int, float, long, complex.
dir([object])
Without arguments, return the
list of names in the current local scope. With an argument, attempt
to return a list of valid attributes for that object.
If the object has a method
named __dir__(), this method will be called and must return the
list of attributes. This allows objects that implement a custom
__getattr__() or __getattribute__() function to customize the way
dir() reports their attributes.
If the object does not provide
__dir__(), the function tries its best to gather information from
the object’s __dict__ attribute, if defined, and from its type
object. The resulting list is not necessarily complete, and may be
inaccurate when the object has a custom __getattr__().
The default dir() mechanism
behaves differently with different types of objects, as it attempts
to produce the most relevant, rather than complete,
information:
If the object is a module
object, the list contains the names of the module’s
attributes.
If the object is a type or
class object, the list contains the names of its attributes, and
recursively of the attributes of its bases.
Otherwise, the list contains
the object’s attributes’ names, the names of its class’s
attributes, and recursively of the attributes of its class’s base
classes.
The resulting list is sorted
alphabetically. For example:
>>>
import struct
>>>
dir() # doctest: +SKIP
['__builtins__', '__doc__',
'__name__', 'struct']
>>>
dir(struct) # doctest:
+NORMALIZE_WHITESPACE
['Struct', '__builtins__',
'__doc__', '__file__', '__name__',
'__package__',
'_clearcache', 'calcsize', 'error', 'pack', 'pack_into',
'unpack',
'unpack_from']
>>>
class Foo(object):
...
def __dir__(self):
...
return
["kan", "ga", "roo"]
...
>>>
f = Foo()
>>>
dir(f)
['ga', 'kan', 'roo']
Note Because dir() is supplied
primarily as a convenience for use at an interactive prompt, it
tries to supply an interesting set of names more than it tries to
supply a rigorously or consistently defined set of names, and its
detailed behavior may change across releases. For example,
metaclass attributes are not in the result list when the argument
is a class.
divmod(a, b)
Take two (non complex) 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 (a // b, a % b). For
floating point numbers the result is (q, a % b), where q is usually
math.floor(a / b) but may be 1 less than that. In any case q * b +
a % b is very close to a, if a % b is non-zero it has the same sign
as b, and 0 <= abs(a % b) <
abs(b).
Changed in version 2.3: Using
divmod() with complex numbers is deprecated.
enumerate(sequence[,
start=0])
Return an enumerate object.
sequence must be a sequence, an iterator, or some other object
which supports iteration. The next() method of the iterator
returned by enumerate() returns a tuple containing a count (from
start which defaults to 0) and the corresponding value obtained
from iterating over iterable. enumerate() is useful for obtaining
an indexed series: (0, seq[0]), (1, seq[1]), (2, seq[2]), .... For
example:
>>>
for i, season in enumerate(['Spring', 'Summer', 'Fall',
'Winter']):
...
print i, season
0 Spring
1 Summer
2 Fall
3 Winter
New in version 2.3.
New in version 2.6: The start
parameter.
float([x])
Convert a string or a number to
floating point. If the argument is a string, it must contain a
possibly signed decimal or floating point number, possibly embedded
in whitespace. The argument may also be [+|-]nan or [+|-]inf.
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. If no
argument is given, returns 0.0.
Note When passing in a string,
values for NaN and Infinity may be returned, depending on the
underlying C library. Float accepts the strings nan, inf and -inf
for NaN and positive or negative infinity. The case and a leading +
are ignored as well as a leading - is ignored for NaN. Float always
represents NaN and infinity as nan, inf or -inf.
The float type is described in
Numeric Types — int, float, long, complex.
help([object])
Invoke the built-in help
system. (This function is intended for interactive use.) If no
argument is given, the interactive help system starts on the
interpreter console. If the argument is a string, then the string
is looked up as the name of a module, function, class, method,
keyword, or documentation topic, and a help page is printed on the
console. If the argument is any other kind of object, a help page
on the object is generated.
This function is added to the
built-in namespace by the site module.
New in version 2.2.
hex(x)
Convert an integer number (of
any size) to a hexadecimal string. The result is a valid Python
expression.
Note To obtain a hexadecimal
string representation for a float, use the float.hex()
method.
Changed in version 2.4:
Formerly only returned an unsigned literal.
int([x[,
base]])
Convert a string or number to a
plain integer. If the argument is a string, it must contain a
possibly signed decimal number representable as a Python integer,
possibly embedded in whitespace. The base parameter gives the base
for the conversion (which is 10 by default) and may be any integer
in the range [2, 36], or zero. If base is zero, the proper radix is
determined based on the contents of string; the interpretation is
the same as for integer literals. (See Numeric literals.) If base
is specified and x is not a string, TypeError is raised. Otherwise,
the argument may be a plain or long integer or a floating point
number. Conversion of floating point numbers to integers truncates
(towards zero). If the argument is outside the integer range a long
object will be returned instead. If no arguments are given, returns
0.
The integer type is described
in Numeric Types — int, float, long, complex.
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).
list([iterable])
Return a list whose items are
the same and in the same order as iterable‘s items. iterable may be
either a sequence, a container that supports iteration, or an
iterator object. If iterable is already a list, a copy is made and
returned, similar to iterable[:]. For instance, list('abc') returns
['a', 'b', 'c'] and list( (1, 2, 3) ) returns [1, 2, 3]. If no
argument is given, returns a new empty list, [].
list is a mutable sequence
type, as documented in Sequence Types — str, unicode, list, tuple,
buffer, xrange. For other containers see the built in dict, set,
and tuple classes, and the collections module.
max(iterable[, args...][,
key])
With a single argument
iterable, return the largest item of a non-empty iterable (such as
a string, tuple or list). With more than one argument, return the
largest of the arguments.
The optional key argument
specifies a one-argument ordering function like that used for
list.sort(). The key argument, if supplied, must be in keyword form
(for example, max(a,b,c,key=func)).
Changed in version 2.5: Added
support for the optional key argument.
min(iterable[, args...][,
key])
With a single argument
iterable, return the smallest item of a non-empty iterable (such as
a string, tuple or list). With more than one argument, return the
smallest of the arguments.
The optional key argument
specifies a one-argument ordering function like that used for
list.sort(). The key argument, if supplied, must be in keyword form
(for example, min(a,b,c,key=func)).
Changed in version 2.5: Added
support for the optional key argument.
oct(x)
Convert an integer number (of
any size) to an octal string. The result is a valid Python
expression.
Changed in version 2.4:
Formerly only returned an unsigned literal.
print([object, ...][, sep='
'][, end='\n'][, file=sys.stdout])
Print object(s) to the stream
file, separated by sep and followed by end. sep, end and file, if
present, must be given as keyword arguments.
All non-keyword arguments are
converted to strings like str() does and written to the stream,
separated by sep and followed by end. Both sep and end must be
strings; they can also be None, which means to use the default
values. If no object is given, print() will just write
end.
The file argument must be an
object with a write(string) method; if it is not present or None,
sys.stdout will be used.
Note This function is not
normally available as a built-in since the name print is recognized
as the print statement. To disable the statement and use the
print() function, use this future statement at the top of your
module:
from __future__ import
print_function
New in version 2.6.
range([start], stop[,
step])
This is a versatile function to
create lists containing arithmetic progressions. It is most often
used in for loops. The arguments must be plain integers. If the
step argument is omitted, it defaults to 1. If the start argument
is omitted, it defaults to 0. The full form returns a list of plain
integers [start, start + step, start + 2 * step, ...]. If step is
positive, the last element is the largest start + i * step less
than stop; if step is negative, the last element is the smallest
start + i * step greater than stop. step must not be zero (or else
ValueError is raised). Example:
>>>
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)
[]
raw_input([prompt])
If the 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, EOFError is raised. Example:
>>>
s = raw_input('--> ')
--> Monty
Python's Flying Circus
>>>
s
"Monty Python's Flying
Circus"
If the readline module was
loaded, then raw_input() will use it to provide elaborate line
editing and history features.
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 eval_r(),
otherwise the representation is a string enclosed in angle brackets
that contains the name of the type of the object together with
additional information often including the name and address of the
object. A class can control what this function returns for its
instances by defining a __repr__() method.
reversed(seq)
Return a reverse iterator. seq
must be an object which has a __reversed__() method or supports the
sequence protocol (the __len__() method and the __getitem__()
method with integer arguments starting at 0).
New in version 2.4.
Changed in version 2.6: Added
the possibility to write a custom __reversed__() method.
round(x[, n])
Return the floating point value
x rounded to n digits after the decimal point. If 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 n; if two
multiples are equally close, rounding is done away from 0 (so. for
example, round(0.5) is 1.0 and round(-0.5) is -1.0).
sorted(iterable[, cmp[,
key[, reverse]]])
Return a new sorted list from
the items in iterable.
The optional arguments cmp,
key, and reverse have the same meaning as those for the list.sort()
method (described in section Mutable Sequence Types).
cmp specifies a custom
comparison function of two arguments (iterable elements) which
should return a negative, zero or positive number depending on
whether the first argument is considered smaller than, equal to, or
larger than the second argument: cmp=lambda x,y: cmp(x.lower(),
y.lower()). The default value is None.
key specifies a function of one
argument that is used to extract a comparison key from each list
element: key=str.lower. The default value is None.
reverse is a boolean value. If
set to True, then the list elements are sorted as if each
comparison were reversed.
In general, the key and reverse
conversion processes are much faster than specifying an equivalent
cmp function. This is because cmp is called multiple times for each
list element while key and reverse touch each element only once. To
convert an old-style cmp function to a key function, see the
CmpToKey recipe in the ASPN cookbook.
New in version 2.4.
str([object])
Return a string containing a
nicely printable representation of an object. For strings, this
returns the string itself. The difference with repr(object) is that
str(object) does not always attempt to return a string that is
acceptable to eval_r(); its goal is to return a printable string.
If no argument is given, returns the empty string, ''.
For more information on strings
see Sequence Types — str, unicode, list, tuple, buffer, xrange
which describes sequence functionality (strings are sequences), and
also the string-specific methods described in the String Methods
section. To output formatted strings use template strings or the %
operator described in the String Formatting Operations section. In
addition see the String Services section. See also
unicode().
sum(iterable[,
start])
Sums start and the items of an
iterable from left to right and returns the total. start defaults
to 0. The iterable‘s items are normally numbers, and are not
allowed to be strings. The fast, correct way to concatenate a
sequence of strings is by calling ''.join(sequence). Note that
sum(range(n), m) is equivalent to reduce(operator.add, range(n), m)
To add floating point values with extended precision, see
math.fsum().
New in version 2.3.
tuple([iterable])
Return a tuple whose items are
the same and in the same order as iterable‘s items. iterable may be
a sequence, a container that supports iteration, or an iterator
object. If iterable is already a tuple, it is returned unchanged.
For instance, tuple('abc') returns ('a', 'b', 'c') and tuple([1, 2,
3]) returns (1, 2, 3). If no argument is given, returns a new empty
tuple, ().
tuple is an immutable sequence
type, as documented in Sequence Types — str, unicode, list, tuple,
buffer, xrange. For other containers see the built in dict, list,
and set classes, and the collections module.
type(object)
Return the type of an object.
The return value is a type object. The isinstance() built-in
function is recommended for testing the type of an
object.
With three arguments, type()
functions as a constructor as detailed below.
xrange([start], stop[,
step])
This function is very similar
to 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 xrange() over range() is minimal
(since xrange() still has to create the values when asked for them)
except when a very large range is used on a memory-starved machine
or when all of the range’s elements are never used (such as when
the loop is usually terminated with break).
CPython implementation detail:
xrange() is intended to be simple and fast. Implementations may
impose restrictions to achieve this. The C implementation of Python
restricts all arguments to native C longs (“short” Python
integers), and also requires that the number of elements fit in a
native C long. If a larger range is needed, an alternate version
can be crafted using the itertools module: islice(count(start,
step), (stop-start+step-1)//step).
六、递归
------
如果函数包含了对其自身的调用,该函数就是递归的。如果一个新的调用能在相同过程中较早的调用结束之前开始,那么该过程就是递归的。
可以看一段MIT公开课视频:
递归广泛地应用于使用递归函数的数学应用中,类似数学归纳法。
拿阶乘函数的定义来说明:
N! == factorial(N) == 1 * 2 * 3
... * N
我们可以用这种方式来看阶乘:
factorial(N) = N!
= N * (N-1)!
= N * (N-1) * (N-2)!
…
= N * (N-1) * (N-2) ... * 3 * 2 * 1
我们现在可以看到阶乘是递归的,因为
factorial(N) = N*
factorial(N-1)
换句话说,为了获得 factorial(N)的值,需要计算
factorial(N-1),而且,为了找到 factorial(N-1),需要计算
factorial(N-2)等等。我们现在给出阶乘函数的递归版本。
>>>
def factorial(n):
...
if n==0 or n==1:
...
return 1
...
else:
...
return
n*factorial(n-1)
...
>>>
factorial(21)
51090942171709440000L
>>>
factorial(4)
24
>>>
factorial(1)
1
>>>
factorial(0)
1
特别强调:
递归函数必须有一个终止执行的条件,如我们的例子中,当n=0或者n=1时,会终止;否则,程序将进入一个无限循环的状态,俗称“死循环”
递归虽然使程序看起来非常的简单,但是递归程序如果递归的次数很大的话,将会严重的消耗计算机的内存,甚至可能导致系统的崩溃
下面给出一段视频,里面是以经典的递归问题:斐波那契数列作为例子进行讲解的,值得学习!
【插入视频】
我的更多文章:
Python程序调试的一些体会(2013-10-06 22:57:35)
十四、Python编程计算24点(之二)(2013-10-03 22:18:28)
十三、Python编程计算24点(之一)
(2013-10-02 22:15:46)
十二、Python简单数据结构应用(之二)(2013-10-02 22:10:41)
十一、Python简单数据结构应用(之一)(2013-09-23 23:31:49)
十、Python编程解决组合问题(之二)
(2013-09-21 23:37:27)
九、Python编程解决组合问题(之一)(2013-09-21 23:32:54)
七、Python的函数编程(之一)
(2013-09-20 23:09:10)
六、Python的程序流程(2013-09-19 16:53:58)
高中生如何学编程(2013-09-02 19:26:01)
相关文章推荐
- python函数之二 函数式编程
- python核心编程-函数返回值
- Erlang顺序编程之二 模块与函数2
- Python编程_Lesson013_函数编程总结和补遗
- Python编程琐碎-函数调用和参数传递
- Python socket编程之(一):socket的基本参数和函数介绍
- 我与python约个会:15编程进阶~函数的返回值
- 【Python】[函数式编程]高阶函数,返回函数,装饰器,偏函数
- Python编程-编码、文件处理、函数
- python核心编程-传递调用内建函数
- Python编程第7讲—函数
- python编程练习之二
- python3 第二十一章 - 函数式编程之return函数和闭包
- VC++与Matlab混合编程之二:调用Matlab中M函数转换成DLL文件的形式
- python核心编程学习笔记-2016-08-02-01-读取文件的函数中的文件指针问题
- python 函数、函数式编程、变量作用域、函数__doc__属性
- python之高阶函数编程
- 【python学习笔记】函数式编程:返回函数
- 【语言工具】Python闭包,装饰器,生成器,偏函数,函数式编程,lamda,map,reduce,filter
- Python 核心编程笔记_Chapter_4_Note_2 内建函数(built-in functions)