Python 函数与参数
函数(Function)是一种代码的组织形式,将特定的功能封装成函数,有利于代码复用、提高代码可读性。
定义函数
在 Python 中定义一个函数有如下规则:
- 函数代码块以
def
关键词开头,后接函数标识符名称和圆括号(无参数也要加上圆括号); - 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数,参数之间用逗号隔开;
- 函数的第一行语句可以选择性地使用文档字符串(用于存放函数说明);
- 函数内容以冒号(
:
)起始,并且缩进; return [表达式]
结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None;- 函数名的命名规则和变量一样。
总体来说,函数的定义有如下几种格式:
1. 基本函数格式
def func_name():
函数功能代码…
函数功能代码…
…
调用函数:func_name()
特征:函数定义之后不会自动执行,必须在调用函数之后才会执行。
2. 带有参数的函数格式
def func_name(参数, 参数, ...):
函数功能代码…
函数功能代码…
…
调用函数:func_name(参数, 参数, ...)
注意:实参将只传递给形参的过程本质上就是简单的变量赋值仅此而已。在此情况下,参数必须以正确的顺序传入函数,调用时的数量必须与声明时一样。
3. 带有默认值的参数
def func_name(形参=默认值, 形参=默认值 ...):
函数功能代码…
函数功能代码…
…
调用函数:
func_name()
调用函数时所有形参采用默认值操作func_name(实参, 实参 ...)
调用时形参使用实参的值而抛弃默认值
注意:在此情况下使用实参值覆盖原有形参的默认值,本质上就是变量的重新赋值操作。调用函数时,如果没有传递参数,则会使用默认参数。
4. 关键字参数
def func_name(形参=默认值, 形参=默认值 ...):
函数功能代码…
函数功能代码…
…
调用函数:func_name(形参=实参, 形参=实参 ...)
特征:
- 关键字参数就是调用函数时,在实参前面指定形参的做法,可以防止参数按照位置传递出现的错误;
- 关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值;
- 使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
5. 收集参数/变长参数(带 *)
非关键字收集参数/元组(Tuple)变长参数
def func_name(*参数名):
函数功能代码…
函数功能代码…
…
调用函数:func_name(实参, 实参 …)
,参数数量没有限制。
特征:
- 非关键字收集参数,在形参前添加一个
*
即可; - 非关键字收集参数收集实参组成一个元组;
- 非关键字收集参数,仅收集没有任何形参接受的非关键字实参;
- 非关键字收集参数和普通的形参可以 共存。
关键字收集参数/字典(Dictionary)变长参数
def func_name(**参数名):
函数功能代码…
函数功能代码…
…
调用函数:func_name(形参=实参, 形参=实参 …)
,参数数量没有限制。
特征:
- 关键字收集参数,在形参前添加两个
**
即可; - 关键字收集参数,收集的结果组成一个
字典
,关键字(形参)成为字典的键,实参成为值; - 关键字收集参数,仅收集没有任何形参接受的关键字参数;
- 关键字参数可以和普通的形参共存;
6. 多种参数混合
总结一下,函数中参数定义有这几种格式:普通参数、关键字参数、非关键字收集参数、关键字收集参数。
虽然 Python 支持多种参数格式混合,但是程序员在定义函数时,应尽量避免多种参数格式混合。
如果必须使用多种参数格式,那么需要遵循如下规则:
- 普通参数和关键字参数必须在两种收集参数之前;
- 非关键字收集参数,必须在关键字收集参数之前;
- 如果多种参数在一起,必须注意禁止参数多次赋值操作(相同“赋值”赋值之后,关键字参数在此赋值)。