我们在编程的过程中往往会发现,实现某一功能的代码块会被频繁地使用。如果每次使用这段代码都得复制粘贴,这会使得代码冗长而又臃肿,增大了代码的阅读难度。为了方便我们实现对代码块的复用,人们提出了函数功能。
函数的定义以关键字def开头,后面接函数名称和圆括号。
括号中放入函数需要的参数。
通过冒号和缩进控制函数内容。
函数的结构如下所示:
def 函数名(参数):
函数体
在学习一门语言时,我们最先学会的是如何输出Hello world。那么,我们的第一个函数也就从最简单的输出Hello world开始。
def hello():
print('Hello world!')
hello()
输出:
Hello world!
可以看到,我们调用了我们定义的hello函数,函数执行了其中的print语句。
这里我们定义一个可以计算两个数之和的函数add1,可以先运行一下看看。
def add1(num1, num2):
result = num1 + num2
return result
x1, x2 = 1, 2
y = add1(x1, x2)
print(y)
输出:
3
函数完美地计算出了1加2的值。
同刚才的Hello world函数相比,我在add函数中加入了num1、num2和return。其运作原理如下:
在调用add函数时,我们将x1,x2传入add中,由num1和num2分别接收了来自x1和x2的值,将num1和num2的数值相加后传给result,最后函数输出result的值给y,我们打印出y的值,就是3。
那么这里面的num1、num2就是形参,x1、x2就是实参,return result就是函数的返回语句,其返回的就是result的值,所以result就是返回值。
由此可见,形参就是我们在函数定义过程中定义在括号内的参数。实参就是我们输入函数的参数,返回值就是return后面的语句的计算值。
我比较喜欢通过数学中对函数的定义来理解编程语言中的函数。在数学中函数的定义式是y = f(x)那么这里x就是我们传入的参数,f就是函数体,用来对x进行计算,计算结果y就是函数的返回值。
还是刚才的add1函数,但是我们参数的赋值方式不一样了:
def add1(num1, num2):
result = num1 + num2
return result
y = add1(num1=1, num2=2)
print(y)
输出:
3
我们也可以对函数的形参赋予初始值
def add2(num1=1, num2=1):
result = num1 + num2
return result
y = add2()
print(y)
输出:
2
在形参赋初值的情况下,我们又可以如下进行传参。
def add2(num1=1, num2=2):
result = num1 + num2
return result
y = add2(3)
print(y)
输出:
5
可见3按顺序替换了add2函数的第一个形参,导致num1变为3,result变为5。
那如果我们想不按顺序更改其中的参数呢?
def add2(num1=1, num2=2):
result = num1 + num2
return result
y = add2(num2=3)
print(y)
输出:
4
可以看到,3并没有按顺序替换add2函数的第一个参数,而是传给了num2,这样result的值就是4了。
当我们传入函数中的参数不固定怎么办呢?
def save(*temp):
return temp
y = save('1', 2, 'abc', True)
print(y)
输出:
('1', 2, 'abc', True)
可以看到,如果形参加上一个星号,它就相当于一个元组,我们传入的参数将以元组的形式保存。
def student(**temp):
return temp
y = student(name='老王', age=20, high=180, is_student=True)
print(y)
输出:
{'name': '老王', 'age': 20, 'high': 180, 'is_student': True}
当形参前带有两个星号时,它就相当于一个字典了。
函数也可以写在其他文件里用来调用。这里我们还是用一开始的add1函数。
from aboutadd import add1
y = add1(1, 2)
print(y)
输出:
3