目录
定义方法
def f(a,b):
print("调用函数f")
return “函数f的返回值”
在Python中定义函数使用的是def关键字,f就是函数的名称,(a,b)是函数f 的形式参数
调用函数
>>> f(1,2)
调用函数f
'函数f的返回值'
调用函数是一件非常简单但是却经常用的一件事情,有多常用?不算太夸张的说,无时无刻不在用。
调用函数:在函数名后加上()就可以调用函数了,而()表示调用,如果没有()函数名只是指向函数的一个变量。
参数
必须参数
def f(a,b):
print("调用函数f")
return “函数f的返回值”
这个函数种的a和b就是必须参数,那什么是必须参数呢?
顾名思义,必须有的参数,我们可以试一下不给f函数参数调用他
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: f() missing 2 required positional arguments: 'a' and 'b'
很明显,报错了!为什么报错呢?编译器告诉我们f()需要两个参数a和b,所以调用f()函数时必须有两个参数。
>>> f(1,2)
调用函数f
'函数f的返回值'
并且,这种参数形式需要严格按照顺序输入,否则会出现参数不对应的错误,也就是说,必须按照先输入赋给形参a的值,再输入赋给形参b的值的格式进行输入。
关键字参数
是不是感觉必须参数的形式非常严苛古板?这种参数形式可以解决这个问题
为了演示这种参数,我们重新定义一下f函数
def f(a,b):
return a+b
>>> f(b=2,a=1)
3
这种方法是不是更灵活一些?但是这种方法也有缺点,那就是关键字必须与函数定义时的形参匹配,否则就会调用失败
默认参数
我们对f函数进行一些改动
def f(a,b=0):
return a+b
然后,我们以两种不同的形式调用他
>>> f(1)
1
>>> f(1,2)
3
是不是发现和上面的必须参数有些不同?现在的f函数既可以接收一个参数也可以接收两个参数。
这就是用默认参数实现的,当这个参数没被赋值的时候他就会调用定义函数时设定的默认值来参与运算
默认参数主要应用在:某个参数大多数时候是不需要改变的,但是少数时候需要改变的情况
不定长参数
现在我们来思考一个问题,我们现在的f函数可以用来将两个数相加,如果我想将三个数相加呢?你可能立刻就想到了一种方法:加一个形参,在返回值表达式里再让这个形参和其他形参相加,没错!这种方法是容易想到的问题,如果我想要让5000个数相加呢?难道你要写5000个形参吗?不现实吧?这个时候就是不定长参数上场的时候了
不定长参数分为两种:
无命名不定长参数
还是那个相加的函数,我们利用无命名不定长参数来完善一下
def f(*args):
n = 0
for i in args:
n = n + i
return n
>>> f(1,2,3,4,5,6,7,8,9,10)
55
在参数名前加*表示这个参数是无命名不定长参数
现在我们来看一下args这个参数在函数内部是如何存储的
首先我们来改造一下函数f,为了便于观察我们把实际功能去除,只显示我们想看的
def f(*args):
print(args)
>>> f(1,2,3,4,5,6,7,8,9,10)
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
由此可见,参数args在函数内部实际是以元组的形式存储的,所以在函数内部我们可以利用一切元组的特性对他进行操作
命名不定长参数
这种参数要解决的就是另一种问题了,首先我们还是思考和上一个问题相似的问题,当我们定义了一个用于打印一个人个人信息的函数时,我们如果不把输入的形式固定死,想让输入的人自行发挥,我们就需要用到命名不定长参数了
def f(**kwargs):
for i in kwargs:
print(i,kwargs[i])
>>> f(a=1,b=2,c=3)
a 1
b 2
c 3
同样的,我们来看一下命名不定长参数在函数内部的储存形式
def f(**kwargs):
print(kwargs)
>>> f(a=1,b=2,c=3)
{'a': 1, 'b': 2, 'c': 3}
由此可见,参数kwargs在函数内部实际是以字典的形式存储的,所以在函数内部我们可以利用一切字典的特性对他进行操作
高阶函数
>>> f
<function f at 0x0000015D1309CF28>
由此看见在Python中函数名其实是一个指向函数实际地址的变量。
既然他是一个变量那,那我们反向思维一下,变量是不是也可以指向函数呢
>>> a = f
>>> a(1,2)
调用函数f
'函数f的返回值'
这个实验证明了其他变量也是可以指向函数
然后,我们再试一下他是不是可以用于函数的参数呢
def a(x):
return x * x
def b(x,func):
return func(x)
首先,我们定义了两个函数a和b,函数a将参数x进行平方然后返回,函数b则是将参数x作为参数func的参数进行调用
>>> b(4,a)
16
由此可见将指向函数的变量作为函数参数是可行的,而这种函数叫做高阶函数