1. 程式人生 > >Python基礎——匿名函式和閉包函式

Python基礎——匿名函式和閉包函式

一.匿名函式:

   在定義函式的時候,不想給函式起一個名字。這個時候就可以用lambda來定義一個匿名函式

   語法:

   變數名= lambda 引數:表示式(block)

   引數:可選,通常以逗號分隔的變量表達式形式,也就是位置引數

   表示式:不能包含迴圈、return,可以包含if...else...,返回值就是該表示式的結果。

  注意:

   -表示式中不能包含 迴圈,return

   -可以包含 if...else...語句.

   -表示式計算的結果直接返回

1.建立一個匿名函式:

func = lambda :3<2

ret = func()

print(ret)

輸出結果:False

 

2.建立一個帶引數的匿名函式:

func = lambda x,y:x+y

ret = func(1,2)

print(ret)

輸出結果:3

 

3.小練習:求兩個數的最大值

func = lambda x,y:x if x>y else y

# 注意if 和else 沒有 : 不能換行,if判斷體寫在判斷條件前面。

ret = func(100,200)  # 傳入實參

print(ret)

輸出結果:200

 

4.使用max()求出字典的最大值:

# 一般函式:

dic = {'k1':20,'k2':100,'k3':50}

def func_dic(key):
    return dic[key]

ret = max(dic,key=func_dic)

print(ret)

輸出結果:k2

匿名函式:

dic = {'k1':20,'k2':100,'k3':50}

ret = max(dic,key=lambda x:dic[x])

print(ret)

輸出結果:k2

5.現有兩個元組(('a'),('b')),(('c'),('d')),請使用匿名函式生成列表[{'a':'c'},{'b':'d'}]

tup1=(('a'),('b'))
tup2=(('c'),('d'))
ret = zip(tup1,tup2)  # 用zip()來得出tuple型別的元素


ret1 = list(map(lambda tup:{tup[0]:tup[1]},ret))   # 利用索引

print(ret1)

輸出結果:[{'a': 'c'}, {'b': 'd'}]

 

 

二.閉包函式:

1.定義:

     內部函式包含對外部作用域而非全劇作用域名字的引用,該內部函式稱為閉包函式

# 函式內部定義的函式稱為內部函式

2.建立閉包函式:

ef say_hello(name):

    def inner():
        print('hello:',name)

    return inner
ret = say_hello('zs')

ret()      # 前面用宣告宣告變數 承接返回的值, 
           # 呼叫內部函式時就用該變數名呼叫,因為返回承接的都是
           #  函式的地址

輸出結果:hello:zs

 

3.判斷閉包函式:

判斷閉包函式的方法__closure__

輸出的__closure__是一個cell物件表示是閉包函式輸出的是None 表示不是閉包函式。

ef say_hello(name):

    def inner():
        print('hello:',name)

    print(inner.__closure__)   # 判斷閉包函式

    return inner
ret = say_hello('zs')

ret()      # 前面用宣告宣告變數 承接返回的值, 
           # 呼叫內部函式時就用該變數名呼叫,因為返回承接的都是
           #  函式的地址

輸出結果:(<cell at 0x00000000004D7468: str object at 0x0000000001E7C5E0>,)
                    hello: zs

4.python 中怎麼建立閉包:

三點:

  1. 閉包函式必須有內嵌函式
  2. 內嵌函式需要引用該巢狀函式上一級namespace中的變數
  3. 閉包函式必須返回內嵌函式