当前位置: 首页 > 后端技术 > PHP

不改正这些坏习惯就学Python,等于白学!

时间:2023-03-30 02:21:56 PHP

大家好~今天给大家分享Python的15个坏习惯。这些坏习惯你中招了吗?之所以会出现这些坏习惯,主要是因为开发者对Python的经验不足。摒弃这些习惯,用Pythonic方式写代码,不仅可以提高代码质量,还能给看代码的人留下好印象~**1。使用+号拼接字符串**坏习惯:class="highlight`">`ifsubscribers>100000:print("Wow"+name+"!youhave"+str(subscribers)+"subscribers!")else:print("Lol"+name+"that'snotmanysubs")是使用f-string,效率会更高:#subscribers>100000更好:print(f"Wow{name}!youhave{subscribers}subscribers!")else:print(f"Lol{name}that'snotmanysubs")**2.使用finaly而不是上下文管理器**坏习惯:s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)try:s.connect((host,port))s.sendall(b'Hello,world')finally:s.close()调整后的方法是使用上下文管理器,即使发生异常,socket也会closed:#关闭,即使socket.socket(socket.AF_INET,socket.SOCK_STREAM)ass:s.connect((host,port))s.sendall(b'Hello,world')##**3.尝试手动关闭文件**坏习惯:f=open(filename,"w")f.write("hello!\n")f.close()调整后的方法是使用上下文管理器。即使发生异常,文件也会自动关闭。任何有contextmanager的人,都应该首先使用:withopen(filename)asf:f.write("hello!\n")#自动关闭,即使出现异常##**4.不要在except**之后写任何东西坏习惯:whileTrue:try:s=input("Inputanumber:")x=int(s)breakexcept:#oops!can'tCTRL-Ctoexitprint("Notanumber,tryagain")这样会捕获所有异常,导致程序按CTRL-C会终止,调整后的做法是:whileTrue:try:s=input("Inputanumber:")x=int(s)breakexceptException:#BreakexceptException:#BetterthanthisisuseValueErrorprint("Notanumber,tryagain")##**5.函数参数使用可变对象**如果函数参数使用可变对象,下次调用该函数时可能会出现意想不到的结果。不好的做法:defappend(n,l=[]):l.append(n)returnll1=append(0)#[0]l2=append(1)#[0,1]调整后的方法如下:defappend(n,l=None):如果l为None:l=[]l.append(n)returnll1=append(0)#[0]l2=append(1)#[1]##**6,永远不要使用comprehension**不好的做法:foriinrange(10):squares[i]=i*iAdjusted做法:##**7.求导成瘾**虽然求导好用,但不能牺牲可读性,不好的做法:sum(a[n*i+k]*b[n*k+j]forkinrange(n))foriinrange(n)forjinrange(n)的调整方法如下:foriinrange(n):forjinrange(n):ij_entry=sum(a[n*i+k]*b[n*k+j]forkinrange(n))c.append(ij_entry)##**8。用==判断是否是单例**不好的做法:ifx==None:passifx==True:passifx==False:pass的调整方法如下:#betterifxisNone:如果x为真则通过:如果x为假则通过:通过##**9。使用C类风格的for循环**坏习惯:a=[1,2,3]foriinrange(len(a)):v=a[i]...b=[4,5,6]foriinrange(len(b)):av=a[i]bv=b[i]...调整后的方法如下:a=[1,2,3]#insteadforvina:。..#或者如果你想要i,vinenumerate(a)的索引:...#而不是使用zipforav,bvinzip(a,b):...##**10,不切实际的字典。items**Badpractice:d={"a":1,"b":2,"c":3}forkeyind:val=d[key]...调整后的做法如下:d={"a":1,"b":2,"c":3}forkey,valind.items():...##**11。使用time.time()统计耗时**坏习惯:start=time.time()time.sleep(1)end=time.time()print(end-start)调整后的方法是使用time.perf_counter(),更准确:#更准确start=time.perf_counter()time.sleep(1)end=time.perf_counter()print(end-start)##**13。调用外部命令时使用shell=True**坏习惯:如果shell=True,将ls-l传递给/bin/sh(shell)而不是Unix上的ls程序,导致子进程产生一个中间shell进程,在其他情况下换句话说,使用中间shell意味着对变量、glob模式和其他特殊的所有shell函数进行预处理,例如$HOME在执行echo命令之前进行处理。调整后的做法是拒绝从shell执行,如下:##**14,nevertrytousenumpy**Badpractice:x=list(range(100))y=list(range(100))s=[a+bfora,binzip(x,y)]调整后的方法如下:defnot_using_numpy_pandas():#Fasterperformancex=np.arange(100)y=np.arange(100)s=x+y##**15。我喜欢import***调整后的方法,如下:count()这样的话,谁也不知道这个脚本有多少个变量。更好的方法:defmain():awesome_function()if__name__=='__main__':main()以上是我总结的一些tips,到这里就结束了。如果还有其他补充或者不同意见欢迎在评论中讨论或者私信我哦~