亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

如何更優(yōu)雅地寫python代碼

 更新時(shí)間:2019年07月02日 10:12:15   作者:FOOFISH-PYTHON之禪  
這篇文章主要介紹了如何更優(yōu)雅地寫python代碼,我們寫代碼,往往還是按照其它語(yǔ)言的思維習(xí)慣來(lái)寫,那樣的寫法不僅運(yùn)行速度慢,代碼讀起來(lái)也費(fèi)盡,給人一種拖泥帶水的感覺(jué),需要的朋友可以參考下

前言

Python 這門語(yǔ)言最大的優(yōu)點(diǎn)之一就是語(yǔ)法簡(jiǎn)潔,好的代碼就像偽代碼一樣,干凈、整潔、一目了然。但有時(shí)候我們寫代碼,特別是 Python 初學(xué)者,往往還是按照其它語(yǔ)言的思維習(xí)慣來(lái)寫,那樣的寫法不僅運(yùn)行速度慢,代碼讀起來(lái)也費(fèi)盡,給人一種拖泥帶水的感覺(jué),過(guò)段時(shí)間連自己也讀不懂。

《計(jì)算機(jī)程序的構(gòu)造和解釋》的作者哈爾·阿伯爾森曾這樣說(shuō):“Programs must be written for people to read, and only incidentally for machines to execute.”

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

1、變量交換

大部分編程語(yǔ)言中交換兩個(gè)變量的值時(shí),不得不引入一個(gè)臨時(shí)變量:

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

pythonic

>>> a, b = b, a

2、循環(huán)遍歷區(qū)間元素

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 返回的是生成器對(duì)象,生成器比列表更加節(jié)省內(nèi)存,不過(guò)需要注意的是 xrange 是 python2 中的寫法,python3 只有 range 方法,特點(diǎn)和 xrange 是一樣的。

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

遍歷集合時(shí)如果需要使用到集合的索引位置時(shí),直接對(duì)集合迭代是沒(méi)有索引信息的,普通的方式使用:

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、字符串連接

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

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 是一種更加高效的字符串連接方式,使用 + 操作時(shí),每執(zhí)行一次+操作就會(huì)導(dǎo)致在內(nèi)存中生成一個(gè)新的字符串對(duì)象,遍歷8次有8個(gè)字符串生成,造成無(wú)謂的內(nèi)存浪費(fèi)。而用 join 方法整個(gè)過(guò)程只會(huì)產(chǎn)生一個(gè)字符串對(duì)象。

5、打開(kāi)/關(guān)閉文件

執(zhí)行文件操作時(shí),最后一定不能忘記的操作是關(guān)閉文件,即使報(bào)錯(cuò)了也要 close。普通的方式是在 finnally 塊中顯示的調(diào)用 close 方法。

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

pythonic

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

使用 with 語(yǔ)句,系統(tǒng)會(huì)在執(zhí)行完文件操作后自動(dòng)關(guān)閉文件對(duì)象。

6、列表推導(dǎo)式

能夠用一行代碼簡(jiǎn)明扼要地解決問(wèn)題時(shí),絕不要用兩行,比如

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

pythonic

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

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

7、善用裝飾器

裝飾器可以把與業(yè)務(wù)邏輯無(wú)關(guān)的代碼抽離出來(lái),讓代碼保持干凈清爽,而且裝飾器還能被多個(gè)地方重復(fù)利用。比如一個(gè)爬蟲(chóng)網(wǎng)頁(yè)的函數(shù),如果該 URL 曾經(jīng)被爬過(guò)就直接從緩存中獲取,否則爬下來(lái)之后加入到緩存,防止后續(xù)重復(fù)爬取。

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()

用裝飾器寫代碼表面上感覺(jué)代碼量更多,但是它把緩存相關(guān)的邏輯抽離出來(lái)了,可以給更多的函數(shù)調(diào)用,這樣總的代碼量就會(huì)少很多,而且業(yè)務(wù)方法看起來(lái)簡(jiǎn)潔了。

8、合理使用列表
列表對(duì)象(list)是一個(gè)查詢效率高于更新操作的數(shù)據(jù)結(jié)構(gòu),比如刪除一個(gè)元素和插入一個(gè)元素時(shí)執(zhí)行效率就非常低,因?yàn)檫€要對(duì)剩下的元素進(jìn)行移動(dòng)

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 是一個(gè)雙向隊(duì)列的數(shù)據(jù)結(jié)構(gòu),刪除元素和插入元素會(huì)很快

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

方法一速度沒(méi)那么快,因?yàn)槊看蔚臅r(shí)候還要重新進(jìn)行hash查找 key 對(duì)應(yīng)的 value。

方法二遇到字典非常大的時(shí)候,會(huì)導(dǎo)致內(nèi)存的消耗增加一倍以上

# 方法一
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 返回迭代器對(duì)象,可節(jié)省更多的內(nèi)存,不過(guò)在 python3 中沒(méi)有該方法了,只有 items 方法,等值于 iteritems。

