說說Python中with的用法?

2021-03-02 程序IT圈

公眾號新增加了一個欄目,就是每天給大家解答一道Python常見的面試題,反正每天不貪多,一天一題,正好合適,只希望這個面試欄目,給那些正在準備面試的同學,提供一點點幫助!

小猿會從最基礎的面試題開始,每天一題。如果參考答案不夠好,或者有錯誤的話,麻煩大家可以在留言區給出自己的意見和討論,大家是要一起學習的 。

廢話不多說,開始今天的題目:

問:說說Python中with的用法?

答:Python 文件使用完畢後必須關閉,因為文件對象會佔用作業系統的資源,並且作業系統同一時間能打開的文件數量也是有限的。但是由於文件讀寫時都有可能產生IOError,一旦出錯,後面的f.close()就不會調用。所以,為了保證無論是否出錯都能正確地關閉文件,我們可以使用try ... finally來實現 。如下面代碼所示:

try:
    f = open('xxx')
except:
    print 'fail to open'
    exit(-1)
try:
    do something
except:
    do something
finally:
     f.close()

但是上面代碼太冗長了。所以有with替代了之前在python裡使用try...finally來做清理工作。除了有更優雅的語法,with還可以很好的處理上下文環境產生的異常。如下面代碼所示:

with open("xxx.txt") as file:
print(file.read())

Python推薦使用with方法來讀取文件,防止程式設計師打開文件後忘記關閉文件。

不過with是怎麼實現的呢?

with可操縱的對象必須有__enter__和__exit__兩個方法。

with後面的對象在求值後,對象的__enter__()方法被調用。這將把with後面緊緊跟著的對像賦值給as後面的變量。

with下面的語句執行好以後,將調用前面返回對象的__exit__()方法。

下面例子可以具體說明with如何工作:

class Sample:
  def __enter__(self):
    print("In __enter__()")
    return "Foo"
  def __exit__(self,type, value, trace):
    print("In __exit__()")
def get_sample():
  return Sample()

with get_sample() as sample:
  print("sample:" + sample)

輸出結果:
  In__enter__()
  sample: Foo
  In__exit__()

 1. __enter__()方法被執行 

 2. __enter__()方法返回的值 - 」Foo」賦值給變量’sample』 

 3. 執行代碼塊,列印變量」sample」的值為 「Foo」 

 4. __exit__()方法被調用 

文末推薦文章連結:

https://www.cnblogs.com/wanglei-xiaoshitou1/p/9238275.html

如果對於參考答案有不認同的,大家可以在評論區指出和補充,歡迎留言!



1-40、Python面試1-40題匯總

關注小猿公眾號,每天學習一道題

