Python最大的優(yōu)點(diǎn)之一就是語法簡潔,好的代碼就像偽代碼一樣,干凈、整潔、一目了然。要寫出 Pythonic(優(yōu)雅的、地道的、整潔的)代碼,需要多看多學(xué)大牛們寫的代碼,github 上有很多非常優(yōu)秀的源代碼值得閱讀,比如:requests、flask、tornado,下面列舉一些常見的Pythonic寫法。
0. 程序必須先讓人讀懂,然后才能讓計算機(jī)執(zhí)行。
“Programs must be written for people to read, and only incidentally for machines to execute.”
1. 交換賦值
##不推薦temp=aa=bb=a##推薦a,b=b,a#先生成一個元組(tuple)對象,然后unpack
2. Unpacking
##不推薦l=['David','Pythonista','+1-514-555-1234']first_name=l[0]last_name=l[1]phone_number=l[2]##推薦l=['David','Pythonista','+1-514-555-1234']first_name,last_name,phone_number=l#Python3Onlyfirst,*middle,last=another_list
3. 使用操作符in
##不推薦iffruit=="apple"orfruit=="orange"orfruit=="berry":#多次判斷##推薦iffruitin["apple","orange","berry"]:#使用in更加簡潔
4. 字符串操作
##不推薦colors=['red','blue','green','yellow']result=''forsincolors:result+=s#每次賦值都丟棄以前的字符串對象,生成一個新對象##推薦colors=['red','blue','green','yellow']result=''.join(colors)#沒有額外的內(nèi)存分配
5. 字典鍵值列表
##不推薦forkeyinmy_dict.keys():#my_dict[key]...##推薦forkeyinmy_dict:#my_dict[key]...#只有當(dāng)循環(huán)中需要更改key值的情況下,我們需要使用my_dict.keys()#生成靜態(tài)的鍵值列表。
6. 字典鍵值判斷
##不推薦ifmy_dict.has_key(key):#...dosomethingwithd[key]##推薦ifkeyinmy_dict:#...dosomethingwithd[key]
7. 字典 get 和 setdefault 方法
##不推薦navs={}for(portfolio,equity,position)indata:ifportfolionotinnavs:navs[portfolio]=0navs[portfolio]+=position*prices[equity]##推薦navs={}for(portfolio,equity,position)indata:#使用get方法navs[portfolio]=navs.get(portfolio,0)+position*prices[equity]#或者使用setdefault方法navs.setdefault(portfolio,0)navs[portfolio]+=position*prices[equity]
8. 判斷真?zhèn)?/p>
##不推薦ifx==True:#....iflen(items)!=0:#...ifitems!=[]:#...##推薦ifx:#....ifitems:#...
9. 遍歷列表以及索引
##不推薦items='zeroonetwothree'.split()#method1i=0foriteminitems:printi,itemi+=1#method2foriinrange(len(items)):printi,items[i]##推薦items='zeroonetwothree'.split()fori,iteminenumerate(items):printi,item
10. 列表推導(dǎo)
##不推薦new_list=[]foritemina_list:ifcondition(item):new_list.append(fn(item))##推薦new_list=[fn(item)foritemina_listifcondition(item)]
11. 列表推導(dǎo)-嵌套
##不推薦forsub_listinnested_list:iflist_condition(sub_list):foriteminsub_list:ifitem_condition(item):#dosomething...##推薦gen=(itemforslinnested_listiflist_condition(sl)\foriteminslifitem_condition(item))foritemingen:#dosomething...
12. 循環(huán)嵌套
##不推薦forxinx_list:foryiny_list:forzinz_list:#dosomethingforx&y##推薦fromitertoolsimportproductforx,y,zinproduct(x_list,y_list,z_list):#dosomethingforx,y,z
13. 盡量使用生成器代替列表
##不推薦defmy_range(n):i=0result=[]whilei
14. 中間結(jié)果盡量使用imap/ifilter代替map/filter
##不推薦reduce(rf,filter(ff,map(mf,a_list)))##推薦fromitertoolsimportifilter,imapreduce(rf,ifilter(ff,imap(mf,a_list)))*lazyevaluation會帶來更高的內(nèi)存使用效率,特別是當(dāng)處理大數(shù)據(jù)操作的時候。
15. 使用any/all函數(shù)
##不推薦found=Falseforitemina_list:ifcondition(item):found=Truebreakiffound:#dosomethingiffound...##推薦ifany(condition(item)foritemina_list):#dosomethingiffound...
16. 屬性(property)
=
##不推薦classClock(object):def__init__(self):self.__hour=1defsetHour(self,hour):if25>hour>0:self.__hour=hourelse:raiseBadHourExceptiondefgetHour(self):returnself.__hour##推薦classClock(object):def__init__(self):self.__hour=1def__setHour(self,hour):if25>hour>0:self.__hour=hourelse:raiseBadHourExceptiondef__getHour(self):returnself.__hourhour=property(__getHour,__setHour)
17. 使用 with 處理文件打開
##不推薦f=open("some_file.txt")try:data=f.read()#其他文件操作..finally:f.close()##推薦withopen("some_file.txt")asf:data=f.read()#其他文件操作...
18. 使用 with 忽視異常(僅限Python 3)
##不推薦try:os.remove("somefile.txt")exceptOSError:pass##推薦fromcontextlibimportignored#Python3onlywithignored(OSError):os.remove("somefile.txt")
19. 使用 with 處理加鎖
##不推薦importthreadinglock=threading.Lock()lock.acquire()try:#互斥操作...finally:lock.release()##推薦importthreadinglock=threading.Lock()withlock:#互斥操作...
20. 參考
1) Idiomatic Python:http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html
2) PEP 8: Style Guide for Python Code:http://www.python.org/dev/peps/pep-0008/
-
編程
+關(guān)注
關(guān)注
88文章
3637瀏覽量
93929 -
python
+關(guān)注
關(guān)注
56文章
4807瀏覽量
84987
原文標(biāo)題:符合語言習(xí)慣的 Python 優(yōu)雅編程技巧
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論