lambda
1>lambda是一个表达式
2>它没有名称,存储的也不是代码块,而是表达式
3>它被用作执行很小的功能,不能在里面使用条件语句
4>最常用的场合是filter里面的一些过滤的表达式,还有一些条件的判断处理,例如:
t = [1,2,3,4,5] fun = filter(lambda x:x > 3,t) print(list(fun)) # [4, 5]
lambda与函数
d = lambda x:x+1 if x>0 else "error" def add(x): return x+1
相同点
1>lambda 函数与add函数实现的功能一样;
2>lambda 也是可以直接使用三元运算符的,例如:
d = lambda x:x+1 if x>0 else "error" print(d(-2)) # 输出结果:error
3>也可以使用列表推导
g = lambda x:[(x,i) for i in range(0,10)] print(g(10)) #输出结果:[(10, 0), (10, 1), (10, 2), (10, 3), (10, 4), (10, 5), (10, 6), (10, 7), (10, 8), (10, 9)]
区别
1>lambda 没有return,其实是隐藏了一个return;而函数如果没有return,我们就无法得到函数的结果;
2>lambda 不可以在里面使用一些常规的if语句或者for语句、while语句等;
参数总结
位置匹配 func(name)
按照参数的顺序,引入参数的值
def func(arg1,arg2,arg3): return arg1,arg2,arg3 print(func(1,2,3)) # (1, 2, 3)
关键字匹配 func(key=value)
不需要一次赋值,如果没有赋值就使用默认值,如果赋值使用所赋的值
def func(k1='',k2=None,k3=''): return k1,k2,k3 print(func(k3=1,k1=5)) # (5, None, 1) print(func(k1=5,k3=1)) # (5, None, 1) print(func(k3=1,k1=5,k2=3)) # (5, 3, 1)
收集匹配
往fun中没有定义的位置参数中添加数据,会添加到*后面的元组或者是**后面的字典中
a.元组收集 func(name,arg1,arg2) *kargs
b.字典收集 func(name,key1=value1,key2=value2) **kwargs
def func2(*kargs,**kwargs): return kargs print(func2(2,3,4,5,[1,2,3,4],{1:2,3:4})) # (2, 3, 4, 5, [1, 2, 3, 4], {1: 2, 3: 4})
虽然我们没有定义一些常规的参数,但是,依旧被放在了kargs中,这就是收集匹配的意义
def func2(a,*kargs,**kwargs): return kargs print(func2(2,3,4,5,[1,2,3,4],{1:2,3:4})) # (3, 4, 5, [1, 2, 3, 4], {1: 2, 3: 4})
在前面添加一个自定义的a参数,发现输出结果比上个少了最前面一个。原因:函数在收集匹配的时候,会先过滤已经定义过的这些参数,把这些参数给匹配好以后,才会将其他的参数按照格式收集在kargs(元组)或者是kwargs(字典)中。
参数顺序
a.先是位置匹配的参数
b.再是关键字匹配的参数
c.收集匹配的元组参数
d.收集匹配的关键字参数def func2(a,d,b=4,*kargs,**kwargs): return kargs print(func2(2,3,4,5,[1,2,3,4],{1:2,3:4})) #(5, [1, 2, 3, 4], {1: 2, 3: 4})