python 函数的参数传递
传递方式:
位置传参
序列传参
关键字传参
字典关键字传参
位置传参:
实际参数(实参)的对应关系与形式参数(形参)的对应关系是接位置来依次对应的.
示例:
def mymin(a, b, c):
pass
mymin(1, 2, 3) # 1,2,3位置位置对应关系传给a,b,c
说明:
实际参数和形式参数通过位置进行传递和匹配
实际参数的个数必须与形式参数的个数相同
示例:
# 此示例示意位置传参
def myfun(a, b, c):
'这是一个函数传参的示例'
print('a的值是:', a)
print('b的值是:', b)
print('c的值是:', c)
myfun(1, 2, 3)
myfun(4, 5, 6)
myfun(5, 6, 4)
序列传参:
序列传参是指在函数调用过程中,用*将序列拆解后按位置进行传递的传参方式
说明:
序列传参时,序列拆解的位置将与形参一一对应
序列的位置信息对应相应的参数位置
示例:
# 此示例示意序列传参
def myfun(a, b, c):
'这是一个函数传参的示例'
print('a的值是:', a)
print('b的值是:', b)
print('c的值是:', c)
s1 = [11, 22, 33]
s2 = (44, 55, 66)
s3 = "ABC"
myfun(*s1) # 等同于 myfun(s1[0], s1[1], s1[2]) # 11 -->a, 22 --> b, 33 --> c
myfun(*s2) # 等同于 myfun(s2[0], s2[1], s2[2])
myfun(*s3) # 等同于 myfun(s3[0], s3[1], s3[2])
关键字传参
关键字传参是指传参时,按着形参的名称给形参赋值
实参和形参按名称进行匹配
示例:
def myfun(a, b, c):
pass
myfun(b=22, c=33, a=11) # 11->a,22->b,33->c
myfun(c=66, b=55, a=44) # 44->a,55->b,66->c
说明:
实参和形参按着形参名进行匹配,可以不按位置进行匹配
示例:
# 此示例示意关键字传参
def myfun(a, b, c):
'这是一个函数传参的示例'
print('a的值是:', a)
print('b的值是:', b)
print('c的值是:', c)
myfun(c=33, b=22, a=11)
myfun(b=200, c=300, a=100)
myfun(a=100, b=200, c=300)
字典关键字传参:
是指实参为字典,将字典用 ** 拆解后进行关键字传参的方式
说明:
字典的键名和形参名一致
字典的键名必须为字符串(且为标识符的命名方式)
字典的键名要在形参中存在
示例:
# 此示例示意 字典关键字传参
def myfun(a, b, c):
'这是一个函数传参的示例'
print('a的值是:', a)
print('b的值是:', b)
print('c的值是:', c)
d1 = {'c': 300, 'b': 200, 'a': 100}
myfun(**d1) # myfun(a=100, b=200, c=300)
# myfun(a=d1['a'], b=d1['b'], c=d1['c']) # 100-->a 200-->b 300-->c
d2 = {'c': 300, 'b': 200, 'd': 400}
myfun(**d2)
函数的综合传参
函数的传参方式,在能确定形参能唯一匹配到相应实参的情况下可以任意组合
函数的位置传参要先于关键字传参
说明:
1. 位置传参和序列传参可以混合使用且可以顺序颠倒
如:
myfun(100, *[200, 300])
myfun(*[100, 200], 300)
myfun(*[100], 200, *[300])
2. 函数的关键字传参和字典关键字传参可以混合使用,且可以顺序颠倒
如:
myfun(c=300, **{'b':200, 'a': 100})
myfun(**{'b':200, 'c': 300}, a=100)
3. 位置传参和关键字传参可以混合使用,但位置传参要先于关键字传参:
如:
myfun(100, c=300, b=200)
myfun(10, c=30, **{'b': 20})
---------------以下讲函数的定义时如何定义形参--------
函数的缺省参数
语法:
def 函数名(形参名1=默认实参1, 形参名2=默认实参2, ... ):
语句块
示例:
def info(name, age=1, address='不详'):
print('我叫', name, '我今年',
age, '岁,我的住址:', address)
info('Eric', 25, '龙岗区')
info('Tom', 15) # <--两个参数调用
info('张飞')
# info() # 出错
说明:
缺省参数必须自右至左依次存在.如果一个参数有缺省参数,则其右侧的所有参数都必须有缺省参数
缺省参数可以有0个或多个,甚至全部都有缺省参数
示例:
def fn(a, b=10, c): # 错的
pass
def fn(a=100, b=200, c=300): # 对的
pass
函数形参的定义方式:
位置形参
星号元组形参
命名关键字形参
双星字典形参
位置形参
def 函数名(形参名1, 形参名2, ...):
语句块
星号元组形参
语法:
def 函数名(*元组形参名):
语句块
作用:
收集多余的位置传参
说明:
元组形参名一般命名为'args'
示例:
# 此示例示意星号元组形参的用法
def func(*args):
print("实参的个数是:", len(args))
print("args =", args)
func()
func(1, 2, 3, 4, 5)
func(1, 2, 3, 4, 5, 6, 7, 8, 9)
命名关键字形参:
语法:
def 函数名(*, 命名关键字形参):
语句块
或
def 函数名(*args, 命名关键字形参):
语句块
作用:
强制所有的参数都必须用关键字传参或字典关键字传参
示例:
# 此示例示意命名关键字传参
def fun(*, c, d):
print('c=', c)
print('d=', d)
# fun(3, 4) # 出错
fun(d=4, c=3) # 正确
def fun2(a, b, *, c, d): # *是位置形参和关键形参的分隔符
print(a, b, c, d)
fun2(1, 2, c=3, d=4)
def fun3(a, b, *args, c, d):
print(a, b, args, c, d)
fun3(11, 22, 33, 44, 55, d=400, c=300)
fun3(1, 2, **{'d': 4, 'c': 3})
双星号字典形参
语法:
def 函数名(**字典形参名):
语句块
作用:
收集多余的关键字传参
说明:
字典形参名一般命名为 kwargs
示例:
# 此示例示意双星号字典形参
def fun(**kwargs):
print("关键字传参的个数是:", len(kwargs))
print('kwargs=', kwargs)
fun(name='Eric', age=25, address='深圳市龙岗区')
fun(a=1, b="BBBB", c=[2, 3, 4], d=True)
fun(a=100, **{'c': 300, 'b': 200}, d=400)
函数的参数说明:
位置形参,缺省参数,星号元组形参,双星号字典形参等可以混合使用
函数参数自左至右的顺序为:
1. 位置形参
2. 星号元组形参
3. 命名关键字形参
4. 双星号字典形参
示例:
def fn(a, b, *args, c, **kwargs):
pass
fn(100, 200, 300, 400, d='D', e='E', c='C')
课后习题:
1. 写一个函数mysum(n) ,此函数用来计算
1+2+3+4+....+n的和
如:
print(mysum(100)) # 5050
2. 实现带有界面的学生信息管理系统
操作界面:
+-------------------------+
| 1) 添加学生信息 |
| 2) 显示学生信息 |
| 3) 删除学生信息 |
| 4) 修改学生信息 |
| q) 退出 |
+-------------------------+
请选择: 1
修改之前学生信息管理程序,学生信息依旧为:
姓名,年龄,成绩
要求: 每个功能写一个函数与之相对应
示例:
def main():
L = []
while True:
# 此处先显示菜单
s = input("请选择: ")
if s == 'q':
break
elif s == '1':
L += input_student()
elif s == '2':
output_student(L)
...
main()
想要看更多的课程请微信关注SkrEric的编程课堂