優(yōu)雅勝于丑陋 (Beautiful is better than ugly)
看下面例子:
一個(gè)帶有數(shù)字參數(shù)的list函數(shù)其功能是返回參數(shù)中的奇數(shù)可以分開寫:
Python
6#-----------------------------------------------------------------------
halve_evens_only=lambdanums:map(lambdai:i/2,\
filter(lambdai:noti%2,nums))
#-----------------------------------------------------------------------
defhalve_evens_only(nums):
return[i/2foriinnumsifnoti%2]
記住Python中那些非常簡單的事
兩個(gè)變量的交換:
Python
1
a,b=b,a
參數(shù)在切片操作中的步驟狼忱,如:
Python
1
2
3a=[1,2,3,4,5]
>>>a[::2]# 以步長為2的增量迭代整個(gè)list對(duì)象
[1,3,5]
Python
1
一個(gè)特殊的例子`x[::-1]`用來反轉(zhuǎn)x的實(shí)用語法战转。
1
Python
1
2>>>a[::-1]
[5,4,3,2,1]
不要用可變對(duì)象作為默認(rèn)參數(shù)值(Don’t use mutable as defaults)
Python
4deffunction(x,l=[]):# 不要這么干
deffunction(x,l=None):# 更好的一種方式
iflisNone:
l=[]
使用iteritems而不是items
iteriterms 使用的是 generators,所以當(dāng)?shù)艽蟮男蛄惺谴朔椒ǜ?/p>
Python
5d={1:"1",2:"2",3:"3"}
forkey,valind.items()# 調(diào)用items()后會(huì)構(gòu)建一個(gè)完整的list對(duì)象
forkey,valind.iteritems()# 只有在迭代時(shí)每請(qǐng)求一次才生成一個(gè)值
此情景和range與xrange的關(guān)系相似。
使用isinstance而不是type
不要這樣做:
1
Python
1
2
3iftype(s)==type(""):...
iftype(seq)==listor\
type(seq)==tuple:...
應(yīng)該是這樣:
1
Python
1
2ifisinstance(s,basestring):...
ifisinstance(seq,(list,tuple)):...
需要注意的是這里使用basestring而不是str是因?yàn)槟憧赡軙?huì)用一個(gè)unicode對(duì)象去檢查是否為string,例如:
Python
5>>>a=u'aaaa'
>>>printisinstance(a,basestring)
True
>>>printisinstance(a,str)
False
因?yàn)樵赑ython中3.0以下的版本存在兩種字符串類型str和unicode
Python
1
object
Python
1
|
Python
1
basestring
Python
1
/\
Python
1
strunicode
學(xué)習(xí)各種集合(learn the various collections)
python有各種各樣的容器數(shù)據(jù)類型惨寿,在特定情況下選擇python內(nèi)建的容器如:list和dict香璃。通常更多像如下方式使用:
Python
6freqs={}
forcin"abracadabra":
try:
freqs[c]+=1
except:
freqs[c]=1
一種更好的方案如下:
Python
3freqs={}
forcin"abracadabra":
freqs[c]=freqs.get(c,0)+1
一種更好的選擇 collection類型defautdict:
Python
4fromcollectionsimportdefaultdict
freqs=defaultdict(int)
forcin"abracadabra":
freqs[c]+=1
其它集合
Python
5namedtuple()# 用指定的域創(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ù)方法:
Python
6__eq__(self,other)# 定義相等操作的行為, ==.
__ne__(self,other)# 定義不相等操作的行為, !=.
__lt__(self,other)#定義小于操作的行為, <.
__gt__(self,other)#定義不大于操作的行為, >.
__le__(self,other)#定義小于等于操作的行為, <=.
__ge__(self,other)#定義大于等于操作的行為, >=.
條件賦值
Python
1
x=3if(y==1)else2
表達(dá)式請(qǐng)起來恰恰像:如果y等于1就把3賦值給x,否則把2賦值給x仔燕,當(dāng)然同樣可以使用鏈?zhǔn)綏l件賦值如果你還有更復(fù)雜的條件的話造垛。
Python
1
x=3if(y==1)else2if(y==-1)else1
然而到了某個(gè)特定的點(diǎn),它就有點(diǎn)兒過分了晰搀。
記住五辽,你可以在任何表達(dá)式中使用if-else例如:
Python
1
(func1ify==1elsefunc2)(arg1,arg2)
func1將被調(diào)用如果y等于1的話,反之func2被調(diào)用外恕。兩種情況下杆逗,arg1和arg2兩個(gè)參數(shù)都將附帶在相應(yīng)的函數(shù)中。
類似地鳞疲,下面這個(gè)表達(dá)式同樣是正確的
Python
1
x=(class1ify==1elseclass2)(arg1,arg2)
class1和class2是兩個(gè)類
在有必要的時(shí)侯使用Ellipsis
創(chuàng)建類時(shí)髓迎,你可以使用__getitem__,讓你的類像字典一個(gè)工作建丧,拿下面這個(gè)類舉例來說:
Python
8classMyClass(object):
def__init__(self,a,b,c,d):
self.a,self.b,self.c,self.d=a,b,c,d
def__getitem__(self,item):
returngetattr(self,item)
x=MyClass(10,12,22,14)
因?yàn)橛辛薩_getitem__排龄,你就能夠通過對(duì)象x的x[‘a(chǎn)’]獲取a的值,這應(yīng)該是公認(rèn)的事實(shí)翎朱。
這個(gè)對(duì)象通常用于繼承Python的切片(slicing)如果添加如下語句:
Python
5def__getitem__(self,item):
ifitemisEllipsis:
return[self.a,self.b,self.c,self.d]
else:
returngetattr(self,item)
我們就可以使用x[…]獲取的包含所有項(xiàng)的序列
Python
1
2
3>>>x=MyClass(11,34,23,12)
>>>x[...]
[11,34,23,12]學(xué)好python你需要一個(gè)良好的環(huán)境橄维,一個(gè)優(yōu)質(zhì)的開發(fā)交流群,群里都是那種相互幫助的人才是可以的拴曲,我有建立一個(gè)python學(xué)習(xí)交流群争舞,在群里我們相互幫助,相互關(guān)心澈灼,相互分享內(nèi)容竞川,這樣出問題幫助你的人就比較多店溢,群號(hào)是301,還有056委乌,最后是051床牧,這樣就可以找到大神聚合的群,如果你只愿意別人幫助你遭贸,不愿意分享或者幫助別人戈咳,那就請(qǐng)不要加了,你把你會(huì)的告訴別人這是一種分享壕吹。
學(xué)習(xí)是對(duì)自己最好的投資著蛙,而機(jī)會(huì)屬于有準(zhǔn)備的人,這是一個(gè)看臉的時(shí)代耳贬,但最終拼的是實(shí)力踏堡。人和人之間的差距不在于智商,而在于如何利用業(yè)余時(shí)間咒劲,所以沒有等出來的輝煌顷蟆,只有干出來的精彩。其實(shí)只要你想學(xué)習(xí)缎患,什么時(shí)候開始都不晚,不要擔(dān)心這擔(dān)心那阎肝,你只需努力挤渔,剩下的交給時(shí)間,而你之所以還沒有變強(qiáng)风题,只因你還不夠努力判导,要記得付出不亞于任何人的努力。