最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中with上下文管理協(xié)議的作用及用法

 更新時(shí)間:2022年03月18日 14:29:32   作者:king_weng  
這篇文章主要介紹了Python中with的作用及用法,with是從Python2.5引入的一個(gè)新的語法,它是一種上下文管理協(xié)議,下文更多詳細(xì)內(nèi)容介紹需要的小伙伴可以參考一下

1、簡(jiǎn)介

       with是從Python2.5引入的一個(gè)新的語法,它是一種上下文管理協(xié)議,目的在于從流程圖中把 try,except 和finally 關(guān)鍵字和資源分配釋放相關(guān)代碼統(tǒng)統(tǒng)去掉,簡(jiǎn)化try…except…finlally的處理流程。

       那我們先理解一下try…except…finally語句是干啥的。實(shí)際上,try…except語句和try…finally語句是兩種語句,用于不同的場(chǎng)景。但是當(dāng)二者結(jié)合在一起時(shí),可以“實(shí)現(xiàn)穩(wěn)定性和靈活性更好的設(shè)計(jì)”。

2、try… except語句

       用于處理程序執(zhí)行過程中的異常情況,比如語法錯(cuò)誤、從未定義變量上取值等等,也就是一些python程序本身引發(fā)的異常、報(bào)錯(cuò)。而try… except語句就是為了防止一些報(bào)錯(cuò)影響你的程序繼續(xù)運(yùn)行,就用try語句把它們抓出來(捕獲)。

(1)try…except的標(biāo)準(zhǔn)格式

try: ?
? ? ## normal block ?
except A: ?
? ? ## exc A block ?
except: ?
? ? ## exc other block ?
else: ?

(2)程序執(zhí)行流程

–>執(zhí)行normal block
–>發(fā)現(xiàn)有A錯(cuò)誤,執(zhí)行 exc A block(即處理異常)
–>結(jié)束
如果沒有A錯(cuò)誤呢?
–>執(zhí)行normal block
–>發(fā)現(xiàn)B錯(cuò)誤,開始尋找匹配B的異常處理方法,發(fā)現(xiàn)A,跳過,發(fā)現(xiàn)except others(即except:),執(zhí)行exc other block
–>結(jié)束
如果沒有錯(cuò)誤呢?
–>執(zhí)行normal block
–>全程沒有錯(cuò)誤,跳入else 執(zhí)行noError block
–>結(jié)束

(3)異常分類

       except后面還能跟表達(dá)式的! 所謂的表達(dá)式,就是錯(cuò)誤的定義。也就是說,我們可以捕捉一些我們想要捕捉的異常。而不是什么異常都報(bào)出來。

異常分兩類:

  • python標(biāo)準(zhǔn)異常
  • 自定義異常

(a)Python標(biāo)準(zhǔn)異常

      Python標(biāo)準(zhǔn)異常包括NameError(未聲明/初始化對(duì)象,沒有屬性),MemoryError內(nèi)存溢出錯(cuò)誤等錯(cuò)誤,

詳細(xì)python標(biāo)準(zhǔn)異常詳見:

