Python学习笔记:常用内建模块5
前言
最近在學習深度學習,已經跑出了幾個模型,但Pyhton的基礎不夠扎實,因此,開始補習Python了,大家都推薦廖雪峰的課程,因此,開始了學習,但光學有沒有用,還要和大家討論一下,因此,寫下這些帖子,廖雪峰的課程連接在這里:廖雪峰
Python的相關介紹,以及它的歷史故事和運行機制,可以參見這篇:python介紹
Python的安裝可以參見這篇:Python安裝
Python的運行模式以及輸入輸出可以參見這篇:Python IO
Python的基礎概念介紹,可以參見這篇:Python 基礎
Python字符串和編碼的介紹,可以參見這篇:Python字符串與編碼
Python基本數據結構:list和tuple介紹,可以參見這篇:Python list和tuple
Python控制語句介紹:ifelse,可以參見這篇:Python 條件判斷
Python控制語句介紹:循環實現,可以參見這篇:Python循環語句
Python數據結構:dict和set介紹Python數據結構dict和set
Python函數相關:Python函數
Python高階特性:Python高級特性
Python高階函數:Python高階函數
Python匿名函數:Python匿名函數
Python裝飾器:Python裝飾器
Python偏函數:Python偏函數
Python模塊:Python模塊
Python面向對象編程(1):Python面向對象
Python面向對象編程(2):Python面向對象(2)
Python面向對象編程(3):Python面向對象(3)
Python面向對象編程(4):Pyhton面向對象(4)
Python面向對象高級編程(上):Python面向對象高級編程(上)
Python面向對象高級編程(中上):Python面向對象高級編程(中上)
Python面向對象高級編程(中下):Python面向對象高級編程(中下)
Python面向對象高級編程(完):Python面向對象高級編程(完)
Python錯誤調試(起):Python調試:起
Python錯誤調試(承):Python調試:承
Python錯誤調試(轉):Python調試:轉
Python錯誤調試(合):python調試:合
Python文件IO編程:Python文件IO
Python文件IO編程2:Python文件IO2
Python文件IO編程3:PYthon文件IO3
Python進程和線程(起):Python進程和線程起
Python進程和線程(承):Python進程和線程承
Python進程和線程(轉):Python進程和線程轉
Python進程和線程(合):Python進程和線程合
Python正則表達式:Python正則表達式
Python學習筆記:常用內建模塊1:Python學習筆記:常用內建模塊1
Python學習筆記:常用內建模塊2:Python學習筆記:常用內建模塊2
Python學習筆記:常用內建模塊3:Python學習筆記:常用內建模塊3
Python學習筆記:常用內建模塊4:Python學習筆記: 常用內建模塊4
目錄
- 前言
- 目錄
- Contextlib
- @contextmanager
- @closing
Contextlib
在Python中,讀寫文件這樣的資源要特別注意,必須在使用完畢后正確關閉它們。正確關閉文件資源的一個方法是使用
try...finally:try:f = open('/path/to/file', 'r')f.read() finally:if f:f.close()寫try…finally非常繁瑣。Python的with語句允許我們非常方便地使用資源,而不必擔心資源沒有關閉,所以上面的代碼可以簡化為:
with open('/path/to/file', 'r') as f:f.read()并不是只有open()函數返回的fp對象才能使用with語句。實際上,任何對象,只要正確實現了上下文管理,就可以用于with語句。
實現上下文管理是通過_enter_和_exit_這兩個方法實現的。例如,下面的class實現了這兩個方法:
class Query(object):def __init__(self, name):self.name = namedef __enter__(self):print('Begin')return selfdef __exit__(self, exc_type, exc_value, traceback):if exc_type:print('Error')else:print('End')def query(self):print('Query info about %s...' % self.name)這樣我們就可以把自己寫的資源對象用于with語句:
with Query('Bob') as q:q.query()@contextmanager
編寫enter和exit仍然很繁瑣,因此Python的標準庫contextlib提供了更簡單的寫法,上面的代碼可以改寫如下:
from contextlib import contextmanagerclass Query(object):def __init__(self, name):self.name = namedef query(self):print('Query info about %s...' % self.name)@contextmanager def create_query(name):print('Begin')q = Query(name)yield qprint('End')@contextmanager這個decorator接受一個generator,用yield語句把with … as var把變量輸出出去,然后,with語句就可以正常地工作了:
with create_query('Bob') as q:q.query()很多時候,我們希望在某段代碼執行前后自動執行特定代碼,也可以用@contextmanager實現。例如:
@contextmanager def tag(name):print("<%s>" % name)yieldprint("</%s>" % name)with tag("h1"):print("hello")print("world")上述代碼執行結果為:
<h1> hello world </h1>代碼的執行順序是:
1 with語句首先執行yield之前的語句,因此打印出<h1>;2 yield調用會執行with語句內部的所有語句,因此打印出hello和world;3 最后執行yield之后的語句,打印出</h1>。因此,@contextmanager讓我們通過編寫generator來簡化上下文管理。
@closing
如果一個對象沒有實現上下文,我們就不能把它用于with語句。這個時候,可以用closing()來把該對象變為上下文對象。例如,用with語句使用urlopen():
from contextlib import closing from urllib.request import urlopenwith closing(urlopen('https://www.python.org')) as page:for line in page:print(line)closing也是一個經過@contextmanager裝飾的generator,這個generator編寫起來其實非常簡單:
@contextmanager def closing(thing):try:yield thingfinally:thing.close()它的作用就是把任意對象變為上下文對象,并支持with語句。
@contextlib還有一些其他decorator,便于我們編寫更簡潔的代碼。
總結
以上是生活随笔為你收集整理的Python学习笔记:常用内建模块5的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 用面向接口编程的方式开发打印机
- 下一篇: java 用户线程如何修改界面内容_ja