1,参数传递
函数的参数传递都是引用传递,有些资料说函数的传递分为值传递和引用传递,那是从表象上看的现象,
其实就只有一种传递方式,那就是引用传递。
为什么会有值传递和引用传递的表象?
答:因为在进行参数传值时,如果是基础类型,str或者tuple,修改其值对被传入的对象没有影响,但是
传入list,dict或者自定义类时,对其进行修改将导致被传入对象的修改。

从表象上看,很容易让人产生两种传递方式的错觉,那是因为a和 l 操作的数据对象不同,a操作的是变量本
身,而 l 操作的是变量的元素。当a += 10时,此时a的引用地址发生变法,所以对被传入的对象没有影响,
而 l.append(100)时,并没有对变量 l 本身进行操作,所以 l 的引用地址没有发生变法,对其元素的修改,也
体现在被传入的参数上面(参考Python变量的赋值:https://www.cnblogs.com/lwp-boy/p/13269681.html)
2,默认参数
默认参数为带默认值的参数,其定义必须在无默认值的参数后面,无默认值的参数必须传递,而带默认值的
参数可传可不传,当不传时,将使用默认值。
3,函数调用
函数调用时,参数可以指定名字,也可以不指定名字,指定名字时,函数将把该参数赋值给对应的变量,不
指定名字,函数将根据参数顺序赋值给没有指定名字的参数。函数调用时,指定名字的参数必须在无指定名
字之后。
def func(a, b, c=20):
print a, b, c
func(10, b=20) # a=10, b=20, c=20
func(c=30, b=20, a=10) # a=10, b=20, c=30
func(10, 20, 30) # a=10, b=20, c=30
4,可变参数
可变参数及为对参数个数和类型没有限制的参数,python函数的可变参数通过 * 或者 ** 进行定义,例如:
def func(a, *args, **kwargs):
print a, args, kwargs
args:为元组,通过无名参数传递的参数都在args里面(a的参数除外),通过元组取数据。
kwargs:为字典,通过有名参数传递的参数都在kwargs里面(a的参数除外),通过字典取数据。
函数内部访问直接访问args和kwargs即可。
func(a=1) # a=1, args=(), kwargs={}
func(a=2, b=2) # a=1, args=(), kwargs={'b':10}
func(2, 3, a=1) # 错误,不能确定a是属于a函数属于kwargs
func(1, 2, b=2) # a=1, args=(2, ), kwargs={'b':10}
变参传递如下:
def func(a, *args, **kwargs):
print a, args, kwargs
def func2(a, b, *args, **kwargs):
func(a, b, 20, c=10, *args, **kwargs)
func2(1, 2) # a=1, args=(2, 20) kwargs={'c': 10}
5,返回值
python函数的返回值其实只有一个,当返回多个值时,其实返回的是一个元组,因为元组支持无标签
格式,比如元组:a = 1, 2, 3 等价与 a = (1, 2, 3),当 return 1, 2, 3 时,其实执行的是 return (1, 2, 3)
6, lambda表达式
lambda表达式通常用作表示一个简短的方程式(PEP8建议用函数替换lambda表达式)。
定义方式:lambda 参数列表:方程式
返回值:方程式的值
常见用法:
(1)全局表达式
lamb = lambda x, y: x+y
r = lamb(2, 3) # r=5
(2)闭包函数
def func(x):
return lambda y: x+y
f = func(5)(3) # f=8
浙公网安备 33010602011771号