西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)其它知識(shí) → 一些Python的慣用法和小技巧:Pythonic

一些Python的慣用法和小技巧:Pythonic

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來源:本站整理時(shí)間:2010/11/26 23:56:49字體大。A-A+

作者:佚名點(diǎn)擊:670次評(píng)論:0次標(biāo)簽: Python Delphi vb

  • 類型:加密解密大。574KB語言:英文 評(píng)分:.5
  • 標(biāo)簽:
立即下載
Pythonic其實(shí)是個(gè)模糊的含義,沒有確定的解釋。網(wǎng)上也沒有過多關(guān)于Pythonic的說明,我個(gè)人的理解是更加Python,更符合Python的行為習(xí)慣。本文主要是說明一些Python的慣用法和小技巧,其實(shí)與上一篇《編碼規(guī)范》有異曲同工之妙,都是為了增加代碼可讀性,但Pythonic可能還會(huì)從性能的角度進(jìn)行考慮。

首先是兩個(gè)不得不說的Python的特性List Comprehension和Generator Expression,非常精簡的語法,很大程度上取代了冗長for循環(huán)。

1. 列表解析(List Comprehension)List Comprehension是在Python2.0版本中加進(jìn)入的,是一種更高效、簡潔的for結(jié)構(gòu)替代品,作為新手寫上幾個(gè)后就對(duì)它愛不釋手,驚呼太好用了。

例子:將原始列表中的所有元素進(jìn)行某種操作后賦值給新的列表。

如果用for循環(huán),代碼如下:

oldlist = []

for item in oldlist:

newlist.append(func(item))

如果使用List Comprehension,代碼如下:

newlist = [func(item) for item in oldlist]

我們明顯看到差別,3行變一行,代碼可讀性增強(qiáng),而且性能也提升很多,據(jù)說基本可以達(dá)到C語言的速度。

List Comprehension還支持過濾功能,在列表生成過程中套用for if字句,非常好用。示例如下:

evens = [even for even in range(10) if even % 2 == 0]

只需要一行,就將得到0到9的數(shù)字中的所有偶數(shù),過濾掉了奇數(shù)。

2. 生成器表達(dá)式(Generator Expression):Python2.4中引入了Generator Expression。它功能上類似于List Comprehension,這你就要問了,為什么要加入這個(gè)呢。因?yàn)镚enerator Expression更加高效,避免了生成整個(gè)列表,改善性能及內(nèi)存占用,取而代之的是返回一個(gè)generator object,通過它迭代的返回列表中的每一個(gè)值。

而且Generator Expression的使用方法也很簡單,就是將List Comprehension中的中括號(hào)[]改成小括號(hào)(),示例如下:

newlist = (func(item) for item in oldlist)

這個(gè)返回的newlist其實(shí)并不是一個(gè)list,而是前面提到的generator object,可以理解為列表的一個(gè)迭代器,類似于C++中的iter。 可以通過newlist.next()迭代獲得列表中的每一項(xiàng)。

List Comprehension和Generator Expression實(shí)在是Python中的亮點(diǎn),簡潔高效,一定要經(jīng)常用、時(shí)時(shí)用、秒秒用。

然后是一些小技巧(大多數(shù)是很多語言都提倡的編程實(shí)踐):

1. 字符串拼接:使用’’.join進(jìn)行字符串拼接,而不是a += b這種形式。因?yàn)閖oin將保證這個(gè)過程的時(shí)間復(fù)雜度為線性的,效率更高。道理很多人都知道,但是大多數(shù)人還是喜歡用“+”,因?yàn)檫@個(gè)實(shí)在太簡潔了。其實(shí)很多語言都提供了拼接字符串的方法或者相應(yīng)的類,良好編程習(xí)慣從拼接字符串開始。

2. 異常類型:基于類的異常總是好過基于字符串的異常。我們最好構(gòu)造一個(gè)基于Exception的子類。

當(dāng)拋出一個(gè)異常的時(shí)候,使用”raise ValueError(‘message’)”替代”raise ValueError, ’message’”的形式。

3. None判斷:判斷一個(gè)實(shí)例變量是否為空的時(shí)候,應(yīng)該總是用’is’或者’is not’,而不要使用相等操作符。

4. 對(duì)象類型判斷:對(duì)象類型的比較應(yīng)該始終用isinstance()代替直接比較類型。例如:

使用if isinstance(obj, int): 而不是 if type(obj) is type(1):

5. 字符串前后綴判斷:在檢查前綴或后綴時(shí)避免對(duì)字符串進(jìn)行切片。用startswith()和endswith()代替,因?yàn)樗鼈兪敲鞔_的并且錯(cuò)誤更少。例如:

使用if foo.startswith('bar'): 替代 if foo[:3] == 'bar':

6. 變量值交換:在其他語言中,我們經(jīng)常這樣交換兩個(gè)變量的值。t=a; a=b; b=t;

但是在Python中,我們還有一個(gè)簡單的辦法,a, b = b, a,并且這種方法更快,更酷。

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過審核才能顯示)