異常名稱描述
BaseException所有異常的基類
SystemExit解釋器請(qǐng)求退出
KeyboardInterrupt用戶中斷執(zhí)行(通常是輸入^C)
Exception常規(guī)錯(cuò)誤的基類
StopIteration迭代器沒有更多的值
GeneratorExit生成器(generator)發(fā)生異常來通知退出
StandardError所有的內(nèi)建標(biāo)準(zhǔn)異常的基類
ArithmeticError所有數(shù)值計(jì)算錯(cuò)誤的基類
FloatingPointError浮點(diǎn)計(jì)算錯(cuò)誤
OverflowError數(shù)值運(yùn)算超出最大限制
ZeroDivisionError除(或取模)零 (所有數(shù)據(jù)類型)
AssertionError斷言語句失敗
AttributeError對(duì)象沒有這個(gè)屬性
EOFError沒有內(nèi)建輸入,到達(dá)EOF 標(biāo)記
EnvironmentError操作系統(tǒng)錯(cuò)誤的基類
IOError輸入/輸出操作失敗
OSError操作系統(tǒng)錯(cuò)誤
WindowsError系統(tǒng)調(diào)用失敗
ImportError導(dǎo)入模塊/對(duì)象失敗
LookupError無效數(shù)據(jù)查詢的基類
IndexError序列中沒有此索引(index)
KeyError映射中沒有這個(gè)鍵
MemoryError內(nèi)存溢出錯(cuò)誤(對(duì)于Python 解釋器不是致命的)
NameError未聲明/初始化對(duì)象 (沒有屬性)
UnboundLocalError訪問未初始化的本地變量
ReferenceError弱引用(Weak reference)試圖訪問已經(jīng)垃圾回收了的對(duì)象
RuntimeError一般的運(yùn)行時(shí)錯(cuò)誤
NotImplementedError尚未實(shí)現(xiàn)的方法
SyntaxErrorPython 語法錯(cuò)誤
IndentationError縮進(jìn)錯(cuò)誤
TabErrorTab 和空格混用
SystemError一般的解釋器系統(tǒng)錯(cuò)誤
TypeError對(duì)類型無效的操作
ValueError傳入無效的參數(shù)
UnicodeErrorUnicode 相關(guān)的錯(cuò)誤
UnicodeDecodeErrorUnicode 解碼時(shí)的錯(cuò)誤
UnicodeEncodeErrorUnicode 編碼時(shí)錯(cuò)誤
UnicodeTranslateErrorUnicode 轉(zhuǎn)換時(shí)錯(cuò)誤
Warning警告的基類
DeprecationWarning關(guān)于被棄用的特征的警告
FutureWarning關(guān)于構(gòu)造將來語義會(huì)有改變的警告
OverflowWarning舊的關(guān)于自動(dòng)提升為長整型(long)的警告
PendingDeprecationWarning關(guān)于特性將會(huì)被廢棄的警告
RuntimeWarning可疑的運(yùn)行時(shí)行為(runtime behavior)的警告
SyntaxWarning可疑的語法的警告
UserWarning用戶代碼生成的警告

例:

 ? try:
? ? ? ? a = 1 / 2
? ? ? ? print(a)
? ? ? ? print(m) ?# 此處拋出python標(biāo)準(zhǔn)異常
? ? ? ? b = 1 / 0 ?# 此后的語句不執(zhí)行
? ? ? ? print(b)
? ? ? ? c = 2 / 1
? ? ? ? print(c)
? ? except NameError:
? ? ? ? print("Ops!!")
? ? except ZeroDivisionError:
? ? ? ? print("Wrong math!!")
? ? except:
? ? ? ? print("Error")

輸出:

3、try…finallly語句

       try…finallly語句用于無論執(zhí)行過程中有沒有異常,都要執(zhí)行清場(chǎng)工作。

格式:

try: ?
? ? execution block ?##正常執(zhí)行模塊 ?
except A: ?
? ? exc A block ##發(fā)生A錯(cuò)誤時(shí)執(zhí)行 ?
except B: ?
? ? exc B block ##發(fā)生B錯(cuò)誤時(shí)執(zhí)行 ?
except: ?
? ? other block ##發(fā)生除了A,B錯(cuò)誤以外的其他錯(cuò)誤時(shí)執(zhí)行 ?
else: ?
? ? if no exception, jump to here ##沒有錯(cuò)誤時(shí)執(zhí)行 ?
finally: ?
final block ?##總是執(zhí)行 ?

tips: 注意順序不能亂,否則會(huì)有語法錯(cuò)誤。如果用else就必須有except,否則會(huì)有語法錯(cuò)誤。

例:   

 ?try:
? ? ? ? a = 1 / 2
? ? ? ? print(a)
? ? ? ? print(m) ?# 拋出NameError異常
? ? ? ? b = 1 / 0
? ? ? ? print(b)
? ? ? ? c = 2 / 1
? ? ? ? print(c)
? ? except NameError:
? ? ? ? print("Ops!!") ?# 捕獲到異常
? ? except ZeroDivisionError:
? ? ? ? print("Wrong math!!")
? ? except:
? ? ? ? print("Error")
? ? else:
? ? ? ? print("No error! yeah!")
? ? finally: ?# 是否異常都執(zhí)行該代碼塊
? ? ? ? print("finally!")

