前言
Python中,函数(Function)是一段组织好的、可重复使用的、可以做某一件事的代码。
按照面向过程编程思想:一项业务往往有多个流程,每个流程都会用到多个功能,而每个功能对应编程单位就是一个函数。
1、函数定义
函数结构如下:
def 函数名称(参数列表):
函数体
我们通过解释器解释过程来理解函数是何时开始定义和何时结束定义:
- 解释到5行发现def关键字表示开始定义一个函数。
- 冒号表示下一行是函数体。(空行时解释器直接跳过)
- 我们约定冒号后函数体每一行内容都要缩进。(缩进就是键盘上tab键跳四个空格的距离)
- 当解释到第9行add(1,2)没有缩进,表示函数定义结束第5到第7行是函数定义全部内容。
下面的例子c=a+b没有按照缩进要求书写,解释器报错:需要一个缩进。
python是使用缩进来表示层级关系,缩进可以理解为我们在键盘按下tab键,光标跳四个空格距离。
2、函数的调用
函数是我们写好一块代码。那么如何使用一个函数?
使用函数就是调用函数。调用格式如下:
函数名(实参1、实参2...)
add(1,2)代码就是跟解释器说我要调用函数:将实参1和2按位置传给形参a,b。
名称 | 描述 | 位置 |
---|---|---|
形参 | 全称形式参数,就是用来接收实际数据的变量。 | 在定义函数的圆括号括起来的变量 |
实参 | 全称实际参数,就是实际数值。 | 在调用函数的圆括号里实际数据 |
3、函数的参数三种类型
参数类型由三种,我们可以从函数定义和函数调用,分析实参传入和形参接收过程,可以清晰理解三种类型的如何使用。
名称 | 函数定义 | 函数调用 |
---|---|---|
位置参数 | 有限参数,如:def add(a,b) | 实参和形参需一对一按照位置传入,数量必须一样。如:add(1,2)调用函数时,a=1,b=2 |
关键字参数 | 又叫(星号关键字参数)。指需要接收不特定数量参数,如def add(a,*b),参数前加上一个星号,表示b为关键字参数 | 当传入实参多于形参数时,多余参数使用元组b接收。如:add(1,2,3)调用函数时,a=1,b=tuple(2,3),a属于位置参数方式,b属于关键字参数方式。 |
字典参数 | 又叫(双星号字典参数)。指需要接受一个字典类型参数,如def function1(a, **b),参数前加上两个星号,表示b为字典参数 | function1(1,**{‘d’: 4, ‘e’: 5, ‘f’: 6}) 调用函数,a=1,b={‘d’: 4, ‘e’: 5, ‘f’: 6},a属于位置参数方式,b属于字典参数参数方式。 |
如果还觉得关键字参数和字典参数觉得过于抽象按照以下方法理解。
- 关键字参数相当于位置参数使用默认空列表作为一个参数。def add(a,*b)等同于def add(a,b=[])
- 字典参数相当于位置参数使用默认空字典作为一个参数。def add(a,**b)等同于def add(a,b={})
4、函数的默认参数和指定参数传入
有时候我们调用函数并不需要传入所有参数,如果在函数定义里已经设置参数默认值。
def add(a,b=2):
c=a+b
print(c)
add(1) # 传入a=1,没有传入b的实参,所以默认b=2。
add(1,3) # 传入a=1,有传入b的实参,所以b=3。
# 3
# 4
调用函数时,位置传参方式要求一对一按照位置传入,如果参数很多又要按照顺序书写实参可能会出错。
可以指定参数传入,一来不用按顺序,二来代码更加清晰,不容易出错。
def add(a,b):
c=a+b
print(c)
add(b=2,a=1) # 指定参数传入,无须按顺序。
# 3
5、函数的返回值
函数是实现执行一个操作或者计算一个结果,计算结果需要进行回传结果,需要回传结果使用在函数结尾或分支结束使用return 语句:
def add(a,b):
c=a+b
return c #返回c
d=add(1,2) #d变量接收返回值
print(d) #打印d变量值
# 3
- return除了是返回值操作,同时也是结束函数调用操作。注意在分支执行代码中编写return语句会直接结束分支操作。
def add(a,b):
c=a+b
return c #返回c
print("函数结尾") # 不要把语句放在return后面,实际运行该语句不会执行。
d=add(1,2) #d变量接收返回值
print(d) #打印d变量值
# 3
- return可以返回多个值,返回值之间用逗号隔开。
- 调用函数接收返回值时,注意多个返回值是以元组方式传回,当然也可以使用多个变量接收。
def add(a,b):
a=100
b=200
return a,b
d,e=add(1,2) # d,e变量按照返回值顺序接收a,b
print(d) # 打印d变量值
print(e) # 打印e变量值
f=add(1,2) # f接收元组(100,200)
print(f)
# 100
# 200
# (100, 200)
总结
学习函数,要注意函数定义和函数调用相结合方式学习,多演练,多观察。
初学时候很容易犯缩进和漏了函数定义冒号两个错误。
- 缩进错误:IndentationError: expected an indented block
- 漏冒号错误:SyntaxError: invalid syntax
还有常见错误
- 多传、少传参数和不按位置传参。
- 调用无参函数漏了()。
- 在return语句后面编写语句,导致该语句不执行。