Python閉包及裝飾器運行原理解析
一、閉包
閉包從形式上來說是在外部函數(shù)中定義內(nèi)部函數(shù),并且內(nèi)部函數(shù)引用了外部函數(shù)的變量,此變量叫做自由變量。
或者說是將組成函數(shù)的語句和這些語句的執(zhí)行環(huán)境打包在一起。
閉包滿足的條件:
必須有一個內(nèi)嵌函數(shù)
內(nèi)嵌函數(shù)必須使用外部函數(shù)的變量
外部函數(shù)的返回值必須是內(nèi)嵌函數(shù)
def closure(): value = [] def fun(tmp): value.append(tmp) return value return fun cc = closure() cc(0) #[0] 等同于closure(fun(0)) cc(1) #[0,1] cc(2) #[0,1,2]
外部函數(shù)closure中有變量value和內(nèi)部函數(shù)fun,并且內(nèi)部函數(shù)fun引用了自由變量value,當(dāng)執(zhí)行cc = closure()時,就產(chǎn)生了一個閉包fun,該閉包持有只有變量value,當(dāng)函數(shù)closure生命周期結(jié)束后,value依然存在,因為它被閉包引用了。
二、裝飾器
裝飾器其實就是閉包的應(yīng)用,只不過其傳遞的是函數(shù)。
def add_time(fun):
def wrapper():
print('time: 12:00')
return fun()
return wrapper
def add_format(fun):
def wrapper():
print('\n')
return fun()
return wrapper
@add_format #等同于demo = add_format(add_time(demo))
@add_time #等同于 demo = add_time(demo)
def demo():
return 'hello world!'
另外,裝飾器會將demo函數(shù)的元信息丟失,例如__name__等等。
例如demo函數(shù)的__name__會由'demo'變成了'wrapper',這時需要用到functools庫,在wrapper函數(shù)前加上@functools.wraps(fun):
import functools
def add_time(fun):
@functools.wraps(fun)
def wrapper():
print('time: 12:00')
return fun()
return wrapper
def add_format(fun):
@functools.wraps(fun)
def wrapper():
print('\n')
return fun()
return wrapper
@add_format #等同于demo = add_format(add_time(demo))
@add_time #等同于 demo = add_time(demo)
def demo():
return 'hello world!'
例如給任意函數(shù)加上打印時間的功能的裝飾器:
def metric(fn):
start=time.time()
@functools.wraps(fn)
def wrapper(*args,**kw):
end=time.time()
print('%s executed in %s ms' % (fn.__name__,start-end))
return fn(*args,**kw)
return wrapper
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
全網(wǎng)最全python庫selenium自動化使用詳細(xì)教程
這篇文章主要介紹了python庫selenium自動化使用詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-01-01
python實現(xiàn)網(wǎng)站微信登錄的示例代碼
這篇文章主要介紹了python實現(xiàn)網(wǎng)站微信登錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
如何在scrapy中集成selenium爬取網(wǎng)頁的方法
這篇文章主要介紹了如何在scrapy中集成selenium爬取網(wǎng)頁的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
python使用paramiko模塊通過ssh2協(xié)議對交換機進行配置的方法
今天小編就為大家分享一篇python使用paramiko模塊通過ssh2協(xié)議對交換機進行配置的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
python 根據(jù)csv表頭、列號讀取數(shù)據(jù)的實現(xiàn)
這篇文章主要介紹了python 根據(jù)csv表頭、列號讀取數(shù)據(jù)的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05
一文帶你深入理解Flask中的Session和Cookies
Flask,作為一個靈活的微型 web 框架,提供了會話(Session)和 Cookies 管理的能力,本文將深入探討 Flask 中的會話和 Cookies 的概念、工作機制以及應(yīng)用實例,希望對大家有所幫助2023-12-12
Python計數(shù)器collections.Counter用法詳解
本文主要介紹了Python計數(shù)器collections.Counter用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
python實戰(zhàn)串口助手_解決8串口多個發(fā)送的問題
今天小編就為大家分享一篇python實戰(zhàn)串口助手_解決8串口多個發(fā)送的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06

