在Python语言中函数的概念与我们数学中有大同小异之处。在数学中我们假设一个式子y=2x+6,那么我们会称y为x的函数。而在Python语言当中,式子中的x会被成为参数,y会被成为返回值,2x+6这个过程则是处理过程。书写形式如下所示:
def fnc1(x):
y=2*x+6
return y
#调用函数
fnc1(2) #10
fnc1(3) #12
函数在Python语句中十分常用,因为它能够封装自己填写的功能代码,需要的时候直接调用即可,不需要自己重新编写。一方面降低了编程的难度,同时又避免了代码的重用,使得总体代码看起来简洁干净。从上面的案例中我们也可以看到,一个函数是由多个部分组成,下面我们每个部分都进行讲解。
Python语言中,我们使用def关键载来定义一个函数,其基本形式如下:
def <函数名> (<参数列表>):
<缩进>函数体
<缩进>return <返回值>
函数名:与变量名差不多,同属标识符,不过这里指代的是一个函数,命名方式与变量一样。
参数列表:即在调用函数时需要传入作为函数体内的变量来使用的数据。可有可无。
函数体:需要函数执行的内容。
返回值:由return关键字引导,即函数体执行完毕后需要返回的值,该部分可以不写。一旦函数返回某个值,该函数立即停止执行,即使后面还有内容也会被忽略。
这里面需要注意的是参数列表这一块,由于需求的不同,参数也会被分为好几类,且不同参数之间的位置也是十分讲究的。
位置参数是函数最为常见的参数,一旦被定义了就必须填入,我们以len函数为例。
len(object):返回对象的长度。
这里面的object就是一个位置参数,如果不传入就会报错。
len() #TypeError: len() takes exactly one argument (0 given)
有些时候我们不知道具体要输入的参数量为多少时,我们就需要到可变数量参数了。可变数量参数非必填参数,书写方式在参数名前面加上星号即可,这时候,输入的参数就会被当作元组类型传入到函数当中,或以可迭代对象的形式传入也是可以的,如max函数就是一类。
max(arg1, arg2, *args, key=func]:返回输入参数的最大值。
其中第三个参数就是可变数量参数,因为我们不知道会输入多少个参数进行对比,因而需要一个可变参数。
def traverse(*tup):
for data in tup:
print(data,end='')
traverse(1,2,3,4,5) #12345
traverse(*(1,2,3,4,5)) #12345
traverse(*range(5)) #01234
顾名思义,这种参数可填可不填,且在函数定义时就已经有自己的参数名和对应的默认值,因此也叫关键字参数。如果不填入该参数的话会把默认值传递到函数体当中,print函数中就有sep和end两个可选参数,如果不指定填入时数据之间就会以空格为分隔符,函数执行完之后以换行结尾。
一般用该类型参数来为函数传入一个字典,在参数名前加两个星号即可注明为此类参数。为该参数传入实际参数时,可以用多个关键字参数的形式或以字典的形式传入。
注意:这时候参数名作为字典的键传入,参数值作为字典的值传入。
def traverse_dict(**dict1):
for key, value in dict1.items():
print(f'{key}{value}',end=',')
traverse_dict(Mike=2, Tony=3,Jack=4) #Mike2,Tony3,Jack4,
traverse_dict(**{
'Mike':2, 'Tony'=3,'Jack'=4}) #Mike1,Tony3,Jack4,
1.首先根据位置参数和关键字参数的定义,由于关键字参数自带默认值,位置参数是要放在前面的。如果关键字参数在前,则无法分辨是要对关键字参数重新赋值还是对位置参数进行赋值。
2.接着再看可变数量参数和单参数。也可以很容易对其先后顺序进行分辨,如果非可变数量在前,则在赋值的时候是无法分辨该参数是属于单参数还是可变数量参数,因而要把单参数放前。
遵循以上两条原则,很容易就可以推出不同类型参数的位置应为:
1.位置参数 2.可变数量位置参数 3.关键字参数 4.可变数量位置参数
用 函数名(参数值) 的方式调用函数,这时候函数中的函数体代码就会被执行一次。
说完了函数的一些基本定义和调用,下面介绍一种比较方便的函数——匿名函数。这种函数顾名思义,在定义的过程中是没有函数名的,因而书写非常方便,一般只用一行代码就可以定义一个匿名函数,主要用于生成只有返回值的函数,用关键字lambda来定义,其书写形式为:
lambda <参数列表>:<返回值>
等同于
def <参数列表>:
<缩进>return <返回值>
lambda x:x+6 # at 0x000002261D8DD280>
这时候你可能会有疑问,调用一个函数的方式是函数名加小括号,那对于没有变量名的匿名函数又该如何调用呢?下面为你解答:
(lambda <参数列表>:<返回值>)(参数值)
利用这种方式可以调用匿名函数,但由于匿名函数是没有保存到系统当中的,如果下一次还想调用的时候就得重新输入一次,比较麻烦。这时可以用把匿名函数赋值给变量的方式拟定一个函数名,如果下一还想再使用这个匿名函数,就可以利用正常的方式调用了。
变量名= lambda <参数列表>:<返回值>
变量名(参数值)
(lambda x:x+6)(7) #13
fnc=lambda x:x+6
fnc(7) #13
在我们自定义完成一个函数后,有时候需要把这个函数分享出去或者给其他人去使用,但是别人不知道这个函数的作用是什么,也不知道该传入哪种类型的参数。这时就需要一个说明文档来解释这个函数,里面可以填入任何说明内容,包括函数的用处,参数的说明等等。添加方法在第一行加入说明字符串即可。如果想查看函数的说明文档,可利用以下方式:
1.利用help函数
2.利用function.__doc__的方式,不过这种方法会返回说明文档的字符串格式。
def add(x1,x2):
'''
说明:这是一个作加法运算的函数,返回两个加数的和。
x1:加数1
x2:加数2
'''
return x1+x2
help(add)
# 说明:这是一个作加法运算的函数,返回两个加数的和。
# x1:加数1
# x2:加数2
add.__doc__
#'\n\t说明:这是一个作加法运算的函数,返回两个加数的和。\n\tx1:加数1\n\tx2:加数2\n\t'