亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

1. with語(yǔ)句的使用

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

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

代碼說明:

文件使用完后必須關(guān)閉,因?yàn)槲募?duì)象會(huì)占用操作系統(tǒng)的資源,并且操作系統(tǒng)同一時(shí)間能打開的文件數(shù)量也是有限的

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

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

運(yùn)行結(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

代碼說明:

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

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

安全寫法, 代碼如下:

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

運(yùn)行結(jié)果:

文件操作出錯(cuò) not writable

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

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

with 語(yǔ)句的示例代碼:

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

2. 上下文管理器

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

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

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

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

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

運(yùn)行結(jié)果:

進(jìn)入上文方法
hello world
進(jìn)入下文方法

代碼說明:

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

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

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

# 導(dǎo)入裝飾器
from contextlib import contextmanager
 
# 裝飾器裝飾函數(shù),讓其稱為一個(gè)上下文管理器對(duì)象
@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語(yǔ)句
with my_open('out.txt', 'w') as f:
    f.write("hello , the simplest context manager")

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

相關(guān)文章

  • Python PyQt5中彈出子窗口解決子窗口一閃而過的問題

    Python PyQt5中彈出子窗口解決子窗口一閃而過的問題

    這篇文章主要介紹了Python PyQt5中彈出子窗口解決子窗口一閃而過的問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Python3+selenium實(shí)現(xiàn)cookie免密登錄的示例代碼

    Python3+selenium實(shí)現(xiàn)cookie免密登錄的示例代碼

    這篇文章主要介紹了Python3+selenium實(shí)現(xiàn)cookie免密登錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Python爬取OPGG上英雄聯(lián)盟英雄勝率及選取率信息的操作

    Python爬取OPGG上英雄聯(lián)盟英雄勝率及選取率信息的操作

    這篇文章主要介紹了Python爬取OPGG上英雄聯(lián)盟英雄勝率及選取率信息的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 詳解Django的MVT設(shè)計(jì)模式

    詳解Django的MVT設(shè)計(jì)模式

    本章我們將介紹下經(jīng)典的軟件開發(fā)所遵循的MVC (Model-View-Controller, 模型-視圖-控制器) 設(shè)計(jì)模式以及Django的MVT設(shè)計(jì)模式(Model-View-Template)是如何遵循這種設(shè)計(jì)理念的。
    2021-04-04
  • 基于Python3制作一個(gè)帶GUI界面的小說爬蟲工具

    基于Python3制作一個(gè)帶GUI界面的小說爬蟲工具

    這篇文章主要為大家介紹了一個(gè)通過Python3制作的帶GUI界面的小說爬蟲工具,用來從筆趣閣爬取小說。感興趣的小伙伴可以跟隨小編一起動(dòng)手嘗試一下
    2022-02-02
  • 基于Python制作一個(gè)文件去重小工具

    基于Python制作一個(gè)文件去重小工具

    我們常常在下載網(wǎng)絡(luò)素材時(shí)會(huì)下載很多的重復(fù)文件亂七八糟的,于是想實(shí)現(xiàn)一個(gè)去重的操作就顯得很重要。本文將用Python制作一個(gè)簡(jiǎn)單的文件去重小工具,需要的可以參考一下
    2022-02-02
  • Python自動(dòng)化辦公之Excel拆分與自動(dòng)發(fā)郵件

    Python自動(dòng)化辦公之Excel拆分與自動(dòng)發(fā)郵件

    這篇文章主要何大家分享一個(gè)真實(shí)的自動(dòng)化辦公案例,即向用戶發(fā)送帶有Excel附件的電子郵件,同時(shí)必須按用戶從主Excel文件中拆分?jǐn)?shù)據(jù)以創(chuàng)建他們自己的特定文件,然后將該文件通過電子郵件發(fā)送給正確的用戶,感興趣的可以了解一下
    2022-03-03
  • TensorFlow打印輸出tensor的值

    TensorFlow打印輸出tensor的值

    這篇文章主要介紹了TensorFlow打印輸出tensor的值,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 用python實(shí)現(xiàn)一個(gè)簡(jiǎn)單計(jì)算器(完整DEMO)

    用python實(shí)現(xiàn)一個(gè)簡(jiǎn)單計(jì)算器(完整DEMO)

    這篇文章主要介紹了用python實(shí)現(xiàn)一個(gè)簡(jiǎn)單計(jì)算器(完整DEMO),需要的朋友可以參考下
    2020-10-10
  • Python 微信之獲取好友昵稱并制作wordcloud的實(shí)例

    Python 微信之獲取好友昵稱并制作wordcloud的實(shí)例

    今天小編就為大家分享一篇Python 微信之獲取好友昵稱并制作wordcloud的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02

最新評(píng)論