Python Chapter 6 抽象

创建函数

使用 def 定义函数:

def func_name(param1, param2, ...):
    pass

Python 2 中,内建的 callable 函数可以用来判断函数是否可调用:

>>> import math
>>> x = 1
>>> y = math.sqrt
>>> callable(x)
False
>>> callable(y)
True

函数 callable 在 Python 3 中不再使用,需使用表达式 hasattr(func, call)代替.请参见第七章.

记录函数

如果想要给函数写文档,可以加注释(以 # 开头).另外一个方式就是直接写上字符串.这类字符串在其他地方可能会非常有用,比如在 def 语句后面(以及在模块或者类的开头).

如果在函数的开头写下字符串,它就会作为函数的一部分进行存储,这称为文档字符串

>>> def squre(x):
...     'Calculates the square of the number x.'
...     return x * x
... 
>>> squre.__doc__    # __doc__ 是函数属性
'Calculates the square of the number x.'

内建的 help 函数是非常有用的.在交互式解释器中使用它,就可以得到关于函数,包括它的文档字符串的信息.

>>> help(squre)

Help on function squre in module __main__:

squre(x)
    Calculates the square of the number x.

所有的函数都返回了东西:当不需要它们返回值的时候,它们就返回 None.

>>> def func():
...     pass
... 
>>> print func()
None
>>> print func
<function func at 0x7f1845f04668>

函数的参数

注: 参数存储在局部作用域内

>>> def try_to_change(n):
...     n = 'Mr. Gumby'
... 
>>> name = 'Mr. Entity'
>>> try_to_change(name)
>>> name
'Mr. Entity'

字符串(以及数字和元组)是不可变的,即无法被修改(也就是说只能用新的值覆盖).

对于可变的数据结构:

>>> def change(n):
...     n[0] = "wang"
... 
>>> names = ["Mr.wang", "hello"]
>>> change(names)
>>> print names
['wang', 'hello']


>>> names = ['sss', 'www']
>>> n = names
>>> n[0] = 'dsds'
>>> print n
['dsds', 'www']
>>> print names
['dsds', 'www']

当两个变量同时引用一个列表时,它们的确是同时引用一个列表,都可以修改列表中的值. 如果想避免这种情况,可以复制一个列表的副本.

>>> names = ['www', 'sss']
>>> n = names[:]
>>> n[0] = 'swws'
>>> print n
['swws', 'sss']
>>> print names
['www', 'sss']