day09
pyhthon函数的参数传递
传递方式:
位置传参
序列传参
关键字传参
字典关键字传参
位置传参:
实际参数(实参)的对应关系与形式参数(形参)的对应关系
是接位置来依次对应的
示例:
def mymin(a,b,c):
pass
mymin(1,2,3) #1,2,3位置对应关系传给a,b,c
说明:
实际参数和形式参数通过位置进行传递和匹配
实际参数的个数必须与形式参数的个数相同
示例见:
posittional_give_args.py
序列传参:
序列传参是指在函数调用过程中,
用*将序列拆解后按位置进行传递的传参方式
说明:
序列传参时,序列拆解的位置将与形参一一对应
序列的位置信息对应相应的参数位置
示例见:
sequence_give_args.py
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])
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)
说明:
实参和形参按着形参名进行匹配,可以不按位置进行匹配
示例见:
keywords_give_args.py
def myfun(a, b, c):
print("a的值是:",a)
print("b的值是:",b)
print("c的值是:",c)
myfun(c=33,b=22,a=11)
myfun(b=44,c=10,a=5)
字典关键字传参:
是指实参为字典,将字典用**拆解后进行关键字传参的方式
说明:
字典的键名与形参名一致
字典的键名必须为字符串(且为标识符的命名方式)
字典的键名要在形参中存在
示例见:
dict_keywords_give_args.py
def myfun(a, b, c):
print("a的值是:",a)
print("b的值是:",b)
print("c的值是:",c)
d = {"c":300,"b":200,"a":100}
myfun(**d1) # myfun(a=100,b=200,c=300)
函数的综合传参
函数的传参方式,在能确定形参能唯一匹配到实参的情况下
可以任意组合
函数的位置传参要先于关键字传参
说明:
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})
练习一:
写一个函数 getminmax(a,b,c)有三个参数
此函数用于返回三个数的最大值,最小值
形成元组后返回
元组格式:
(最大值,最小值)
可以尝试三种传参方式
-------------以下讲函数定义时如何定义形参--------------
函数的缺省参数
语法:
def 函数名(形参名1=默认实参1,形参名2=默认实参2,...):
语句块
示例见:
default_args.py
说明:
缺省参数必须自右至左依次存在,如果一个参数有缺省参数,
则其右侧的所有参数都必须有缺省参数
缺省参数可以有0个或多个,甚至全部都有缺省参数
示例:
def fn(a, b=10, c): # 错的
pass
def fn(a=100, b=200, c=300): # 对的
pass
练习二:
写一个函数myadd,此函数可以计算两个,三个,四个实参的和
如:
def myadd(...):
...
print(myadd(100,200))
print(myadd(100,200,300))
print(myadd(100,200,300,400))
print(myadd(100,200,400,500,600)) #报错
缺省参数运算符左右不加空格
练习三:
写一个myrange函数,此函数用给定的参数返回
一个存有对应整数的列表
如:
def myrange(start,stop=None,sep=1):
....
L = myrange(5) # L = [0,1,2,3,4]
L = myrange(5,10) #L = [5,6,7,8,9]
L = myrange(5,10,2) # L = [5,7,9]
for x in myrange(5,10,2):
print(x) #5 7 9
函数形参的定义方式:
位置形参
星号元组
命名关键字形参
双星字典形参
位置形参
def 函数名(形参名1,形参名2,...)
语句块
如:sum() pow()
星号元组形参
def 函数名(*元组形参名)
语句块
如:print()
作用:
收集多余的位置传参
说明:
元组命名一般是'args'
示例见:
star_tuple_args.py
练习四:
写一个函数 mysum
可以传入任意个实参的数字,返回所有实参的和
def mysum(*args):
...
print(mysum(1,2,3,4))
print(mysum(1,2,3,4,5,6))
练习五:
已知内建函数max帮助文档为:
help (max)
max(iterable)
max(arg1,arg2,*arg)
仿造max,写一个mymax函数,功能要求与max完全相同
(要求,不允许调用max函数)
print(mymax([6,8,3,5]))
print(mymax([100,200]))
print(mymax([1,3,5,7,9]))
命名关键字形参:
语法:
def 函数名(*,命名关键字形参)
语句块
或
def 函数名(*args,命名关键字形参)
注:* 和*args 只能存在一个,不能同时使用
作用:
强制所有的参数都必须用关键字传参或字典关键字传参
示例:
named_keyword_args.py
双星字典形参
语法:
def 函数名(**字典形参名)
语句块
作用:
收集多余的关键字传参
说明:
字典形参名一般命名为kwargs
示例见:
double_star_args.py
函数的参数说明:
位置形参,缺省参数,星号元组形参,双星号字典形参等可以混合使用
函数参数自左至右的顺序为:
1.位置形参
2.星号元组形参
3.命名关键字形参
4.双星号字典形参
示例:
def fn(a,b,*args,c,**kwargs):
pass
fn(100,200,300,400,d='D',e='E',c='C')
思考:
查看>>>help(print)
猜想print函数的参数列表是如何定义的
def myprint(*args,sep,end):
课后练习:
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()