輸出:

4、with…as語句

(1)With語句的基本語法

       with通過__enter__方法初始化,然后在__exit__中做善后以及處理異常。其中__enter__()方法在語句體(with語句包裹起來的代碼塊)執(zhí)行之前進(jìn)入運(yùn)行,__exit__()方法在語句體執(zhí)行完畢退出后運(yùn)行。

       with 語句適用于對(duì)資源進(jìn)行訪問的場(chǎng)合,確保不管使用過程中是否發(fā)生異常都會(huì)執(zhí)行必要的“清理”操作,釋放資源,比如文件使用后自動(dòng)關(guān)閉、線程中鎖的自動(dòng)獲取和釋放等。

With語句的基本語法格式:

with expression [as target]:
with-block ?
  • expression:是一個(gè)需要執(zhí)行的表達(dá)式;
  • target:是一個(gè)變量或者元組,存儲(chǔ)的是expression表達(dá)式執(zhí)行返回的結(jié)果,可選參數(shù)。

(2)with語句原理

  • 上下文管理協(xié)議(Context Management Protocol):包含方法 __enter__()和__exit__(),支持該協(xié)議的對(duì)象要實(shí)現(xiàn)這兩個(gè)方法。
  • 上下文管理器(Context Manager):支持上下文管理協(xié)議的對(duì)象,這種對(duì)象實(shí)現(xiàn)了__enter__()和__exit__()方法。上下文管理器定義執(zhí)行with語句時(shí)要建立的運(yùn)行時(shí)上下文,負(fù)責(zé)執(zhí)行with語句塊上下文中的進(jìn)入與退出操作。通常使用with語句調(diào)用上下文管理器,也可以通過直接調(diào)用其方法來使用。

例:執(zhí)行過程

with EXPR as VAR:
? ? BLOCK

(1)執(zhí)行EXPR,生成上下文管理器context_manager;

(2)獲取上下文管理器的__exit()__方法,并保存起來用于之后的調(diào)用;

(3)調(diào)用上下文管理器的__enter__()方法;如果使用了as子句,則將__enter__()方法的返回值賦值給as子句中的VAR;

(4)執(zhí)行BLOCK中的表達(dá)式;

(5)不管是否執(zhí)行過程中是否發(fā)生了異常,執(zhí)行上下文管理器的__exit__()方法,__exit__()方法負(fù)責(zé)執(zhí)行“清理”工作,如釋放資源等。如果執(zhí)行過程中沒有出現(xiàn)異常,或者語句體中執(zhí)行了語句break/continue/return,則以None作為參數(shù)調(diào)用__exit__(None, None, None);如果執(zhí)行過程中出現(xiàn)異常,則使用sys.exc_info得到的異常信息為參數(shù)調(diào)用__exit__(exc_type, exc_value, exc_traceback);

(6)出現(xiàn)異常時(shí),如果__exit__(type, value, traceback)返回False,則會(huì)重新拋出異常,讓with之外的語句邏輯來處理異常,這也是通用做法;如果返回True,則忽略異常,不再對(duì)異常進(jìn)行處理。

這個(gè)和try finally函數(shù)有什么關(guān)系呢?其實(shí),這樣的過程等價(jià)于:

try:  
    執(zhí)行 __enter__的內(nèi)容  
    執(zhí)行 with_block.  
finally:  
    執(zhí)行 __exit__內(nèi)容  

例:

class Sample(object):
?
? ? def __init__(self):
? ? ? ? print("__init__")
?
? ? def __enter__(self):
? ? ? ? print("__enter__")
?
? ? def __exit__(self, types, values, trace):
? ? ? ? print("type:", types)
? ? ? ? print("value:", values)
? ? ? ? print("trace:", trace)
?
?
def get_sample():
? ? return Sample()
?
?
if __name__ == '__main__':
? ? # get_data()
? ? with get_sample() as sample:
? ? ? ? print("Sample:", sample)

輸出:

到此這篇關(guān)于Python中with上下文管理協(xié)議的作用及用法的文章就介紹到這了,更多相關(guān)Python中with用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!               

