欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

如何更優雅地寫python代碼

系統 1730 0

前言

Python 這門語言最大的優點之一就是語法簡潔,好的代碼就像偽代碼一樣,干凈、整潔、一目了然。但有時候我們寫代碼,特別是 Python 初學者,往往還是按照其它語言的思維習慣來寫,那樣的寫法不僅運行速度慢,代碼讀起來也費盡,給人一種拖泥帶水的感覺,過段時間連自己也讀不懂。

《計算機程序的構造和解釋》的作者哈爾?阿伯爾森曾這樣說:“Programs must be written for people to read, and only incidentally for machines to execute.”

要寫出 Pythonic(優雅的、地道的、整潔的)代碼,還要平時多觀察那些大牛代碼,Github 上有很多非常優秀的源代碼值得閱讀,比如:requests、flask、tornado,筆者列舉一些常見的 Pythonic 寫法,希望能給你帶來一點啟迪。

1、變量交換

大部分編程語言中交換兩個變量的值時,不得不引入一個臨時變量:

            
>>> a = 1
>>> b = 2
>>> tmp = a
>>> a = b
>>> b = tmp
          

pythonic

            
>>> a, b = b, a
          

2、循環遍歷區間元素

            
for i in [0, 1, 2, 3, 4, 5]:
(print i)
# 或者
for i in range(6):
(print i)
          

pythonic

            
for i in xrange(6):
(print i)
          

xrange 返回的是生成器對象,生成器比列表更加節省內存,不過需要注意的是 xrange 是 python2 中的寫法,python3 只有 range 方法,特點和 xrange 是一樣的。

3、帶有索引位置的集合遍歷

遍歷集合時如果需要使用到集合的索引位置時,直接對集合迭代是沒有索引信息的,普通的方式使用:

            
colors = ['red', 'green', 'blue', 'yellow']
for i in range(len(colors)):
print (i, '--->', colors[i])
          

pythonic

            
for i, color in enumerate(colors):
print (i, '--->', color)
          

4、字符串連接

字符串連接時,普通的方式可以用 + 操作

            
names = ['raymond', 'rachel', 'matthew', 'roger',
'betty', 'melissa', 'judith', 'charlie']
s = names[0]
for name in names[1:]:
s += ', ' + name
print (s)
          

pythonic

            
print (', '.join(names))
          

join 是一種更加高效的字符串連接方式,使用 + 操作時,每執行一次+操作就會導致在內存中生成一個新的字符串對象,遍歷8次有8個字符串生成,造成無謂的內存浪費。而用 join 方法整個過程只會產生一個字符串對象。

5、打開/關閉文件

執行文件操作時,最后一定不能忘記的操作是關閉文件,即使報錯了也要 close。普通的方式是在 finnally 塊中顯示的調用 close 方法。

            
f = open('data.txt')
try:
data = f.read()
finally:
f.close()
          

pythonic

            
with open('data.txt') as f:
data = f.read()
            

使用 with 語句,系統會在執行完文件操作后自動關閉文件對象。

6、列表推導式

能夠用一行代碼簡明扼要地解決問題時,絕不要用兩行,比如

            
result = []
for i in range(10):
s = i*2
result.append(s)
          

pythonic

            
[i*2 for i in xrange(10)]
          

與之類似的還有生成器表達式、字典推導式,都是很 pythonic 的寫法。

7、善用裝飾器

裝飾器可以把與業務邏輯無關的代碼抽離出來,讓代碼保持干凈清爽,而且裝飾器還能被多個地方重復利用。比如一個爬蟲網頁的函數,如果該 URL 曾經被爬過就直接從緩存中獲取,否則爬下來之后加入到緩存,防止后續重復爬取。

            
def web_lookup(url, saved={}):
if url in saved:
return saved[url]
page = urllib.urlopen(url).read()
saved[url] = page
return page
          

pythonic

            
import urllib #py2
#import urllib.request as urllib # py3
def cache(func):
saved = {}
def wrapper(url):
if url in saved:
return saved[url]
else:
page = func(url)
saved[url] = page
return page
return wrapper
@cache
def web_lookup(url):
return urllib.urlopen(url).read()
          

用裝飾器寫代碼表面上感覺代碼量更多,但是它把緩存相關的邏輯抽離出來了,可以給更多的函數調用,這樣總的代碼量就會少很多,而且業務方法看起來簡潔了。

8、合理使用列表
列表對象(list)是一個查詢效率高于更新操作的數據結構,比如刪除一個元素和插入一個元素時執行效率就非常低,因為還要對剩下的元素進行移動

            
names = ['raymond', 'rachel', 'matthew', 'roger',
'betty', 'melissa', 'judith', 'charlie']
names.pop(0)
names.insert(0, 'mark')
          

pythonic

            
from collections import deque
names = deque(['raymond', 'rachel', 'matthew', 'roger',
'betty', 'melissa', 'judith', 'charlie'])
names.popleft()
names.appendleft('mark')
          

deque 是一個雙向隊列的數據結構,刪除元素和插入元素會很快

9、序列解包

            
p = 'vttalk', 'female', 30, 'python@qq.com'
name = p[0]
gender = p[1]
age = p[2]
email = p[3]
          

pythonic

            
name, gender, age, email = p
          

10、遍歷字典的 key 和 value

方法一速度沒那么快,因為每次迭代的時候還要重新進行hash查找 key 對應的 value。

方法二遇到字典非常大的時候,會導致內存的消耗增加一倍以上

            
# 方法一
for k in d:
print (k, '--->', d[k])
# 方法二
for k, v in d.items():
print (k, '--->', v)
          

pythonic

            
for k, v in d.iteritems():
print (k, '--->', v)
          

iteritems 返回迭代器對象,可節省更多的內存,不過在 python3 中沒有該方法了,只有 items 方法,等值于 iteritems。

?當然還有很多 pythonic 寫法,在此不再一一列舉。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲精品视频一区二区三区 | 欧美精品一区二区三区在线 | 99久久99久久免费精品蜜桃 | 亚洲日本在线观看视频 | 国产成人精品午夜 | 日韩美在线 | 啪一啪 | 国产在线视频自拍 | 四虎影片 | 高清一区二区三区 | 成人欧美一区二区三区 | av在线大全 | 色综合久久综合中文小说 | 欧美精品久久久久久久久老牛影院 | 最新久久免费视频 | 国产成人精品影院狼色在线 | 久草在线新免久费观看视频 | 色综合久久98天天综合 | 日本熟妇无码波多野1223 | 亚洲午夜久久久精品影院 | 亚洲 中文 欧美 日韩 在线观看 | 久久精品69 | 亚洲黄色片在线观看 | 尤物国产在线精品福利一区 | 一本一本久久α久久精品66 | 亚洲国产精品一区二区久久 | 草草视频在线观看 | 午夜国产精品视频 | 99热首页 | 欧美日韩成人在线观看 | 色噜噜狠狠色综合欧洲selulu | 亚洲三级在线 | 国产精品视频网站 | 亚洲不卡视频在线 | 亚洲日本视频在线 | 小优视频为爱而生懂你更多茄子 | 国产精品1区| 奇米影视在线 | 欧美激情bbbbbxxxxⅹ | 日本一二三区视频 | 精品视频www|