1. 程式人生 > >匿名函式-lambda

匿名函式-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]