XZ_Python3之函数进阶

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})


猜你喜欢

转载自blog.csdn.net/understand_xz/article/details/79859892
今日推荐