提起函数,你一定不会陌生。其实在前面的内容里,我们已经用过了很多Python提供的函数,例如打印内容的print
。这一节,我们来看如何自定义一个函数。
定义一个最简单的函数
在Python里,一个最简单函数看上去是这样的:
def a_stub_function():
pass
实际上,这是一个什么都不做的函数,但是,我们还是可以从中找到很多有用的东西,例如:
- 函数是通过关键字
def
来定义的; - 在Python里,不推荐使用驼峰式的命名方式,大家更习惯使用全小写字母的方式。如果你在函数名中使用了大写字母,一些IDE会给你格式警告的;
- 由于函数引入了新的作用域,同样要在
def
语句末尾使用:
; - 在函数的定义里,我们只写了一个
pass
,这也是Python中的关键字,表示“过”的含义。例如,在设计一个功能之初,如果你只是想勾勒出程序大体的框架,而暂时忽略细节,就可以在函数里临时使用pass
;
理解函数的两种参数
最基本的函数参数
了解了定义函数的基本套路之后,我们来看一个更真实一些的函数add
,它接受两个参数,返回它们的和:
def a_stub_function():
pass
def add(m, n):
return m + n
先来说一个格式约定的问题,在Python里,两个函数的定义之间,推荐保留两个空行,无论是多一个或者少一个,都不符合Python的编码习惯,IDE同样会给你提示的。
接下来,来看add
的定义,它有两个参数a
和b
,为了求和,我们直接在实现里return a + b
就好了。这里要说明的是,Python中的所有函数,都是有返回值的。如果你在函数的定义中不指定return
语句,这个函数会返回None
。
定义好之后,就可以用add(1, 2)
这样的形式调用了,当然结果就是3。
使用keyword参数
除了上面这种调用方式之外,我们还可以在调用中直接使用参数在函数定义中的名字来表示对应的参数。这有点儿类似Swift中参数的external name。只不过Python中更自由,使用了名字之后,调用参数的顺序都可以是随意的。例如,之前的add
还可以这样调用:
add(n=2, m=1) # 3
当然,结果和之前是一样的。要注意的是,在=
的前后,不推荐使用空格,例如,我们要写成n=2
,而不要写成n = 2
。
给函数的参数指定默认值
当然,我们也可以用类似的方式,给函数的参数指定默认值,就像这样:
def add(m=2, n=1):
return m + n
于是,当我们这样使用add()
的时候,得到的结果同样是3。只不过,和其它编程语言一样,函数的默认参数定义,只能是从右向左依次定义的。我们不能指定m
的默认值,而不指定n
的默认值。
使用可变长参数列表
接下来,我们还可以进一步改进add
,让它计算可变个数参数的和。为此,我们有两种做法,先来看简单的。如果我们希望像这样调用add
:
add(1, 2, 3, 4, 5)
就可以把之前add
的定义改成这样:
def add(*args):
tmp = 0
for i in args:
tmp += I
return tmp
其中,*arg
这种形式,就表示任意多个参数,这样的含义。*
表示任意多,而args
只是个参数名的替代符,我们可以随意使用一个名字。
这样,在add
的实现里,args
就会被定义成一个tuple,我们只要遍历这个tuple,然后累加求和就好了。
或者,如果你还希望可以这样调用add
:
add(n1=1, n2=2, n3=3)
我们就要把add
定义改成这样:
def add(**args):
tmp = 0
for i in args:
tmp += args[I]
return tmp
其中,**
表示任意多个keyword参数,同样args
是一个自定义的名称替代符。这时,在add
的实现里,args
就会变成一个dictionary,它的key是调用函数的时候,使用的参数名,value则是传递的参数值。例如,对add(n1=1, n2=2, n3=3)
这个例子来说,args
的值就是这样的:{'n1': 1, 'n2': 2, 'n3': 3}
。
我们之前提到过,使用for
遍历dictionary的时候,遍历的是key,因此,只要用args[i]
这样的形式,就可以遍历到所有的参数值,然后进行累加了。
实际上,除了单独使用*
或**
之外,我们还可以把它们混合起来用,例如这样:
def add(*args, **k_args):
tmp = 0
for i in args:
tmp += I
for i in k_args:
tmp += k_args[I]
return tmp
对于这种用法,只有一个限制,就是*args
必须写在**k_args
前面。至于实现则很简单,我们只要分别用两个for
循环计算参数和就好了。
这样,在调用的时候,我们就可以先传递普通参数,而后传递keyword参数了:
print(add(4, 5, n1=1, n2=2, n3=3)) # 15
网友评论