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

Python基礎(chǔ)之with語句和上下文管理器詳解

 更新時間:2023年04月28日 16:34:35   作者:py編程  
這篇文章主要為大家詳細介紹了Python中with語句和上下文管理器的具體使用方法,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下

1. with語句的使用

基礎(chǔ)班向文件中寫入數(shù)據(jù)的示例代碼:

 # 1、以寫的方式打開文件
 f = open("1.txt", "w")
 # 2、寫入文件內(nèi)容
 f.write("hello world")
 # 3、關(guān)閉文件
 f.close()

代碼說明:

文件使用完后必須關(guān)閉,因為文件對象會占用操作系統(tǒng)的資源,并且操作系統(tǒng)同一時間能打開的文件數(shù)量也是有限的

這種寫法可能出現(xiàn)一定的安全隱患,錯誤代碼如下:

 # 1、以讀的方式打開文件
 f = open("1.txt", "r")
 # 2、讀取文件內(nèi)容
 f.write("hello world")
 # 3、關(guān)閉文件
 f.close()

運行結(jié)果:

Traceback (most recent call last):
  File "/home/python/Desktop/test/xxf.py", line 4, in <module>
    f.write("hello world")
io.UnsupportedOperation: not writable

代碼說明:

由于文件讀寫時都有可能產(chǎn)生IOError,一旦出錯,后面的f.close()就不會調(diào)用。

為了保證無論是否出錯都能正確地關(guān)閉文件,我們可以使用try ... finally來解決

安全寫法, 代碼如下:

try:
    # 1、以讀的方式打開文件
    f = open("1.txt", "r")
    # 2、讀取文件內(nèi)容
    f.write("xxxxx")
 
except IOError as e:
    print("文件操作出錯", e)
 
finally:
    # 3、關(guān)閉文件
    f.close()

運行結(jié)果:

文件操作出錯 not writable

這種方法雖然代碼運行良好,但是缺點就是代碼過于冗長,并且需要添加try-except-finally語句,不是很方便,也容易忘記.

在這種情況下,Python提供了 with 語句的這種寫法,既簡單又安全,并且 with 語句執(zhí)行完成以后自動調(diào)用關(guān)閉文件操作,即使出現(xiàn)異常也會自動調(diào)用關(guān)閉文件操作。

with 語句的示例代碼:

# 1、以寫的方式打開文件
with open("1.txt", "w") as f:
    # 2、讀取文件內(nèi)容
    f.write("hello world")

2. 上下文管理器

一個類只要實現(xiàn)了__enter__()和__exit__()這個兩個方法,通過該類創(chuàng)建的對象我們就稱之為上下文管理器。

上下文管理器可以使用 with 語句,with語句之所以這么強大,背后是由上下文管理器做支撐的,也就是說剛才使用 open 函數(shù)創(chuàng)建的文件對象就是就是一個上下文管理器對象。

自定義上下文管理器類,模擬文件操作:

定義一個File類,實現(xiàn) __enter__() 和 __exit__()方法,然后使用 with 語句來完成操作文件, 示例代碼:

class File(object):
 
    # 初始化方法
    def __init__(self, file_name, file_model):
        # 定義變量保存文件名和打開模式
        self.file_name = file_name
        self.file_model = file_model
 
    # 上文方法
    def __enter__(self):
        print("進入上文方法")
        # 返回文件資源
        self.file = open(self.file_name,self.file_model)
        return self.file
 
    # 下文方法
    def __exit__(self, exc_type, exc_val, exc_tb):
        print("進入下文方法")
        self.file.close()
 
 
if __name__ == '__main__':
 
    # 使用with管理文件
    with File("1.txt", "r") as file:
        file_data = file.read()
        print(file_data)

運行結(jié)果:

進入上文方法
hello world
進入下文方法

代碼說明:

  • __enter__表示上文方法,需要返回一個操作文件對象
  • __exit__表示下文方法,with語句執(zhí)行完成會自動執(zhí)行,即使出現(xiàn)異常也會執(zhí)行該方法。

3. 上下文管理器的另外一種實現(xiàn)方式

假如想要讓一個函數(shù)成為上下文管理器,Python 還提供了一個 @contextmanager 的裝飾器,更進一步簡化了上下文管理器的實現(xiàn)方式。通過 yield 將函數(shù)分割成兩部分,yield 上面的語句在 __enter__ 方法中執(zhí)行,yield 下面的語句在 __exit__ 方法中執(zhí)行,緊跟在 yield 后面的參數(shù)是函數(shù)的返回值。