​當(dāng)然還有很多 pythonic 寫法,在此不再一一列舉。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python爬蟲(chóng)(入門教程、視頻教程)

    python爬蟲(chóng)(入門教程、視頻教程)

    本文是一篇關(guān)于python爬蟲(chóng)的知識(shí)學(xué)習(xí)教程,并且給大家解答了學(xué)習(xí)了python爬蟲(chóng)怎么掙錢這個(gè)很多程序員疑惑的問(wèn)題,如果你對(duì)這方面的知識(shí)也感興趣,一起深入學(xué)習(xí)一下吧。
    2018-01-01
  • Python實(shí)現(xiàn)視頻目標(biāo)檢測(cè)與軌跡跟蹤流程詳解

    Python實(shí)現(xiàn)視頻目標(biāo)檢測(cè)與軌跡跟蹤流程詳解

    通過(guò)閱讀相關(guān)文獻(xiàn)及測(cè)試,找到了一種基于多模板匹配的改進(jìn)方法,可以對(duì)遙感視頻衛(wèi)星中的移動(dòng)目標(biāo)進(jìn)行探測(cè),并繪制其軌跡。根據(jù)實(shí)驗(yàn)結(jié)果發(fā)現(xiàn),可以比較有效的對(duì)運(yùn)動(dòng)目標(biāo)進(jìn)行跟蹤
    2023-01-01
  • Python爬蟲(chóng)分析微博熱搜關(guān)鍵詞的實(shí)現(xiàn)代碼

    Python爬蟲(chóng)分析微博熱搜關(guān)鍵詞的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Python爬蟲(chóng)分析微博熱搜關(guān)鍵詞的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • python實(shí)戰(zhàn)之PyQt5實(shí)現(xiàn)漫畫臉

    python實(shí)戰(zhàn)之PyQt5實(shí)現(xiàn)漫畫臉

    本文詳細(xì)講解了python實(shí)戰(zhàn)之PyQt5實(shí)現(xiàn)漫畫臉的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • 使用pyecharts生成Echarts網(wǎng)頁(yè)的實(shí)例

    使用pyecharts生成Echarts網(wǎng)頁(yè)的實(shí)例

    今天小編就為大家分享一篇使用pyecharts生成Echarts網(wǎng)頁(yè)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • pytorch?rpc實(shí)現(xiàn)分物理機(jī)器實(shí)現(xiàn)model?parallel的過(guò)程詳解

    pytorch?rpc實(shí)現(xiàn)分物理機(jī)器實(shí)現(xiàn)model?parallel的過(guò)程詳解

    這篇文章主要介紹了pytorch?rpc實(shí)現(xiàn)分物理機(jī)器實(shí)現(xiàn)model?parallel的過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • 使用Pandas的ExcelWriter操作excel的方法

    使用Pandas的ExcelWriter操作excel的方法

    這篇文章主要介紹了使用Pandas的ExcelWriter操作excel的方法,ExcelWriter這個(gè)插件有個(gè)坑,就是已經(jīng)設(shè)置好的格式是無(wú)法更改的,因此,由pandas轉(zhuǎn)成excel的時(shí)候,必須將格式清除,尤其是表頭的格式需要大家多多注意,本文結(jié)合示例代碼講解的非常詳細(xì),需要的朋友參考下吧
    2023-11-11
  • python實(shí)現(xiàn)凱撒密碼加密解密的示例代碼

    python實(shí)現(xiàn)凱撒密碼加密解密的示例代碼

    本文主要介紹了python實(shí)現(xiàn)凱撒密碼加密解密的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • python學(xué)習(xí)筆記之調(diào)用eval函數(shù)出現(xiàn)invalid syntax錯(cuò)誤問(wèn)題

    python學(xué)習(xí)筆記之調(diào)用eval函數(shù)出現(xiàn)invalid syntax錯(cuò)誤問(wèn)題

    python是一門多種用途的編程語(yǔ)言,時(shí)常扮演腳本語(yǔ)言的角色。一般來(lái)說(shuō),python可以定義為面向?qū)ο蟮哪_本語(yǔ)言,這個(gè)定義把面向?qū)ο蟮闹С趾兔嫦蚰_本語(yǔ)言的角色融合在一起。很多時(shí)候,人們常常喜歡用“腳本”和不是語(yǔ)言來(lái)描述python的代碼文件。
    2015-10-10
  • Python統(tǒng)計(jì)文本詞匯出現(xiàn)次數(shù)的實(shí)例代碼

    Python統(tǒng)計(jì)文本詞匯出現(xiàn)次數(shù)的實(shí)例代碼

    這篇文章主要介紹了Python統(tǒng)計(jì)文本詞匯出現(xiàn)次數(shù),這種問(wèn)題在統(tǒng)計(jì)文本詞匯的次數(shù)時(shí)經(jīng)常會(huì)遇到,今天給大家分享解決方案,通過(guò)實(shí)例代碼給大家講解,需要的朋友可以參考下
    2020-02-02

最新評(píng)論