Python閉包思想與用法淺析
本文實(shí)例講述了Python閉包思想與用法。分享給大家供大家參考,具體如下:
淺談 python 的閉包思想
首先 python的閉包使用方法是:在方法A內(nèi)添加方法B,然后return
方法B 注意,return
的時(shí)候不要添加任何參數(shù),包括()
這樣,通過調(diào)用方法A 返回的是一個(gè)function 對象,如 demo=方法A 可以直接使用 demo(參數(shù)) 將調(diào)用方法B 這里不用關(guān)注方法B的方法名,
只需要關(guān)注參數(shù)就可以了,demo(參數(shù)) 這里的參數(shù)其實(shí)就是閉包的方法B的參數(shù),可以多個(gè)參數(shù)或者元祖一起使用。
其次 在Python中創(chuàng)建一個(gè)閉包可以歸結(jié)為以下三點(diǎn):
- 閉包函數(shù)必須有內(nèi)嵌函數(shù)
- 內(nèi)嵌函數(shù)需要引用該嵌套函數(shù)上一級namespace中的變量
- 閉包函數(shù)必須返回內(nèi)嵌函數(shù)
對,沒錯(cuò),python的裝飾器就是使用了閉包。
好吧,最后再舉個(gè)栗子:
def test1(prefix): def test2(name): print('test2閉包內(nèi):',name) def test3(*name1): print('test3 閉包內(nèi):',name1) return test3 m = test1('prefix') m("haha",'heihei')
打印結(jié)果:
D:\python\python.exe D:/Python_day/day1.py
test3 閉包內(nèi): ('haha', 'heihei')
這個(gè)例子說明,當(dāng)函數(shù) test1 的生命周期結(jié)束之后,test1('prefix')
中的參數(shù) prefix 這個(gè)變量依然存在,生命周期不會(huì)隨著函數(shù)調(diào)用結(jié)束而消失。
為啥要用閉包呢? 感覺這個(gè)功能一般啊,畢竟回調(diào)函數(shù)是死的,只能回調(diào)一個(gè),但是有個(gè)函數(shù)就是能生成無數(shù)個(gè)對象,嗯,是的,這玩意和類的功能有點(diǎn)相似。閉包可以被理解為一個(gè)只讀的對象,你可以給他傳遞一個(gè)屬性,但它只能提供給你一個(gè)執(zhí)行的接口,這就牽扯到的另一個(gè)特性:惰性求值
如:
# 偽代碼示意 class QuerySet(object): def __init__(self, sql): self.sql = sql self.db = Mysql.connect().corsor() # 偽代碼 def __call__(self): return db.execute(self.sql) def query(sql): return QuerySet(sql) result = query("select name from user_app") if time > now: print result # 這時(shí)才執(zhí)行數(shù)據(jù)庫訪問
上面這個(gè)不太恰當(dāng)?shù)睦诱故玖送ㄟ^閉包完成惰性求值的功能,但是上面query返回的結(jié)果并不是函數(shù),而是具有函數(shù)功能的類。有興趣的可以去看看Django的queryset的實(shí)現(xiàn),原理類似。
還有另一種用處:需要對某個(gè)函數(shù)的參數(shù)提前賦值的情況,當(dāng)然在Python中已經(jīng)有了很好的解決訪問 functools.parial
,但是用閉包也能實(shí)現(xiàn)。
如:
def partial(**outer_kwargs): def wrapper(func): def inner(*args, **kwargs): for k, v in outer_kwargs.items(): kwargs[k] = v return func(*args, **kwargs) return inner return wrapper @partial(age=15) def say(name=None, age=None): print name, age say(name="the5fire") # 當(dāng)然用functools比這個(gè)簡單多了 # 只需要: functools.partial(say, age=15)(name='the5fire')
對于工廠函數(shù)的理解,感覺和閉包類似,在創(chuàng)建主函數(shù)后返回的對象,可以直接傳參使用,其實(shí)這里返回的對象,就是一個(gè)類。
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python函數(shù)使用技巧總結(jié)》、《Python數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
python為Django項(xiàng)目上的每個(gè)應(yīng)用程序創(chuàng)建不同的自定義404頁面(最佳答案)
這篇文章主要介紹了python為Django項(xiàng)目上的每個(gè)應(yīng)用程序創(chuàng)建不同的自定義404頁面,本文給出了最佳答案,大家可以跟隨小編一起學(xué)習(xí)下2020-03-03python 根據(jù)excel中顏色區(qū)分讀取的操作
這篇文章主要介紹了python 根據(jù)excel中顏色區(qū)分讀取的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03Python利用PyPDF2庫實(shí)現(xiàn)輕松提取PDF文本
ython中的PyPDF2庫是一個(gè)非常有用的工具,無論您是需要分析PDF文檔中的內(nèi)容還是需要在文檔中搜索特定的信息,PyPDF2都可以幫助您輕松實(shí)現(xiàn)這些任務(wù),下面我們就來學(xué)習(xí)一下如何利用PyPDF2提取PDF文本吧2023-09-09python中的elasticsearch_dsl查詢語句轉(zhuǎn)換成es查詢語句詳解
這篇文章主要介紹了python中的elasticsearch_dsl查詢語句轉(zhuǎn)換成es查詢語句詳解,ElasticSearch在實(shí)際生產(chǎn)里通常和LogStash,Kibana,F(xiàn)ileBeat一起構(gòu)成Elastic?Stack來使用,它是這些組件里面最核心的一個(gè),需要的朋友可以參考下2023-07-07Python-apply(lambda x: )的使用及說明
這篇文章主要介紹了Python-apply(lambda x: )的使用及說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02