day14_作业


#一 形参与实参介绍
#形参:在函数定义阶段定义的参数,相当于变量名
# def func(x,y):
# print(x,y)

#实参:在调用函数阶段传入的值称之为实参,相当于变量值
# func(1,2)

#形参与实参的关系
#在调用阶段,实参的值会赋值给形参(变量值===》形参)
#这种绑定关系只能在函数体内使用
#实参与形参的绑定关系在函数调用时生效,函数调用结束后解除绑定关系

#实参是传入值,值可以是以下几种形式
#形式一:
# func(1,2)

#形式二
# a=1
# b=2
# func(a,b)

#形式三:只要结果是一个值,放什么都行
# func(int('1'),2)



#二形参与实参的具体使用

#2.1 位置参数:按照从左到右的顺序依次定义的参数

#位置形参:在函数定义阶段,按照从左到右的顺序直接定义的“变量名”
# 特点:必须被传值,多一个少一个都不行

# def func(x,y):
# print(x,y)

#位置实参:在函数调用阶段,按照从左到右的顺序依次传入的值
# 特点:按照顺序与形参一一对应

# func(1,2)



#2.1 关键字参数
#关键字实参:在函数调用阶段,按照key=value的形式传入值
# 特点:指名道姓的给某给形参传值,可以不参照顺序
# def func(x,y):
# print(x,y)
# # func(y=2,x=1)


# 混合使用:强调
#1 位置实参必须放在关键字实参前面
# func(1,y=2) #正确
# func(y=1,2) #提示语法错误

#2 不能为同一个新参重复传值
# func(1,y=2,x=3) #报错


#2.3 默认参数
#默认新参:在定义函数阶段,就已经被赋值的形参称之为默认形参
# 特点,在调用阶段可以不用为其赋值(不是不能赋值)

# def func(x,y=3):
# print(x,y)
# func(1)
# func(1,444) #输出:1 444


# def register(name,age,sex='男'):
# print(name,age,sex)
#
# register('三炮',18)
# register('二炮',28)
# register('大炮',19)
# register('没炮',20,'女')

#位置形参与默认形参混用,强调:
#1 位置形参必须在默认形参的左边
# def func(x,y=2): #def func(y=2,x) 这样就会报错
# pass

#2 默认参数的值是在函数定义阶段被赋值的,被赋予的是值的内存地址

#示范一
# m=2
# def func(x,y=m): #定义阶段:y=>2的内存地址,对于y来说内存地址就不会更改了
# print(x,y)
#
# m=333
# func(1) #输出:1 2


#示范二
# m=[111]
# def func(x,y=m): #定义阶段:y=>m的内存地址,对于y来说内存地址就不会更改了
# print(x,y)
#
# m.append(3333) #这一步m的内存地址没变
# func(1) #输出:1 [111, 3333]


#示范三 虽然默认值可以被指定为任意数据类型,但是不推荐使用可变类型,即不推荐使用示范二形式
#函数定义应该遵循的原则:函数的调用只跟函数本身有关系,不受外界代码影响

# def func(x,y,z,l=None):
# if l is None:
# l=[]
# l.append(x)
# l.append(y)
# l.append(z)
# print(l)
#
# new_l=[111,222]
# func(1,2,3,new_l) #[111, 222, 1, 2, 3]



#2.4 可变长度的参数(*与*的用法)
#可变长度指的是在调用函数时,传入的值(实参)的个数不固定
#而实参是用来为形参赋值的,所以针对溢出的实参必须有对应的形参来接收


#2.4.1 可变长度的位置参数
#I: *形参名 :用来接收溢出的位置实参,溢出的位置实参会被 * 保存成【元组】的格式
# 然后将元组赋值给紧跟其后的位置实参
# * 后面跟的是任意名字,但是约定俗成的是 跟 args


# def func(x,y,*z):
# print(x,y,z)
#
# func(1,2,3,4,5,6) #输出 1 2 (3, 4, 5, 6)


#接收溢出的位置实参
# def my_sum(*args):
# res = 0
# for item in args:
# res += item
# return res
#
# sum=my_sum(1,2,3,4,5,6)
# print(sum) #s输出 21



#II:* 可以用在实参中,只要后面接的是可以被for循环的类型即可 实参中带 * ,先将 * 后面的值打散成位置实参
# def func(x,y,z):
# print(x,y,z)
#
#
# func(*[11,22,33]) # 相当于func(11,22,33) 输出 11 22 33
# l=[11,22,33]
# func(*l)


#III 形参与实参中都带 *
# def func(x,y,*args): # args=([3,4,5,6])
# print(x,y,args)
#
# func(1,2,[3,4,5,6]) #1 2 ([3, 4, 5, 6],)
# func(1,2,*[3, 4, 5, 6]) #先打散成func(1,2,3,4,5,6) 输出; 1 2 (3, 4, 5, 6)

# func(*'hello') #打散成func('h','e','l','l','o') 然后传值,输出:h e ('l', 'l', 'o')





#2.4.2 可变长的关键字参数
# I **形参名;用来接收溢出的关键字参数,**将溢出的关键字实参保存成【字典】格式
# 然后赋值给紧跟其后的形参名
# ** 后面跟的是任意名字,但是约定俗成的是跟 kwargs

# def func(x,y,**kwargs):
# print(x,y,kwargs)
#
# func(1,y=2,a=1,b=2,c=3) #输出: 1 2 {'a': 1, 'b': 2, 'c': 3}




#II:** 可以用在实参中(**后面跟的是只能是字典) 实参中带 ** ,先将 ** 后面的值打散成关键字实参
# def func(x,y,z):
# print(x,y,z)
#
# # func({'x':1,'y':2,'z':3}) #报错,将字典赋值给x, y,z没有值
# func(*{'x':1,'y':2,'z':3}) #func('x','y','z') 相当于for循环字典,只能取出来key 正确 输出 x y z
# func(**{'x':1,'y':2,'z':3}) #func(x=1,y=2,z=3) 正确 输出 1 2 3
# func(**{'x':1,'y':2}) #少一个不行,报错
# func(**{'x':1,'a':2,'y':2}) #报错,形参中没有a



#III 形参与实参中都带 **
# def func(x,y,**kwargs):
# print(x,y,kwargs)
#
# #func(y=222,x=111,a=333,b=444)
# func(**{'y':222,'x':111,'a':333,'b':444}) #输出 111 222 {'a': 333, 'b': 444}



#混用* 与 **
# *args 必须在**kwargs之前

# def func(*args,**kwargs):
# print(args)
# print(kwargs)
#
# func(1,2,3,4,4,5,5,6,6,x=1,y=2,z=3)
#
# #(1, 2, 3, 4, 4, 5, 5, 6, 6) *args接收
# # {'x': 1, 'y': 2, 'z': 3} **kwagrs接收

# def index(x,y,z):
# print('index:==>>', x, y, z)
#
#
# def wrapper(*args,**kwargs):
# index(args,kwargs)

# wrapper(1,2,3) #为wrapper其实是给index使用的

# def index(x, y, z):
# print(x, y, z)
#
#
# def wrapper(*args, **kwargs): # (1)agrs=(1,),kwargs={'y':2,'z':3}
# index(*args, **kwargs)
#
# #(2) index(*(1,),**{'y':2,'z':3})
# # (3) index(1,z=3,y=2) wrapper()传的格式会原封不动的传给index()
# # 所以给wrapper()传值规则应该遵循index()的规则
#
#
# wrapper(1, z=3, y=2)
posted @ 2020-12-31 15:42  欢乐二次方  阅读(73)  评论(0)    收藏  举报