很多文章介绍如何写好Python。今天反倒是说说写代码的几个坏习惯。有些习惯会使错误隐藏起来,难以追踪。当然有些也没有错,但个人觉得不够优雅。注:示例代码是在Python3.6的环境下编写的1使用列表作为函数的默认参数见如下示例deffunc(a,b=[]):b.append(a)print(f'a:{a}')print(f'b:{b}')func(1)func(2)通常我们期望的结果应该是这样的a:1b:[1]a:2b:[2]但是当我们执行代码,只有结果a:1b:[1]a:2b:[1,2]与预期不一致。为什么?因为Python列表是一个可变对象,函数参数是传引用的,所以第二次调用func方法时,b中已经有了元素1,调用之后b终于有了两个元素1和2.例子中的func方法比较简单。当你发现问题的时候,只要看一眼就能找到根本原因。但是,如果是在比较复杂的方法中,你可能粗心忽略了这一点,就会遇到一些莫名其妙的问题。所以,当我们想为函数设置默认参数时,不要使用可变对象。上面的代码改成这样就可以了deffunc(a,b=None):ifbisNone:b=[]b.append(a)print(f'a:{a}')print(f'b:{b}')执行后预期结果为a:1b:[1]a:2b:[2]2文件操作很多初学Python的小伙伴在做文件操作时很容易写出类似的代码file=open('file_name')try:forlineinfile:print(line)finally:file.close()这个没问题,但是我们不需要手动维护文件资源,把关闭之类的操作交给上下文管理器就行了。withopen('file_name')asfile:forlineinfile:print(line)看起来不是很清爽。3捕获所有异常try:pass#做一些操作exceptExceptionase:print(f'Exception{e}')就像上面的,有时候为了快速完成功能,很容易捕获到Exception异常。这可能会捕获KeyboardInterrupt(CTRL+C)或断言错误(AsstionError)等异常。捕获未定义的异常有时会导致我们的程序出现莫名其妙的问题,我们应该避免这样做。准确的做法是根据上下文捕获ValueError、AttributeError、TypeError等具体的异常,然后做相应的错误处理,比如打印日志。4忽略Python的for...else语法开发我们很容易遇到类似的需求,在一个列表中,判断某个特定元素是否存在。例如下面的代码是判断列表中是否有奇数numbers=[1,2,3,4,5]is_odd_exist=Falseforninnumbers:ifn%2==1:is_odd_exist=Truebreakifis_odd_exist:print('Oddexist')else:print('Oddnotexist')在这里,我们使用标志is_odd_exist,默认为False。当找到奇数时,将其设置为True并跳出循环。这样写是没有问题的,但是我们可以换个方式numbers=[1,2,3,4,5]forninnumbers:ifn%2==1:print('Oddexist')breakelse:print('Oddnotexist')首先介绍一下使用Python的for...else语法,当for循环正常结束时(即没有通过break结束),就会执行else中的语句。在这里,我们使用了与C、PHP等其他语言不同的方法,来完成同样的功能,而且看起来代码也简单了很多。5使用key遍历字典。初学Python的小伙伴很容易写出这样的代码)同样,这很好,但看起来不直观。遍历字典的时候其实可以直接取出key-value信息,像这样member={'name':'xiaoming','age':18,'mobile':'18312341234'}forkey,valinmember.items():print(f'{key}:{val}')看起来更清晰。上面提到的一些观点各有成见,我们不要求大家接受,选择合理使用即可。
