函数与匿名函数

时间:2023-01-09 19:46:40
函数与匿名函数

一、函数

在计算机科学中,函数是程序负责完成某项特定任务的代码单元,具有一定的独立性。

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