一、函数调用过程
程序调用函数需要四步:
- 调用程序在调用处暂停执行
- 在调用时将实参复制给函数的形参
- 执行函数体语句
- 函数调用结束给出返回值,程序回到调用前的暂停处继续执行。
二、函数的参数传递
**形式参数(形参):**在函数创建和定义过程中使用的参数。
**实际参数(实参):**在函数被调用的过程中传递进来的参数。
形参只是代表一个位置、一个变量名,没有具体的值。
实参是一个具体的值,是赋值到变量名中的值。
实参默认按位置顺序依次传递给形参,若参数个数不对,就会报错
关键字参数:
普通的参数叫做位置参数,调用时需要按照位置传递参数值。
关键字参数就是在调用函数,传入实参时指定形参的变量名。
可选参数(默认值参数):
定义函数时,如果有些参数存在默认值,可以在定义函数时直接为这些参数指定默认值。
当函数被调用时,如果没有传入对应的参数值,则使用函数定义时的默认值替代。
由于函数调用时需要按照顺序输入参数, 可选参数必须定义在非可选参数的后面。
可变数量参数(*c,**d):
在定义函数时,可以设计可变数量参数,通过参数前增加 单星号( * )或双星号( ** ) 实现。带有星号的可变参数只能出现在参数列表的后面。调用时,增加单星号的参数被当做 元组 类型传递到函数中,增加双星号的参数被当做 字典 类型传递到函数中。
>>>def vfunc(a, *b):
print(type(b))
for n in b:
a +=n
return a
>>>vfunc(1,2,3,4,5)
15
参数的位置与名称传递
Python提供了按照形参名称输入实参的方式,函数调用如下:
result = func(x2=4, y2=5, z2=6, x1=1, y1=2, z1=3)
由于调用函数时指定了参数名称,所以参数之间的顺序可以任意调整。
参数传递的基本顺序:
- 位置参数
>>> def add(x,y):
>>> return x + y
>>> add(3,4)
7
- 关键字参数
>>> def add(x,y):
>>> return x + y
>>> add(y = 4,x = 3)
7
-
可变数量参数
1.arg:以 元组 形式返回
2.**arg:以 字典 形式返回
>>> def test_fun(a,b = 6,*c,**d):
>>> print("a = ",a,"b = ",b,"c = ",c,"d = ",d)
>>> test_fun(1)
a = 1 b = 6 c = () d = {}
>>> test_fun(1,2)
a = 1 b = 2 c = () d = {}
>>> test_fun(1,2,3)
a = 1 b = 2 c = (3,) d = {}
>>> test_fun(1,2,3,4)
a = 1 b = 2 c = (3,4) d = {}
>>> test_fun(a = 1)
a = 1 b = 6 c = () d = {}
>>> test_fun(a = 1,b = 2,c = 3) #c和d是占位符,不是名称,c是不确定数量的单个变量,d是有键有值
a = 1 b = 2 c = () d = {'c': 3}
>>> test_fun(1,2,3,4,x = 1)
a = 1 b = 2 c = (3,4) d = {'x': 1}
>>> test_fun(1,2,3,4,5,6,x = 1,y = 2,z = 3)
a = 1 b = 2 c = (3, 4, 5, 6) d = {'x': 1, 'y': 2, 'z': 3}
>>> test_fun(1,2,3,4,b = 8) #b不能二次赋值
TypeError: test_fun() got multiple values for argument 'b'
三、函数与过程
函数:
有返回值
过程:
无返回值
Python中只有函数,没有过程。
如果没有return语句,默认返回None。
变量的返回值:
- return语句用来退出函数并将程序返回到函数被调用的位置继续执行。return语句同时可以将0个、1个或多个函数运算完的结果返回给函数被调用处的变量。
>>>def func(a, b):
return a*b
>>>s = func("knock~", 2)
>>>print(s)
knock~knock~
- 函数可以没有return,此时函数并不返回值。函数也可以用return 返回 多个值 ,多个值以 元组 类型保存
>>>def func(a, b):
return b,a
>>>s = func("knock~", 2)
>>>print(s, type(s))
(2, 'knock~')