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

理解Python中的With語句

 更新時間:2016年03月18日 11:32:14   作者:編程青年的崛起  
這篇文章主要幫助大家理解Python中的With語句,感興趣的小伙伴們可以參考一下

 有一些任務(wù),可能事先需要設(shè)置,事后做清理工作。對于這種場景,Python的with語句提供了一種非常方便的處理方式。一個很好的例子是文件處理,你需要獲取一個文件句柄,從文件中讀取數(shù)據(jù),然后關(guān)閉文件句柄。 Without the with statement, one would write something along the lines of: 如果不用with語句,代碼如下:

file = open("/tmp/foo.txt")
data = file.read()
file.close()

這里有兩個問題。一是可能忘記關(guān)閉文件句柄;二是文件讀取數(shù)據(jù)發(fā)生異常,沒有進(jìn)行任何處理。下面是處理異常的加強版本:

file = open("/tmp/foo.txt")
try:
  data = file.read()
finally:
  file.close()

雖然這段代碼運行良好,但是太冗長了。這時候就是with一展身手的時候了。除了有更優(yōu)雅的語法,with還可以很好的處理上下文環(huán)境產(chǎn)生的異常。下面是with版本的代碼:

with open("/tmp/foo.txt") as file:
  data = file.read()

with如何工作?
 這看起來充滿魔法,但不僅僅是魔法,Python對with的處理還很聰明。基本思想是with所求值的對象必須有一個__enter__()方法,一個__exit__()方法。

緊跟with后面的語句被求值后,返回對象的__enter__()方法被調(diào)用,這個方法的返回值將被賦值給as后面的變量。當(dāng)with后面的代碼塊全部被執(zhí)行完之后,將調(diào)用前面返回對象的__exit__()方法。 This can be demonstrated with the following example: 下面例子可以具體說明with如何工作:

#!/usr/bin/env python
# with_example01.py
 
 
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

運行代碼,輸出如下

bash-3.2$ ./with_example01.py
In __enter__()
sample: Foo
In __exit__()

正如你看到的, 1. __enter__()方法被執(zhí)行 2. __enter__()方法返回的值 - 這個例子中是"Foo",賦值給變量'sample' 3. 執(zhí)行代碼塊,打印變量"sample"的值為 "Foo" 4. __exit__()方法被調(diào)用 with真正強大之處是它可以處理異常??赡苣阋呀?jīng)注意到Sample類的__exit__方法有三個參數(shù)- val, type 和 trace。 這些參數(shù)在異常處理中相當(dāng)有用。我們來改一下代碼,看看具體如何工作的。

#!/usr/bin/env python
# with_example02.py
 
 
class Sample:
  def __enter__(self):
    return self
 
  def __exit__(self, type, value, trace):
    print "type:", type
    print "value:", value
    print "trace:", trace
 
  def do_something(self):
    bar = 1/0
    return bar + 10
 
with Sample() as sample:
  sample.do_something()

這沒有任何關(guān)系,只要緊跟with后面的語句所返回的對象有__enter__()和__exit__()方法即可。此例中,Sample()的__enter__()方法返回新創(chuàng)建的Sample對象,并賦值給變量sample。 When executed: 代碼執(zhí)行后:

bash-3.2$ ./with_example02.py
type: <type 'exceptions.ZeroDivisionError'>
value: integer division or modulo by zero
trace: <traceback object at 0x1004a8128>
Traceback (most recent call last):
 File "./with_example02.py", line 19, in <module>
  sample.do_something()
 File "./with_example02.py", line 15, in do_something
  bar = 1/0
ZeroDivisionError: integer division or modulo by zero

 實際上,在with后面的代碼塊拋出任何異常時,__exit__()方法被執(zhí)行。正如例子所示,異常拋出時,與之關(guān)聯(lián)的type,value和stack trace傳給__exit__()方法,因此拋出的ZeroDivisionError異常被打印出來了。

開發(fā)庫時,清理資源,關(guān)閉文件等等操作,都可以放在__exit__方法當(dāng)中。

