函数与匿名函数 |
一、函数
在计算机科学中,函数是程序负责完成某项特定任务的代码单元,具有一定的独立性。
1.函数的定义
在Python中,函数在定义时需要满足这样的规则:
- 使用关键字def引导;
- def后面是函数的名称,括号中是函数的参数,不同的参数用逗号“,”隔开,参数可以为空,但括号不能省略;
- 函数代码块要缩进;
- 用一对"""包含的字符串作为函数的说明,用来解释函数的用途,可省略;
- 使用关键字return返回一个特定的值,如果省略,返回None。
例如,我们定义一个简单的加法函数,它接受两个变量x和y,计算x与y的的和啊,并返回a的值:
def add(x,y): """Add two numbers""" a = x + y return a
2.函数的调用
定义好函数后,函数并不会自动执行。我们需要调用它才能执行相关的内容。
函数的调用使用函数名加括号的形式,参数放在括号中,参数分为形参和实参,定义函数时是形参,调用函数时是实参。
def add(x,y): #形参 """Add two numbers""" a = x + y return a add(1,2) #调用方法,实参
当传入的参数数目与实际不符时,会报错。
当传入的参数不支持加法时,也会报错。
传入参数时,Python提供了两种模式,第一种是按照参数的顺序传入,另一种是使用键-值模式,按照参数名称传入参数:
def add(x,y): """Add two numbers""" a = x + y return a add(x=1,y=2) #键-值模式,可以调换顺序
也可以两种模式一起使用,前提是键-值模式一定在参数模式右边,否则会报错:
def add(x,y): """Add two numbers""" a = x + y return a add(1,y=2) #add(x=1,2)会报错
3.带默认参数的函数
我们可以给函数参数设定默认值,默认参数需要在定义设定,定义时,所有带默认值的参数必须放在不带默认值的参数后面:
def handle(x,type='None'): print(x,type) handle('hello') #结果为:hello,None handle('hello','mysql') #可覆盖,结果为:hello,mysql
4.参数组
参数组在定义函数时使用一个星号" * "或者两个星号" ** "来实现。
使用一个星号的参数使用如下:
def test(x,*args): print(x) #结果为:1 print(args) #结果为:(2, 3, 4, 5, 6) print(args[0]) #结果为:2 test(1,2,3,4,5,6)
参数中的*args是一个可变数目的参数,我们可以把它看成一个元组。
调用test(1,2,3,4,5,6)时,第一个参数1传给了x,剩余的参数组成一个元组传给了args,因此,args的值为(2,3,4,5,6)。
使用两个星号的参数使用如下:
def test(x,**kwargs): print(x) #结果为:1 print(kwargs) #结果为:{'y': 2, 'z': 3, 'w': 4} test(1,y=2,z=3,w=4)
**kwargs表示这是一个不定名字的参数,它本质上是一个字典。
调用test(1,y=2,z=3,w=4)时,第一个参数1传给了x,剩余的参数组成一个字典传给了kwargs,kwargs为字典{'y': 2, 'z': 3, 'w': 4}。
这两种模式也可以一起使用,前提是一个星号参数在两个星号参数左边:
def test(x,*args,**kwargs): print(x) #结果为:1 print(args) #结果为:(2, 3, 4) print(kwargs) #结果为:{'y': 2, 'z': 3} test(1,2,3,4,y=2,z=3)
二、匿名函数
当我们在传入函数时,有些时候,不需要过多的定义函数,直接传入匿名函数更方便。
1.匿名函数格式
匿名函数格式如下:
lambda x:x+1 #相当于 def calc(x) return x+1
2.匿名函数的调用
匿名函数不能直接调用,必须赋予一个变量:
lambda x:x+1 func = lambda x:x+1 print(func(10)) #结果为:11