国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

【跟我一起學(xué)Python吧】pythonwithstatement進階理解

2019-11-14 17:37:51
字體:
供稿:網(wǎng)友

由于之前有一個項目老是要打開文件,然后用pickle.load(file),再處理。。。最后要關(guān)閉文件,所以覺得有點繁瑣,代碼也不簡潔。所以向python with statement尋求解決方法。以下是開發(fā)筆記

 

在網(wǎng)上看到一篇文章:http://effbot.org/zone/python-with-statement.htm是介紹with 的,參考著例子進行了理解。

 

如果經(jīng)常有這么一些代碼段的話,可以用一下幾種方法改進:

代碼段:

set thing up

try:

    do something

except :

    handle exception

finally:

    tear thing down

 

案例1:

假如現(xiàn)在要實現(xiàn)這么一個功能,就是打開文件,從文件里面讀取數(shù)據(jù),然后打印到終端,之后關(guān)閉文件。

那么從邏輯上來說,可以抽取“打印到終端”為數(shù)據(jù)處理部分,應(yīng)該可以獨立開來作為一個函數(shù)。其他像打開、關(guān)閉文件應(yīng)該是一起的。

文件名為:for_test.txt

 

方法1:

用函數(shù),把公共的部分抽取出來。

Python代碼  收藏代碼
  1. #!/usr/bin/env python  
  2.   
  3. from __future__ import with_statement   
  4.   
  5. filename = 'for_test.txt'  
  6.   
  7. def output(content):  
  8.     PRint content  
  9.   
  10. #functio solution  
  11. def controlled_execution(func):  
  12.     #prepare thing  
  13.     f = None  
  14.     try:  
  15.         #set thing up  
  16.         f = open(filename, 'r')  
  17.         content = f.read()  
  18.         if not callable(func):  
  19.             return  
  20.         #deal with thing   
  21.         func(content)  
  22.   
  23.     except IOError, e:  
  24.         print 'Error %s' % str(e)  
  25.   
  26.     finally:  
  27.         if f:   
  28.             #tear thing down  
  29.             f.close()  
  30.   
  31. def test():  
  32.     controlled_execution(output)  
  33.   
  34. test()  

 

方法2:

用yield實現(xiàn)一個只產(chǎn)生一項的generator。通過for - in 來循環(huán)。

代碼片段如下:

Python代碼  收藏代碼
  1. #yield solution  
  2. def controlled_execution():  
  3.     f = None  
  4.     try:  
  5.         f = open(filename, 'r')  
  6.         thing = f.read()  
  7.         #for thing in f:  
  8.         yield thing  
  9.     except IOError,e:  
  10.         print 'Error %s' % str(e)  
  11.     finally:  
  12.         if f:   
  13.             f.close()  
  14.   
  15. def test2():  
  16.     for content in controlled_execution():  
  17.         output(content)  

 

方法3:

用類的方式加上with實現(xiàn)。

代碼片段如下:

Python代碼  收藏代碼
  1. #class solution  
  2. class controlled_execution(object):  
  3.     def __init__(self):  
  4.         self.f = None  
  5.           
  6.     def __enter__(self):  
  7.         try:  
  8.             f = open(filename, 'r')  
  9.             content = f.read()  
  10.             return content  
  11.         except IOError ,e:  
  12.             print 'Error %s' % str(e)  
  13.             #return None  
  14.   
  15.     def __exit__(self, type, value, traceback):  
  16.         if self.f:  
  17.             print 'type:%s, value:%s, traceback:%s' % /  
  18.                     (str(type), str(value), str(traceback))  
  19.             self.f.close()  
  20.   
  21. def test3():  
  22.     with controlled_execution() as thing:  
  23.         if thing:  
  24.             output(thing)  

 

方法4:

用with實現(xiàn)。不過沒有exception handle 的功能。

Python代碼  收藏代碼
  1. def test4():  
  2.     with open(filename, 'r') as f:  
  3.         output(f.read())  
  4.   
  5.     print f.read()  

 最后一句print是用來測試f是否已經(jīng)被關(guān)閉了。

  

    最后總結(jié)一下,寫這篇文章的目的主要是受了一句話的刺激:“使用語言的好特性,不要使用那些糟糕的特性”!python真是有很多很優(yōu)雅的好特性,路漫漫其修遠兮,吾將上下而求索。。。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 二手房| 黑龙江省| 赣州市| 新民市| 绥江县| 左权县| 鞍山市| 灵石县| 田阳县| 扎兰屯市| 疏附县| 淳化县| 长岭县| 鄂托克旗| 平阳县| 太保市| 襄樊市| 无为县| 韶山市| 江都市| 松溪县| 信丰县| 南投市| 荆门市| 宝鸡市| 临海市| 遂川县| 贡觉县| 天门市| 瑞丽市| 隆昌县| 电白县| 博湖县| 营口市| 定陶县| 遂昌县| 岫岩| 华安县| 文安县| 民乐县| 龙门县|