匿名函数-lambda

匿名函数-lambda

匿名函数
    lambda [arg1 [,arg2,.....argn]]:expression

    lambda只是一个表达式,函数体比def简单很多。
    lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
    lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
    虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

    exp:
        dic = {'k1': 10, 'k2': 50, 'k3': 100, 'k4': 80}
        print(max(dic,key=lambda k:dic[k]))

    内置函数中参数带key的有以下:
    max min filter map sorted
    以上都可以通过和lambda合用完成一些功能

    exp2:
    现有两元组tup1,tup2,请使用匿名函数生产列表lst
    tup1 = (('a'),('b'))
    tup2 = (('c'),('d'))
    lst = [{'a':'c'},{'b':'d'}]

    写法1:自己写的
    lst = lambda x,y: [{(x[i][0]):y[i][0]} for i in range(len(x))]
    print(lst(tup1,tup2))
        [{'a': 'c'}, {'b': 'd'}]

    写法2:

    tup1 = (('a'),('b'))
    tup2 = (('c'),('d'))

    # lst = [{'a':'c'},{'b':'d'}]

    # ret = zip(tup1,tup2)

    # def func(t):
    #     return {t[0]:t[1]}
    # func = lambda t:{t[0]:t[1]}
    # res = map(lambda t:{t[0]:t[1]},zip(tup1,tup2))
    print(list(map(lambda t:{t[0]:t[1]},zip(tup1,tup2))))

    exp3.以下代码的输出是什么?请给出答案并解释。
    def multipliers():
        return [lambda x:i*x for i in range(4)]
    print([m(2) for m in multipliers()])
    请修改multipliers的定义来产生期望的结果。

    解析:
        def multipliers():
            return [lambda x : i *x for i in range(4)]  #返回列表推导式 [lambda x : i *x,lambda x : i *x,lambda x : i *x,lambda x : i *x]

        print([m(2) for m in multipliers()])
        # [m(2) for m in [lambda x : i *x,lambda x : i *x,lambda x : i *x,lambda x : i *x]]
        # multipliersw()为[lambda x : i *x,lambda x : i *x,lambda x : i *x,lambda x : i *x]

        # [m(2) for m in [lambda x : i *x,lambda x : i *x,lambda x : i *x,lambda x : i *x]]
        # m 为 lambda x : i *m,  4次
        # m(2)   [lambda x : i *2,lambda x : i *2,lambda x : i *2,lambda x : i *2]]
        #而此时multipliers()中的for循环已执行完,i最后的值为3
        # 所以 [lambda x : 3 *2,lambda x : 3 *2,lambda x : 3 *2,lambda x : 3 *2]]
        #[6, 6, 6, 6]

    exp4.以下代码的输出是什么?请给出答案并解释。
        def multipliers():
            return (lambda x : i *x for i in range(4))  #返回一个生成器 g =(lambda x : i *x for i in range(4)

        print([m(2) for m in multipliers()])

        # [m(2) for m in multipliers()]
        # [m(2) for m in (lambda x : i *x for i in range(4)]
        # [m(2) for m in (lambda x : 0 *x,lambda x : 1 *x,lambda x : 2 *x,lambda x : 3 *x]
        # [2 * 0,,2 * 1, 2 * 2,2 * 3]
        #[0,2,4,6]

  

猜你喜欢

转载自www.cnblogs.com/Felix-DoubleKing/p/9809866.html
今日推荐