给大家整理了19个pythonic的编程习惯(小结)
Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净、整洁、一目了然。
要写出Pythonic(优雅的、地道的、整洁的)代码,需要多看多学大牛们写的代码,github上有很多非常优秀的源代码值得阅读,比如:requests、flask、tornado,下面列举一些常见的Pythonic写法。
0.程序必须先让人读懂,然后才能让计算机执行。
“Programsmustbewrittenforpeopletoread,andonlyincidentallyformachinestoexecute.”
1.交换赋值
##不推荐 temp=a a=b b=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 #Python3Only first,*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)#没有额外的内存分配
5.字典键值列表
##不推荐 forkeyinmy_dict.keys(): #my_dict[key]... ##推荐 forkeyinmy_dict: #my_dict[key]... #只有当循环中需要更改key值的情况下,我们需要使用my_dict.keys() #生成静态的键值列表。
6.字典键值判断
##不推荐 ifmy_dict.has_key(key): #...dosomethingwithd[key] ##推荐 ifkeyinmy_dict: #...dosomethingwithd[key]
7.字典get和setdefault方法
##不推荐 navs={} for(portfolio,equity,position)indata: ifportfolionotinnavs: navs[portfolio]=0 navs[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.判断真伪
##不推荐 ifx==True: #.... iflen(items)!=0: #... ifitems!=[]: #... ##推荐 ifx: #.... ifitems: #...
9.遍历列表以及索引
##不推荐 items='zeroonetwothree'.split() #method1 i=0 foriteminitems: printi,item i+=1 #method2 foriinrange(len(items)): printi,items[i] ##推荐 items='zeroonetwothree'.split() fori,iteminenumerate(items): printi,item
10.列表推导
##不推荐 new_list=[] foritemina_list: ifcondition(item): new_list.append(fn(item)) ##推荐 new_list=[fn(item)foritemina_listifcondition(item)]
11.列表推导-嵌套
##不推荐 forsub_listinnested_list: iflist_condition(sub_list): foriteminsub_list: ifitem_condition(item): #dosomething... ##推荐 gen=(itemforslinnested_listiflist_condition(sl)\ foriteminslifitem_condition(item)) foritemingen: #dosomething...
12.循环嵌套
##不推荐 forxinx_list: foryiny_list: forzinz_list: #dosomethingforx&y ##推荐 fromitertoolsimportproduct forx,y,zinproduct(x_list,y_list,z_list): #dosomethingforx,y,z
13.尽量使用生成器代替列表
##不推荐 defmy_range(n): i=0 result=[] whilei<n: result.append(fn(i)) i+=1 returnresult#返回列表 ##推荐 defmy_range(n): i=0 result=[] whilei<n: yieldfn(i)#使用生成器代替列表 i+=1 #尽量用生成器代替列表,除非必须用到列表特有的函数。
14.中间结果尽量使用imap/ifilter代替map/filter
##不推荐 reduce(rf,filter(ff,map(mf,a_list))) ##推荐 fromitertoolsimportifilter,imap reduce(rf,ifilter(ff,imap(mf,a_list))) #lazyevaluation会带来更高的内存使用效率,特别是当处理大数据操作的时候。
15.使用any/all函数
##不推荐 found=False foritemina_list: ifcondition(item): found=True break iffound: #dosomethingiffound... ##推荐 ifany(condition(item)foritemina_list): #dosomethingiffound...
16.属性(property)
##不推荐 classClock(object): def__init__(self): self.__hour=1 defsetHour(self,hour): if25>hour>0:self.__hour=hour else:raiseBadHourException defgetHour(self): returnself.__hour ##推荐 classClock(object): def__init__(self): self.__hour=1 def__setHour(self,hour): if25>hour>0:self.__hour=hour else:raiseBadHourException def__getHour(self): returnself.__hour hour=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忽视异常(仅限Python3)
##不推荐 try: os.remove("somefile.txt") exceptOSError: pass ##推荐 fromcontextlibimportignored#Python3only withignored(OSError): os.remove("somefile.txt")
19.使用with处理加锁
##不推荐 importthreading lock=threading.Lock() lock.acquire() try: #互斥操作... finally: lock.release() ##推荐 importthreading lock=threading.Lock() withlock: #互斥操作...
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。