Python基礎——匿名函式和閉包函式
阿新 • • 發佈:2019-01-12
一.匿名函式:
在定義函式的時候,不想給函式起一個名字。這個時候就可以用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 中怎麼建立閉包:
三點:
- 閉包函式必須有內嵌函式
- 內嵌函式需要引用該巢狀函式上一級namespace中的變數
- 閉包函式必須返回內嵌函式