《Python之禪》中對(duì)于Python編程過(guò)程中的一些建議
圍繞一門語(yǔ)言,學(xué)習(xí)它的文化精髓,能讓你成為一名更優(yōu)秀的程序員。如果你還沒(méi)讀過(guò)Python之禪(Zen of Python) ,那么打開(kāi)Python的命令提示符輸入import this,列表中的每一項(xiàng)你都可以在這里找到相對(duì)應(yīng)的例子。
吸引我注意力的一條是:
優(yōu)雅勝于丑陋 (Beautiful is better than ugly)
看下面例子:
一個(gè)帶有數(shù)字參數(shù)的list函數(shù)其功能是返回參數(shù)中的奇數(shù)可以分開(kāi)寫:
#----------------------------------------------------------------------- halve_evens_only = lambda nums: map(lambda i: i/2,\ filter(lambda i: not i%2, nums)) #----------------------------------------------------------------------- def halve_evens_only(nums): return [i/2 for i in nums if not i % 2]
記住Python中那些非常簡(jiǎn)單的事
兩個(gè)變量的交換:
a, b = b, a
參數(shù)在切片操作中的步驟,如:
a = [1,2,3,4,5] >>> a[::2] # 以步長(zhǎng)為2的增量迭代整個(gè)list對(duì)象 [1,3,5]
一個(gè)特殊的例子 `x[::-1]`用來(lái)反轉(zhuǎn)x的實(shí)用語(yǔ)法。
>>> a[::-1] [5,4,3,2,1]
不要用可變對(duì)象作為默認(rèn)參數(shù)值(Don't use mutable as defaults)
def function(x, l=[]): # 不要這么干 def function(x, l=None): # 更好的一種方式 if l is None: l = []
使用iteritems而不是items
iteriterms 使用的是 generators,所以當(dāng)?shù)艽蟮男蛄惺谴朔椒ǜ?br />
d = {1: "1", 2: "2", 3: "3"} for key, val in d.items() # 調(diào)用items()后會(huì)構(gòu)建一個(gè)完整的list對(duì)象 for key, val in d.iteritems() # 只有在迭代時(shí)每請(qǐng)求一次才生成一個(gè)值
此情景和range與xrange的關(guān)系相似。
使用isinstance 而不是type
不要這樣做:
if type(s) == type(""): ... if type(seq) == list or \ type(seq) == tuple: ...
應(yīng)該是這樣:
if isinstance(s, basestring): ... if isinstance(seq, (list, tuple)): ...
至于為什么這樣做,看這里:http://stackoverflow.com/a/1549854/504262
需要注意的是這里使用basestring而不是str是因?yàn)槟憧赡軙?huì)用一個(gè)unicode對(duì)象去檢查是否為string,例如:
>>> a=u'aaaa' >>> print isinstance(a, basestring) True >>> print isinstance(a, str) False
因?yàn)樵赑ython中3.0以下的版本存在兩種字符串類型str和unicode
學(xué)習(xí)各種集合(learn the various collections)
python有各種各樣的容器數(shù)據(jù)類型,在特定情況下選擇python內(nèi)建的容器如:list和dict。通常更多像如下方式使用:
freqs = {} for c in "abracadabra": try: freqs[c] += 1 except: freqs[c] = 1
一種更好的方案如下:
freqs = {} for c in "abracadabra": freqs[c] = freqs.get(c, 0) + 1
一種更好的選擇 collection類型defautdict:
from collections import defaultdict freqs = defaultdict(int) for c in "abracadabra": freqs[c] += 1
其它集合
namedtuple() # 用指定的域創(chuàng)建元組子類的工廠函數(shù) deque # 類似list的容器,快速追加以及刪除在序列的兩端 Counter # 統(tǒng)計(jì)哈希表的dict子類 OrderedDict # 記錄實(shí)體添加順序的dict子類 defaultdict # 調(diào)用工廠方法為key提供缺省值的dict子類
當(dāng)創(chuàng)建類時(shí)Python的魔術(shù)方法:
__eq__(self, other) # 定義相等操作的行為, ==. __ne__(self, other) # 定義不相等操作的行為, !=. __lt__(self, other) #定義小于操作的行為, <. __gt__(self, other) #定義不大于操作的行為, >. __le__(self, other) #定義小于等于操作的行為, <=. __ge__(self, other) #定義大于等于操作的行為, >=.
條件賦值
x = 3 if (y == 1) else 2
表達(dá)式請(qǐng)起來(lái)恰恰像:如果y等于1就把3賦值給x,否則把2賦值給x,當(dāng)然同樣可以使用鏈?zhǔn)綏l件賦值如果你還有更復(fù)雜的條件的話。
x = 3 if (y == 1) else 2 if (y == -1) else 1
然而到了某個(gè)特定的點(diǎn),它就有點(diǎn)兒過(guò)分了。
記住,你可以在任何表達(dá)式中使用if-else例如:
(func1 if y == 1 else func2)(arg1, arg2)
func1將被調(diào)用如果y等于1的話,反之func2被調(diào)用。兩種情況下,arg1和arg2兩個(gè)參數(shù)都將附帶在相應(yīng)的函數(shù)中。
類似地,下面這個(gè)表達(dá)式同樣是正確的
x = (class1 if y == 1 else class2)(arg1, arg2)
class1和class2是兩個(gè)類
在有必要的時(shí)侯使用Ellipsis
創(chuàng)建類時(shí),你可以使用__getitem__,讓你的類像字典一個(gè)工作,拿下面這個(gè)類舉例來(lái)說(shuō):
class MyClass(object): def __init__(self, a, b, c, d): self.a, self.b, self.c, self.d = a, b, c, d def __getitem__(self, item): return getattr(self, item) x = MyClass(10, 12, 22, 14)
因?yàn)橛辛薩_getitem__,你就能夠通過(guò)對(duì)象x的x[‘a(chǎn)']獲取a的值,這應(yīng)該是公認(rèn)的事實(shí)。
這個(gè)對(duì)象通常用于繼承Python的切片(slicing) (http://docs.python.org/library/stdtypes.html#bltin-ellipsis-object),如果添加如下語(yǔ)句:
def __getitem__(self, item): if item is Ellipsis: return [self.a, self.b, self.c, self.d] else: return getattr(self, item)
我們就可以使用x[…]獲取的包含所有項(xiàng)的序列
>>> x = MyClass(11, 34, 23, 12) >>> x[...] [11, 34, 23, 12]
相關(guān)文章
對(duì)python創(chuàng)建及引用動(dòng)態(tài)變量名的示例講解
今天小編就為大家分享一篇對(duì)python創(chuàng)建及引用動(dòng)態(tài)變量名的示例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11Python?Pandas如何獲取和修改任意位置的值(at,iat,loc,iloc)
在我們對(duì)數(shù)據(jù)進(jìn)行選擇之后,需要對(duì)特定的數(shù)據(jù)進(jìn)行設(shè)置更改,設(shè)置,下面這篇文章主要給大家介紹了關(guān)于Python?Pandas如何獲取和修改任意位置的值(at,iat,loc,iloc)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01淺談tensorflow中幾個(gè)隨機(jī)函數(shù)的用法
今天小編就為大家分享一篇淺談tensorflow中幾個(gè)隨機(jī)函數(shù)的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07Python os.listdir與os.walk實(shí)現(xiàn)獲取路徑詳解
這篇文章主要介紹了Python使用os.listdir和os.walk獲取文件路徑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-10-10詳解如何通過(guò)Python制作一個(gè)密碼生成器
定期更換密碼是一種非常重要的安全措施,這種做法可以有效地保護(hù)你的賬戶和個(gè)人信息不受黑客和網(wǎng)絡(luò)攻擊者的侵害。所以本文就來(lái)用Python制作一個(gè)密碼生成器吧2023-05-05