相關(guān)文章

  • Python prettytable模塊應(yīng)用詳解

    Python prettytable模塊應(yīng)用詳解

    PrettyTable 是python中的一個(gè)第三方庫,可用來生成美觀的ASCII格式的表格,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-09-09
  • python保存字典和讀取字典的實(shí)例代碼

    python保存字典和讀取字典的實(shí)例代碼

    這篇文章主要介紹了python保存字典和讀取字典的實(shí)例代碼,通過代碼給大家介紹了python 使用列表和字典存儲(chǔ)信息的相關(guān)代碼,需要的朋友可以參考下
    2019-07-07
  • TensorFlow安裝及jupyter notebook配置方法

    TensorFlow安裝及jupyter notebook配置方法

    下面小編就為大家?guī)硪黄猅ensorFlow安裝及jupyter notebook配置方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • Python+smtplib庫實(shí)現(xiàn)郵件發(fā)送功能

    Python+smtplib庫實(shí)現(xiàn)郵件發(fā)送功能

    這篇文章主要為大家詳細(xì)介紹了Python如何通過smtplib庫實(shí)現(xiàn)簡(jiǎn)單的郵件發(fā)送功能,文中的示例代碼借鑒一下,有需要的小伙伴可以參考一下
    2025-02-02
  • Python?ndarray?數(shù)組的變形詳情

    Python?ndarray?數(shù)組的變形詳情

    這篇文章主要介紹了Python?ndarray數(shù)組的變形詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 詳解關(guān)于Django中ORM數(shù)據(jù)庫遷移的配置

    詳解關(guān)于Django中ORM數(shù)據(jù)庫遷移的配置

    這篇文章主要介紹了詳解關(guān)于Django中ORM數(shù)據(jù)庫遷移的配置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-10-10
  • 用Q-learning算法實(shí)現(xiàn)自動(dòng)走迷宮機(jī)器人的方法示例

    用Q-learning算法實(shí)現(xiàn)自動(dòng)走迷宮機(jī)器人的方法示例

    這篇文章主要介紹了用Q-learning算法實(shí)現(xiàn)自動(dòng)走迷宮機(jī)器人的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Python開發(fā)SQLite3數(shù)據(jù)庫相關(guān)操作詳解【連接,查詢,插入,更新,刪除,關(guān)閉等】

    Python開發(fā)SQLite3數(shù)據(jù)庫相關(guān)操作詳解【連接,查詢,插入,更新,刪除,關(guān)閉等】

    這篇文章主要介紹了Python開發(fā)SQLite3數(shù)據(jù)庫相關(guān)操作,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python操作SQLite3數(shù)據(jù)庫的連接,查詢,插入,更新,刪除,關(guān)閉等相關(guān)操作技巧,需要的朋友可以參考下
    2017-07-07
  • 關(guān)于opencv讀取和寫入路徑有漢字的處理方式

    關(guān)于opencv讀取和寫入路徑有漢字的處理方式

    這篇文章主要介紹了關(guān)于opencv讀取和寫入路徑有漢字的處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 詳細(xì)介紹Python的鴨子類型

    詳細(xì)介紹Python的鴨子類型

    相信python的開發(fā)者對(duì)于python的鴨子類型比較熟悉,鴨子類型在維基百科中的準(zhǔn)確定義是‘是動(dòng)態(tài)類型的一種風(fēng)格。在這種風(fēng)格中,一個(gè)對(duì)象有效的語義,不是由繼承自特定的類或?qū)崿F(xiàn)特定的接口,而是由"當(dāng)前方法和屬性的集合"決定’。所以這篇文章給大家python的鴨子類型。
    2016-09-09

最新評(píng)論

天气| 开平市| 大庆市| 孝义市| 洪洞县| 江西省| 贵州省| 台东县| 甘孜县| 疏勒县| 郧西县| 汨罗市| 江源县| 杂多县| 乌鲁木齐市| 驻马店市| 蛟河市| 石景山区| 保康县| 义马市| 华阴市| 彩票| 同仁县| 紫阳县| 广州市| 晋中市| 綦江县| 监利县| 肃宁县| 望城县| 祁门县| 富顺县| 广平县| 桓台县| 长海县| 民县| 安福县| 梁平县| 双江| 丰顺县| 南通市|