- 形参与实参
- 形式参数(parameter),简称形参,函数定义过程中小括号里面的参数;
- 实际参数(argument),简称实参, 指函数被调用过程中实际传递进来的参数。
>>> def my_function(param1, param2): # param1, param2为形参
return param1** 2 + param2 ** 2
>>> my_function(3, 4) # 3,4为实参
- 参数的具体类型
函数的参数具体可以有以下几种分类:
-
位置参数
位置固定的参数, 前面定义函数的参数都是位置参数 -
关键字参数
位置参数一多容易混淆, 因此在函数调用的时候引入这种映射类型的关键字参数就非常有用了
>>> def learn(teacher, student, course):
print(teacher + "教" + student + "学" + course)
>>> learn("王老师", "小明", "数学")
王老师教小明学数学
>>> learn("小明", "王老师", "数学")
小明教王老师学数学
>>> learn(student = "小明", course = "数学", teacher = "王老师")
王老师教小明学数学
>>> learn("王老师", student = "小明", course = "数学")
王老师教小明学数学
>>> learn(course = "数学", "小明", teacher = "王老师") # 位置参数必须在关键字参数的前面, 不然会出错
SyntaxError: positional argument follows keyword argument
>>>
- 默认参数
python函数允许为参数指定默认值, 在函数调用的时候如果没有传入实参则采用默认值。
>>> def learn(teacher = "李老师", student = "小红", course = "英语"):
print(teacher + "教" + student + "学" + course)
>>> learn()
李老师教小红学英语
>>> learn("小明", "王老师", "数学")
小明教王老师学数学
>>> learn(student = "小明", course = "数学", teacher = "王老师")
王老师教小明学数学
>>> learn(student = "小明")
李老师教小明学英语
>>> def learn(teacher = "李老师", student = "小红", course): # 在定义函数的时候如果有位置参数,则一定要在默认参数的前面,不然会报错
print(teacher + "教" + student + "学" + course)
SyntaxError: non-default argument follows default argument
- 可变参数
之所以用可变参数(又叫收集参数),是因为函数的调用者有时也不知道要传入多少个实参。
最典型的就是我们非常熟悉的print()函数
>>> print(1,2 ,3)
1 2 3
>>> print(1,2,3,4,5)
1 2 3 4 5
print()函数的定义就是采用了可变参数:
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
Print objects to the text stream file, separated by sep and followed by end. sep, end, file and flush, if present, must be given as keyword arguments. python3.8官方文档
可变参数在语法上有两种方式:* 或者 **
>>> def output_alpha(*letter):
for i in letter:
print(i)
>>> output_alpha('a', 'b', 'c')
a
b
c
加(*)的可变参数实际上是把所有参数打包成一个元组。
>>> def output_alpha(*letter):
print(type(letter))
>>> output_alpha('a', 'b')
<class 'tuple'>
注意如果可变参数后面还需要指定其他参数,那么在调用时(函数定义时没啥要求,位置参数、默认参数都可)就应该使用关键字参数,不然python会把全部参数都纳入到可变参数当中。
在函数的参数设置上,print()函数简直就是我们的典范,再次把它掏出来:
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
如果要设置可变参数,那么在传入实参的时候重点肯定在可变参数上,因此不妨将其他参数都设置成默认参数,这样简直不要太方便灵活了。
另一种可变参数形式是用(**),不同之处时将所有参数打包成字典。
>>> def student(**info):
print(info)
>>> student(Amy=1, Tom=2, Bob=3)
{'Amy': 1, 'Tom': 2, 'Bob': 3}