1.参数传递与共享引用
>>> def f(x):
... x = 100
...
>>> a = 10
>>> f(a)
>>> a
10
将实参a传给形参x之后,在函数中重新赋值x并不影响到实参a。因为Python中的赋值是建立变量到对象的引用。重新赋值时,意味着形参引用了新的对象,原来的引用已经作废。
2.小心使用可变参数
当实参是可变对象时,如列表、字典等,若在函数中修改形参,因为是共享引用,通过实参也获得修改后的对象。例如:
>>> def f(a):
... a[0] = 'abc'
...
>>> x = [1,2]
>>> f(x)
>>> x
['abc', 2]
可见,可变参数可在函数中被修改,如果不希望在函数中的修改影响函数外的变量,可使用列表的拷贝作为实参。例如:
>>> def f(a):
... a[0] = 'abc'
...
>>> x=[1,2]
>>> f(x[:])
>>> x
[1, 2]
还可以在函数内对列表进行拷贝,实参仍使用变量,例如:
>>> def f(a):
... a = a[:]
... a[0] = 'abc'
...
>>> x=[1,2]
>>> f(x)
>>> x
[1, 2]
3.有默认值的参数
在定义函数时,有默认值的参数应放在参数表的末尾。
4.函数嵌套定义
Python允许在函数内部定义函数,但内部定义的函数只能在函数内部使用。
5.函数列表
Python允许将函数作为列表对象,然后通过列表索引来调用函数,例如:
>>> def add(a,b):
... return a + b
...
>>> def fac(n):
... if n == 0:
... return 1
... else:
... return n * fac(n-1)
...
>>> d = [add, fac]
>>> d[0](1,2)
3
>>> d[1](5)
120
>>>
>>> d = (add, fac) #建立包含函数列表的元组对象
>>> d[0](2,3)
5
>>> d[1](5)
120
Python还允许使用字典来建立函数映射,例如:
>>> d = {'求和':add, '阶乘':fac}
>>> d['求和'](1,2)
3
>>> d['阶乘'](5)
120
函数列表的实质就是在元组、列表和字典等序列中建立函数对象的引用,然后通过索引来调用函数。