# 導(dǎo)入裝飾器
from contextlib import contextmanager
 
# 裝飾器裝飾函數(shù),讓其稱為一個上下文管理器對象
@contextmanager
def my_open(path, mode):
    try:
        # 打開文件
        file = open(file_name, file_mode)
        # yield之前的代碼好比是上文方法
        yield file
    except Exception as e:
        print(e)
    finally:
        print("over")
        # yield下面的代碼好比是下文方法
        file.close()
 
# 使用with語句
with my_open('out.txt', 'w') as f:
    f.write("hello , the simplest context manager")

到此這篇關(guān)于Python基礎(chǔ)之with語句和上下文管理器詳解的文章就介紹到這了,更多相關(guān)Python with語句 上下文管理器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于python中__add__函數(shù)的用法

    基于python中__add__函數(shù)的用法

    今天小編就為大家分享一篇基于python中__add__函數(shù)的用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Python.append()與Python.expand()用法詳解

    Python.append()與Python.expand()用法詳解

    今天小編就為大家分享一篇Python.append()與Python.expand()用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python TestSuite生成測試報告過程解析

    Python TestSuite生成測試報告過程解析

    這篇文章主要介紹了Python TestSuite生成測試報告過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • 使用 Python 查找本月的最后一天的方法匯總

    使用 Python 查找本月的最后一天的方法匯總

    這篇文章主要介紹了使用 Python 查找本月的最后一天,在本文中,我們學(xué)習(xí)了使用 datetime 和 calendar 等內(nèi)置庫以及 arrow 和 pandas 等第三方庫在 Python 中查找月份最后一天的各種方法,需要的朋友可以參考下
    2023-05-05
  • Python 在函數(shù)上添加包裝器

    Python 在函數(shù)上添加包裝器

    這篇文章主要介紹了Python 如何在函數(shù)上添加包裝器,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 9種python web 程序的部署方式小結(jié)

    9種python web 程序的部署方式小結(jié)

    python有很多web 開發(fā)框架,代碼寫完了,部署上線是個大事,通常來說,web應(yīng)用一般是三層結(jié)構(gòu)web server ---->application -----> DB server
    2014-06-06
  • Python字符串、整數(shù)、和浮點型數(shù)相互轉(zhuǎn)換實例

    Python字符串、整數(shù)、和浮點型數(shù)相互轉(zhuǎn)換實例

    今天小編就為大家分享一篇Python字符串、整數(shù)、和浮點型數(shù)相互轉(zhuǎn)換實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • python實現(xiàn)簡易自習(xí)室座位預(yù)約系統(tǒng)

    python實現(xiàn)簡易自習(xí)室座位預(yù)約系統(tǒng)

    本文將結(jié)合實例代碼,介紹python實現(xiàn)簡易自習(xí)室座位預(yù)約系統(tǒng),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • django認證系統(tǒng)實現(xiàn)自定義權(quán)限管理的方法

    django認證系統(tǒng)實現(xiàn)自定義權(quán)限管理的方法

    這篇文章主要介紹了django認證系統(tǒng)實現(xiàn)自定義權(quán)限管理的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • pycharm社區(qū)版安裝node.js插件運行js代碼方法

    pycharm社區(qū)版安裝node.js插件運行js代碼方法

    PyCharm可以說是當今最流行的一款Python IDE了,下面這篇文章主要給大家介紹了關(guān)于pycharm社區(qū)版安裝node.js插件運行js代碼的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10

最新評論

锦屏县| 德江县| 精河县| 田林县| 鄂伦春自治旗| 顺昌县| 正定县| 济宁市| 绵阳市| 东乌| 义乌市| 高要市| 哈巴河县| 修水县| 汕头市| 荣昌县| 息烽县| 志丹县| 浪卡子县| 科技| 克什克腾旗| 兴义市| 朝阳区| 柳州市| 定州市| 平舆县| 原阳县| 惠水县| 日土县| 麟游县| 嘉荫县| 鄂托克前旗| 桐柏县| 翁牛特旗| 石渠县| 黔西| 潜江市| 罗山县| 筠连县| 宽甸| 石阡县|