因此,Python的with語句是提供一個有效的機制,讓代碼更簡練,同時在異常產(chǎn)生時,清理工作更簡單。

以上就是關(guān)于Python中的With語句的理解,希望對大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • PyCharm添加python庫的方法步驟

    PyCharm添加python庫的方法步驟

    在使用PyCharm過程中,有時候需要添加需要的Python擴(kuò)展庫,本文主要介紹了PyCharm添加python庫的方法步驟,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Python PIL庫圖片灰化處理

    Python PIL庫圖片灰化處理

    這篇文章主要介紹了Python圖片灰化處理PIL庫的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • 一文詳解python多繼承的3C算法

    一文詳解python多繼承的3C算法

    有很多地方都說python多繼承的繼承順序,是按照深度遍歷的方式,其實python多繼承順序的算法,不是嚴(yán)格意義上的深度遍歷,而是基于深度遍歷基礎(chǔ)上優(yōu)化出一種叫3C算法,本文將給大家詳細(xì)的介紹一下python多繼承的3C算法,需要的朋友可以參考下
    2024-07-07
  • python中urllib.unquote亂碼的原因與解決方法

    python中urllib.unquote亂碼的原因與解決方法

    這篇文章主要給大家介紹了python中urllib.unquote亂碼的原因與解決方法,文中介紹的非常詳細(xì),對大家具有一定的參考價值,需要的朋友可以參考學(xué)習(xí),下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-04-04
  • Python中xmltodict模塊對XML的用法詳解

    Python中xmltodict模塊對XML的用法詳解

    這篇文章主要介紹了Python中xmltodict模塊對XML的用法詳解,xmltodict?是一個用來處理xml數(shù)據(jù)的很方便的模塊,包含兩個常用方法parse和unparse,本文通過代碼介紹了用法,需要的朋友可以參考下
    2023-07-07
  • python實現(xiàn)圖書館研習(xí)室自動預(yù)約功能

    python實現(xiàn)圖書館研習(xí)室自動預(yù)約功能

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)圖書館研習(xí)室自動預(yù)約功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • python分段函數(shù)的實現(xiàn)示例

    python分段函數(shù)的實現(xiàn)示例

    分段函數(shù)是一種數(shù)學(xué)函數(shù),它將定義域分成若干個區(qū)間,每個區(qū)間對應(yīng)一個函數(shù),本文主要介紹了python分段函數(shù)的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • python3+opencv3識別圖片中的物體并截取的方法

    python3+opencv3識別圖片中的物體并截取的方法

    今天小編就為大家分享一篇python3+opencv3識別圖片中的物體并截取的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python常見庫matplotlib學(xué)習(xí)筆記之畫圖文字的中文顯示

    Python常見庫matplotlib學(xué)習(xí)筆記之畫圖文字的中文顯示

    在Python中使用matplotlib或者plotnine模塊繪圖時,常常出現(xiàn)圖表中無法正常顯示中文的問題,下面這篇文章主要給大家介紹了關(guān)于Python常見庫matplotlib學(xué)習(xí)筆記之畫圖文字的中文顯示的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • Python實用庫 PrettyTable 學(xué)習(xí)筆記

    Python實用庫 PrettyTable 學(xué)習(xí)筆記

    這篇文章主要介紹了Python實用庫 PrettyTable 學(xué)習(xí)筆記,結(jié)合實例形式分析了Python表格操作庫PrettyTable的安裝、使用技巧與相關(guān)注意事項,需要的朋友可以參考下
    2019-08-08

最新評論

治县。| 景谷| 弥勒县| 专栏| 榆树市| 大宁县| 大关县| 安仁县| 郴州市| 老河口市| 广灵县| 棋牌| 镇巴县| 云南省| 翼城县| 赣州市| 维西| 义乌市| 白水县| 红河县| 丰台区| 枣阳市| 孟津县| 扎赉特旗| 临城县| 汉中市| 内乡县| 武功县| 玉溪市| 磐安县| 锦州市| 巨鹿县| 海安县| 富源县| 穆棱市| 清苑县| 南部县| 舟山市| 龙泉市| 正安县| 铜山县|