4.6函数的默认(缺省)参数和不定长参数
4.6.1默认参数
函数在定义的时候就已经给这个参数赋了值。
(1)经验:
①默认参数可以不传实参,如果传递实参就修改默认参数的值
②定义默认参数的时候,默认参数要写到位置参数的后面。如果同时有*args和**kwargs以及默认参数,则顺序为:*args——默认参数——**kwargs
③默认参数可以关键字参数传值,但要写到位置参数的后面
(2)默认参数尽量不要是可变数据类型
4.6.2不定长参数
基本语法:
写法一:*args 不确定位置参数个数时,收集成元组
#*args:位置参数,收集成元组
def func1(*args):
print(args)
for i in args:
print(i)
func1('python', 28, 'man','meiguo')
写法二:**kwargs 不确定关键字参数个数时,合并成字典
# **kwargs :收集关键字参数,合并字典
def func2(**kwargs):
print(kwargs)
for key,value in kwargs.items():
print(key)
print(value)
func2(name='python',age=28,sex='man',weizhi='helan')
注意:
(1)在定义函数时,不定长参数都放到最后
(2)不定长参数可以不接收值
经典例子:
def func1(a, *args, b=1, **kwargs):
print(args)
for i in args:
print(i)
print(kwargs)
for key, value in kwargs.items():
print(key)
print(value)
func1(1,'name', 'python', 'age',28,b=2,name='python')
#注意:调用函数参数时的顺序为必须传递的参数在最左边,然后是多余的位置参数、关键字参数,最后是多余的关键字参数
4.7匿名函数(即:lambda表达式)
语法:
lambda 参数:返回值(or表达式)#注意:不需要写return
如:
print((lambda :100)())
f = lambda a,b : a + b
print(f(10, 20))
f = lambda a,b,c=100: a + b + c
print(f(10, 20,200))
print( (lambda *args:args)(20, 30, 40) ) #得到一个(20,30,40)的元组
#args的列表和a和b做合并
print((lambda *args,a=100,b=200:list(args) + [a, b])(10, 20, 30))
print((lambda **kwargs:kwargs)(name='python',age=28)) #返回一个字典
#实现键值对互转:
print((lambda **kwargs:{value:key for key,value in kwargs.items()})(name='python',age=28))
重要用途:
(1)lambda可以作为函数的一个参数使用
如:
def test(a, b, xxx):
return xxx(a, b)
result = test(11, 22, lambda x, y: x-y)
# 此处的减号可改为其它符号,改成什么符号做什么运算
print(result)
(2)带判断的lambda
#a,b,对比大小 返回最大值
print((lambda a,b :a if a>b else b)(1000, 20))
#a,b,c,对比大小 返回最大值
print((lambda a,b,c:c if c > (a if a>b else b) else (a if a>b else b))(100, 2000, 30))
(3)用在sort中可以按照键名快速排序
info_list=[
{'name':'zhansan','age':20},
{'name':'lisi','age':18},
{'name':'laowang','age':30}
]
info_list.sort(key=lambda info:info['age'],reverse=True)
print(info_list)