函数的参数
函数的参数
- 函数的参数:实参,形参
- 形参角度:位置参数、万能参数(*args)、默认参数、仅限关键字参数、万能参数( *kwargs)
- 实参角度:位置参数、关键字参数、混合参数
- 实参和形参必须从左至右一一对应,不能多或少
def count(a,b): #形参
if a>b:
return a
else:
return b
ret=count(in1,in2) #实参
print(ret)
- 关键字参数
- 关键字传参的内容可以实参和形参不一一对应,但长度一定要一样
def baoli(age,name): #关键字传参的内容可以实参和形参不一一对应,但长度一定要一样
s='我叫%s,今年%s岁'%(name,age)
return s
ret=baoli(name='xiaoxiannv',age=21)
print(ret)
-
默认参数值(一般放在形参最后面)
-
默认参数值就是把形参里面的值固定死,但是实参里有参数会对实参进行覆盖
-
特点,形参何实参的长度可以不一样
-
如果默认参数指向的是可变的数据类型,那么你无论调用多少次这个默认参数,内存地址都是使用的同一个(函数中传参可变类型传的是引用,不可变类型传的是值)
#实例一 alist=[1,2,3] def func(n,alist): alist.append(n) return alist ret=func(100,alist) print(ret,id(ret)) ret=func(200,alist) print(ret,id(ret)) # [1, 2, 3, 100] 2083055027848 # [1, 2, 3, 100, 200] 2083055027848 #实例二 def func(a,alist=[]): alist.append(a) return alist print(func(10,)) print(func(20,[])) print(func(100,)) # [10] # [20] # [10,100] #实例三 def func(a,b): alist=[] alist.append(a) alist.append(b) return alist print(func(10,20)) print(func(30,40)) print(func(50,60)) # [10, 20] # [30, 40] # [50, 60] #实例四 def func(a,b,alist=[]): alist.append(a) alist.append(b) return alist print(func(10,20)) print(func(30,40)) print(func(50,60)) # [10, 20] # [10, 20, 30, 40] # [10, 20, 30, 40, 50, 60]
-
# 默认参数值
def baoli(age,name='xiaoxiannv'): #默认参数值就是把形参里面的值固定
s='我叫%s,今年%s岁'%(name,age)
return s
ret=baoli(age=21)
print(ret)
得:我叫xiaoxiannv,今年21岁
def baoli(age,name='xiaoxiannv'): #默认参数值就是把形参里面的值固定死,但是实参里有参数会对实参进行覆盖
s='我叫%s,今年%s岁'%(name,age)
return s
ret=baoli(age=21,name='xiaoxiannv')
print(ret)
得:我叫xiaoxiannv,今年21岁
- 万能参数 *args , **kwargs
- 函数定义时,*代表聚合,他将实参的所有位置参数聚合成一个元组,赋值给args
- 函数定义时,*代表聚合,他将实参的所有关键字参数聚合成一个字典,赋值给 **kwargs
def baoli(*args):
s='我是%s,性别%s,今年%s岁,学历%s\n'%(name,gender,age,edu)
return s
while True:
name=input('请输入姓名(输入Q退出!):')
if name.upper()=='Q':break
age=input('请输入年龄:')
gender=input('请输入性别:')
edu=input('请输入学历:')
ret=baoli(name, age, edu,gender)
print(ret)
def count(**kwargs):
return kwargs
ret=count(name='xiaoxiannv',gender='女')
print(ret)
得:{'name': 'xiaoxiannv', 'gender': '女'}
- 仅限关键字参数
- 放在*args和**kwargs之间
- c必须写关键字参数,否则报错
def count(*args,c,**kwargs):
return kwargs,c
ret,c=count(name='xiaoxiannv',gender='女',c=666)
print(ret,c)
*、**的使用
- *在函数定义时代表聚合,返回一个元组
- **在函数定义时代表聚合,返回一个字典
- *在函数调用时代表打散(可以打散列表,字符串,元组,集合),返回一个元组
- **在函数调用时代表打散字典,返回一个字典(如果是多个字典进行打散,则打散后返回的是一整个字典)
def baoli(*args,**kwargs): #聚合
return args,kwargs
a,b=baoli(*'ohgfgf',*{1,2,3},**{'name':'xiaoxiannv','age':21},**{'gender':'男'})#打散
print(a,b)
得:('o', 'h', 'g', 'f', 'g', 'f', 1, 2, 3) {'name': 'xiaoxiannv', 'age': 21, 'gender': '男'}