相關焦點

  • python中*的用法
    學習python語言的初學者,每每看到他人的代碼裡這樣寫python方法的入參,總是犯難疑惑,不明所以:今天,我以比較簡單的舉例,跟大家說說python中*這個字符的特殊用法。c': 3}]def add(a,b,c): print(a + b + c)for i in datas: add(i['a'], i['b'], i['c'])for i in datas: add(**i)一如既往,總結一下:*的妙用,可以很大程度降低代碼的複雜程度,特別是當你的自動化腳本的不同用例方法中有相同的入參時
  • 【Python面試】 說說Python中xrange和range的區別?
    廢話不多說,開始今天的題目:問:說說Python中xrange和range的區別?答:range()和xrange()都是在循環中使用,輸出結果一樣。range()返回的是一個list對象,而xrange返回的是一個生成器對象(xrange object)。
  • 詳解Python中的import的用法
    import語句用來導入其他python文件(稱為模塊module),使用該模塊裡定義的類、方法或者變量,從而達到代碼復用的目的。為了方便說明,我們用實例來說明import的用法,讀者朋友可以跟著嘗試(嘗試時建議使用python3,python2和python3在import的表現有差異,之後會提到)。
  • 說說Python中yield的用法?
    廢話不多說,開始今天的題目:問:說說Python中yield的用法?答:Python中有一個非常有用的語法叫做生成器,用到的關鍵字就是yield。可以先把yield看做return,就是在程序中返回某個值,返回之後程序就不再往下運行。看下面代碼,程序開始執行以後,因為getNum函數中有yield關鍵字,所以getNum函數並不會真的執行,而是先得到一個生成器。直到調用next方法,getNum函數正式開始執行,先執行getNum函數中的print方法,然後進入while循環 。
  • python中int函數的其他用法
    泰山版初中信息技術第1冊python編程中出現了int函數,教材中int函數的作用是把輸入的字符型數字轉變成整數,其實int函數還有其他的用法
  • Python for循環及用法詳解
    圖 1 for 循環語句的執行流程圖下面的程序演示了 for 循環的具體用法:add = "http://c.biancheng.net/python/"#for循環,遍歷 add 字符串for ch in add: print(ch,end="")運行結果為:
  • Python中super( )的用法
    __init__(self)   print "leave B" >>> b = B() enter B enter A leave A leave B即,使用非綁定的類方法(用類名來引用的方法),並在參數列表中,引入待綁定的對象(self),從而達到調用父類的目的。
  • 掌握這兩個方法:助你學會Python 中所有函數(方法)的功能與用法
    python語言已經接觸過python的讀者應該都對python海量的內置函數有所了解,這些函數把我們原本在C/C++等語言中需要手動實現的功能(如排序/字符串組合/查找)都用最優化的代碼封裝成了內置函數,可供開發者直接調用
  • python中函數的基礎用法
    python中的內置函數提供了基礎功能,在實際開發中,我們需要將這些基礎功能進行搭配組合,來有效解決我們的問題。如何將我們自己構建的代碼作為一個可復用的工具,最基本的方法就是寫成函數。通過函數可以減少代碼冗餘,提高編碼效率。
  • Python中break語句用法詳解!
    這篇文章主要介紹了詳解Python中break語句的用法,是Python入門的呼出知識,需要的朋友可以參考下 在Python中的break
  • Python continue的用法
    和 break 語句相比,continue 語句的作用則沒有那麼強大,它只會終止執行本次循環中剩下的代碼,直接從下一次循環繼續執行。
  • 說說Python中PEP8到底是什麼?
    廢話不多說,開始今天的題目:問:說說Python中PEP8到底是什麼?答:昨天推文留言,有人剛好提到了PEP8,今天就具體來給大家介紹一下。PEP是Python Enhancement Proposal的縮寫,通常翻譯為「Python增強提案」。
  • Python sorted函數及用法
    下面程序演示了 sorted() 函數的基本用法:a = [5,3,4,2,1]print(sorted(a))a = (5,4,3,1,2)print(sorted(a))a = {4:1,\ 5:2,\ 3:3,\ 2:6,\ 1:8}print(sorted(a.items
  • 【135】python中self的用法
    內容目錄(原文見公眾號python寶)一、self代表類的實例二、self 舉例三、self用法詳解一、self代表類的實例
  • python中str內置函數用法總結
    大家在使用python的過程中,應該在敲代碼的時候經常遇到str內置函數,為了防止大家搞混,本文整理歸納了str內置函數。
  • python核心部分創建對象中各種名詞的定義及用法
    但是python被稱為面向對象的語言,所以創建對象才是python的核心部分,我們今天就走進python的核心部分-創建對象。接下來幾天的章節非常重要非常核心,非常重要非常核心,非常重要非常核心,重要的事情說是三次。首先說一下幾個名詞的定義,方便你在以後的學習中理解。
  • python循環語句for和while用法-py猜數字小遊戲-學習python第4天
    python循環語句python循環語句在python程序中,我們總會遇到需要重複執行某條或者某些命令,例如,在屏幕中每隔一秒列印一次"python這時我們如果採取老辦法,重複寫3600次print("python循環語句")是可以完成任務,但是這樣太枯燥、太乏味,作為程式設計師就應該學會變通,所以就出現了python循環語句,利用python循環語句,一小段代碼可以幫你解決重複輸出3600次的煩惱,可見python循環語句主要是用於解決某些重複的代碼工作。那麼有哪些是python循環語句呢?
  • 一文弄懂Python上下文管理器和with用法
    這個用法在python中叫上下文管理器。本文帶你快速入門上下文管理器和with用法。上下文管理器,英文context managers,在python官方文檔中這樣描述:上下文管理器是一個對象,它定義了在執行 with 語句時要建立的運行時上下文。 上下文管理器處理進入和退出所需運行時上下文以執行代碼塊。 通常使用 with 語句(在 with 語句中描述),但是也可以通過直接調用它們的方法來使用。
  • Python協程:概念及其用法
    ——蒙田《蒙田隨筆全集》上篇《Python 多線程雞年不雞肋》論述了關於python多線程是否是雞肋的問題,得到了一些網友的認可,當然也有一些不同意見,表示協程比多線程不知強多少,在協程面前多線程算是雞肋。好吧,對此我也表示贊同,然而上篇我論述的觀點不在於多線程與協程的比較,而是在於IO密集型程序中,多線程尚有用武之地。
  • 慢步python,說說import,引用功能代碼(功能庫、py文件代碼)
    今天慢步休息,繼續學習python語言。其實慢步已經將基礎和必要的python語言知識點寫了。今天想說說importimport是python語言的保留字,它能實現引用當前程序之外已有的功能代碼。python語言像積木,你可以根據你想要的功能,編寫一系列的代碼。比如筆者之前編寫的《word文檔標題置換》。