1.创建函数
1.1 def语句
语法如下:
def fun_name(par1, pa2, …):
print("hello,world")
Python可以没有返回值,可以有一个返回值,也可以有多个返回值,返回值的数据类型没有限制。
1.2. lambda语句
Python允许使用lambda语句创建匿名函数。
使用lambda省去了定义函数的过程,代码变得精简。对于一些抽象的、不会在其他地方复用的函数,有时候给函数命名也是个难题(需要避免函数重名),而使用lambda则不需要考虑函数命名的问题。
lamber语句中,冒号前是函数参数,若有多个函数使用逗号分隔,冒号右边是返回值。如此便构建了一个函数对象,def语句也是创建一个函数对象,只是lambda创建的函数对象没有名字。
使用lamber函数应该注意下面4点:
1)lambda定义的是单行函数,如果需要复杂的函数,应使用def语句。2)lamdda参数列表可以包含多个函数,如lambda x, y : x+y 。
3)lambda语句有且只有一个返回值。
4)lambda语句中的表达式不能含有命令,而且仅限一条表达式。
2.函数参数
参数这个词是指你交给函数的一条信息。我们把这称为:你向函数传递参 数。
Python中的函数参数主要有3种形式,分别是:
1)位置或关键字参数。
2)任意数量的位置参数。
任意数量的位置参数在定义的时候是需要一个星号前缀来表示的,在传递参数的时候,可以在原有参数的后面添加0个或多个参数,这些参数将会被放在元组内并传入函数。任意数量的位置参数(一个星号前缀)必须定义在位置或关键字参数(无须星号)之后,且在任意数量的关键字参数(两个星号前缀)之前。
3)任意数量的关键字参数。
任意数量的关键字参数在定义的时候,参数名称前面需要有两个星号(**)作为前缀,这样定义出来的参数,在传递参数的时候,可以在原有的参数后面添加任意0个或多个关键字参数,这些参数会被放到字典内并传入到函数中。带两个星号前缀的参数必须定义在所有带默认值的参数之后。
3.可变对象和不可变对象
Python函数的参数都是对象的引用.
如果在引用不可变对象中尝试修改对象,程序会在函数中生成新的对象,函数外被引用的对象则不会被改变。
如果我们希望赋值时可变对象不进行引用,而是重新分配地址空间并将数据复制,我们可以利用Python的copy模块。其中主要的函数有copy.copy和copy.deepcopy。
1)copy.copy仅仅复制父对象,不会复制父对象内部的子对象。2)copy.deepcopy复制父对象和子对象
上图中list3为浅复制,所以没有复制子对象,list1中的[‘a’,‘b’]还是指向list1中的[‘a’,‘b’],所以list1[2].append(‘c’)后,list3中也会变。