Python开发中需要摒弃的坏习惯有哪些
Python开发中需要摒弃的坏习惯有哪些
这篇“Python开发中需要摒弃的坏习惯有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python开发中需要摒弃的坏习惯有哪些”文章吧。
1、拼接字符串用 + 号
坏的做法:
defmanual_str_formatting(name,subscribers):ifsubscribers>100000:print("Wow"+name+"!youhave"+str(subscribers)+"subscribers!")else:print("Lol"+name+"that'snotmanysubs")
好的做法是使用 f-string,而且效率会更高:
defmanual_str_formatting(name,subscribers):#betterifsubscribers>100000:print(f"Wow{name}!youhave{subscribers}subscribers!")else:print(f"Lol{name}that'snotmanysubs")
2、使用 finaly 而不是上下文管理器
坏的做法:
deffinally_instead_of_context_manager(host,port):s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)try:s.connect((host,port))s.sendall(b'Hello,world')finally:s.close()
好的做法是使用上下文管理器,即使发生异常,也会关闭 socket::
deffinally_instead_of_context_manager(host,port):#closeevenifexceptionwithsocket.socket(socket.AF_INET,socket.SOCK_STREAM)ass:s.connect((host,port))s.sendall(b'Hello,world')
3、尝试手动关闭文件
坏的做法:
defmanually_calling_close_on_a_file(filename):f=open(filename,"w")f.write("hello!\n")f.close()
好的做法是使用上下文管理器,即使发生异常,也会自动关闭文件,凡是有上下文管理器的,都应该首先采用:
defmanually_calling_close_on_a_file(filename):withopen(filename)asf:f.write("hello!\n")#closeautomatic,evenifexception
4、except 后面什么也不写
坏的做法:
defbare_except():whileTrue:try:s=input("Inputanumber:")x=int(s)breakexcept:#oops!can'tCTRL-Ctoexitprint("Notanumber,tryagain")
这样会捕捉所有异常,导致按下 CTRL-C 程序都不会终止,好的做法是
defbare_except():whileTrue:try:s=input("Inputanumber:")x=int(s)breakexceptException:#比这更好的是用ValueErrorprint("Notanumber,tryagain")
5、函数参数使用可变对象
如果函数参数使用可变对象,那么下次调用时可能会产生非预期结果,坏的做法
defmutable_default_arguments():defappend(n,l=[]):l.append(n)returnll1=append(0)#[0]l2=append(1)#[0,1]
好的做法:
defmutable_default_arguments():defappend(n,l=None):iflisNone:l=[]l.append(n)returnll1=append(0)#[0]l2=append(1)#[1]
6、从不用推导式
坏的做法
squares={}foriinrange(10):squares[i]=i*i
好的做法
odd_squares={i:i*iforiinrange(10)}
7、推导式用的上瘾
推导式虽然好用,但是不可以牺牲可读性,坏的做法
c=[sum(a[n*i+k]*b[n*k+j]forkinrange(n))foriinrange(n)forjinrange(n)]
好的做法:
c=[]foriinrange(n):forjinrange(n):ij_entry=sum(a[n*i+k]*b[n*k+j]forkinrange(n))c.append(ij_entry)
8、检查类型是否一致用 ==
坏的做法
defchecking_type_equality():Point=namedtuple('Point',['x','y'])p=Point(1,2)iftype(p)==tuple:print("it'satuple")else:print("it'snotatuple")
好的做法
defchecking_type_equality():Point=namedtuple('Point',['x','y'])p=Point(1,2)#probablymeanttocheckifisinstanceoftupleifisinstance(p,tuple):print("it'satuple")else:print("it'snotatuple")
9、用 == 判断是否单例
坏的做法
defequality_for_singletons(x):ifx==None:passifx==True:passifx==False:pass
好的做法
defequality_for_singletons(x):#betterifxisNone:passifxisTrue:passifxisFalse:pass
10、判断一个变量用 bool(x)
坏的做法
defchecking_bool_or_len(x):ifbool(x):passiflen(x)!=0:pass
好的做法
defchecking_bool_or_len(x):#usuallyequivalenttoifx:pass
11、使用类 C 风格的 for 循环
坏的做法
defrange_len_pattern():a=[1,2,3]foriinrange(len(a)):v=a[i]...b=[4,5,6]foriinrange(len(b)):av=a[i]bv=b[i]...
好的做法
defrange_len_pattern():a=[1,2,3]#insteadforvina:...#orifyouwantedtheindexfori,vinenumerate(a):...#insteadusezipforav,bvinzip(a,b):...
12、不实用 dict.items
坏的做法
defnot_using_dict_items():d={"a":1,"b":2,"c":3}forkeyind:val=d[key]...
好的做法
defnot_using_dict_items():d={"a":1,"b":2,"c":3}forkey,valind.items():...
13、解包元组使用索引
坏的做法
mytuple=1,2x=mytuple[0]y=mytuple[1]
好的做法
mytuple=1,2x,y=mytuple
14、使用 time.time() 统计耗时
坏的做法
deftiming_with_time():start=time.time()time.sleep(1)end=time.time()print(end-start)
好的做法是使用 time.perf_counter(),更精确:
deftiming_with_time():#moreaccuratestart=time.perf_counter()time.sleep(1)end=time.perf_counter()print(end-start)
15、记录日志使用 print 而不是 logging
坏的做法
defprint_vs_logging():print("debuginfo")print("justsomeinfo")print("baderror")
好的做法
defprint_vs_logging():#versus#inmainlevel=logging.DEBUGfmt='[%(levelname)s]%(asctime)s-%(message)s'logging.basicConfig(level=level,format=fmt)#whereverlogging.debug("debuginfo")logging.info("justsomeinfo")logging.error("uhoh:(")
16、调用外部命令时使用 shell=True
坏的做法
subprocess.run(["ls-l"],capture_output=True,shell=True)
如果 shell=True,则将 ls -l
传递给/bin/sh(shell) 而不是 Unix 上的 ls 程序,会导致 subprocess 产生一个中间 shell 进程, 换句话说,使用中间 shell 意味着在命令运行之前,命令字符串中的变量、glob 模式和其他特殊的 shell 功能都会被预处理。比如,$HOME 会在在执行 echo 命令之前被处理处理。
好的做法是拒绝从 shell 执行:
subprocess.run(["ls","-l"],capture_output=True)
17、从不尝试使用 numpy
坏的做法
defnot_using_numpy_pandas():x=list(range(100))y=list(range(100))s=[a+bfora,binzip(x,y)]
好的做法:
importnumpyasnpdefnot_using_numpy_pandas():#性能更快x=np.arange(100)y=np.arange(100)s=x+y
18、喜欢 import *
坏的做法
fromitertoolsimport*count()
这样的话,没有人直到这个脚本到底有多数变量, 好的做法:
frommypackage.nearby_moduleimportawesome_functiondefmain():awesome_function()if__name__=='__main__':main()
以上就是关于“Python开发中需要摒弃的坏习惯有哪些”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注恰卡编程网行业资讯频道。
推荐阅读
-
python(中无效的十进制怎么解决 python怎么转换进制)
python怎么转换进制?Python执行二进制转换:1.十进制到二进制(bin)首先,让让我们看看如何将十进制转换成二进制。我...
-
python怎么清除完全相同的行(python splte如何分隔有多个相同符号的str)
pythonsplte如何分隔有多个相同符号的str?str你的string内容str_(相同的符号)执行完了以后再在相同符号的...
-
python(编程控制电脑关机 如何控制电脑关机)
如何控制电脑关机?可以在电脑的运行窗口中输入输入公式,给电脑可以设置自动关机。1.按开快捷键winr然后打开运行窗口。2.在运行窗...
-
python中的特殊标识符(python 中 标识符中可以有逗号吗)
python中标识符中可以有逗号吗?在python语言中合法的标识符是字母、数字以及_,所以我合法的标识符中肯定不能有逗号if...
-
python(excel 提取数据写入新表 python导入excel数据找不到工作簿)
python导入excel数据找不到工作簿?我可以导入数据后找不到工作,不是因为他的工作没有被转移。什么软件可提取并合并Exce...
-
python中字典定义的四种方法(python global关键字的用法详解)
pythonglobal关键字的用法详解?global标志实际上是目的是提示python讲解器,说被其修饰的变量是全局变量。这样...
-
python(array用法 python如何对两个数组做差处理)
python如何对两个数组做差处理?Python中的列表中的元素肯定不能真接相加,减。t最佳的位置的是将列表装换成Python中的...
-
python多行注释符号怎么表示
python多行注释符号怎么表示这篇文章主要介绍“python多行...
-
python支持的操作系统是什么
python支持的操作系统是什么这篇文章主要介绍“python支持...
-
python如何判断列表为空
python如何判断列表为空这篇文章主要介绍“python如何判断...