Python是一门简单易学的编程语言,语法简洁明了,拥有丰富而强大的类库。与大多数其他编程语言中使用的大括号不同,它使用缩进来定义语句块。在平时的工作中,Python开发者很容易犯一些小错误,而这些错误又很容易避免。大平台老师总结了Python开发者最常犯的10个错误。一起来看看吧。我想知道你有没有被枪杀.(1)滥用表达式作为函数参数默认值Python允许开发者为函数参数指定一个默认值。虽然这是该语言的一个特性,但当参数可变时,它很容易导致混淆。例如下面的函数定义:在上面的代码中,一旦重复调用foo()函数(没有指定bar参数),它总是返回'bar',因为没有指定参数,那么foo()将是每次调用[]时给出。我们来看看这样做的结果:解决方法:(2)错误地使用类变量先看下面的例子:有道理:再做一遍:刚改了A.x,为什么C.x也改了。在Python中,类变量都在内部作为字典处理,并遵循方法解析顺序(MRO)。在上面的代码中,由于类C中没有找到属性x,所以它会寻找它的基类(上面的例子中只有A,虽然Python支持多重继承)。也就是说,C本身没有x属性,独立于A。因此,引用C.x实际上就是引用A.x。(3)为异常指定不正确的参数假设代码中有如下代码:这里的问题是except语句不需要这种方式来指定异常列表。但是在Python2.x中,除了Exception,e通常用于绑定exception中的第二个参数,以便进一步检查。因此,在上面的代码中,IndexError异常并没有被except语句捕获,异常***被绑定到一个名为IndexError的参数上。在异常语句中捕获多个异常的正确方法是将第一个参数指定为包含所有捕获的异常的元组。同时使用as关键字保证绝对的可移植性,Python2和Python3都支持这种语法。(4)对Python规则范围的误解Python的范围分析是根据LEGB规则进行的,分别是Local、Enclosing、Global、Built-in。其实这种解析方式也有一些玄机,看下面这个例子:很多人会很奇怪,当他们在工作函数体中添加参数语句时,会在之前的工作代码中报UnboundLocalError错误(点这里详见详细说明)。这是开发人员在使用列表时容易犯的错误。考虑以下示例:为什么foo1工作时foo2失败?答案与前面的示例相同,但有一些细微差别。foo1未分配给lst,但分配了foo2。lst+=[5]实际上是lst=lst+[5],试图分配给lst(因此,假设Python在本地范围内)。然而,我们希望分配给lst的值是基于lst本身的,尚未确定。(5)修改遍历列表下面的代码显然是错误的:遍历时删除列表是一??个很低级的错误。稍微有点经验的人都不会犯。修改上面的代码并正确执行:(6)如何在闭包中绑定变量看下面这个例子:你期望的结果是:其实:是不是很惊喜!这主要是因为Python的Latebinding行为,当在闭包中使用变量时,内部函数正在调用它。解决方法:(7)创建循环模块依赖假设有两个文件,a.py和b.py,然后分别导入,如下:Ina.py:Inb.py:首先,让我们尝试导入a。py:效果很好,也许你会感到惊讶。毕竟我们这里确实有一个循环导入,应该不会有点问题吧?循环导入的存在并不是Python本身的问题,如果导入了一个模块,Python不会尝试重新导入它。据此,每个模块在尝试访问函数或变量时都可能在运行时遇到一些问题。Whathappenwhenwetrytoimportb.py(a.pywasnotimportedbefore):出错了,这里的问题是我们在导入b.py的过程中也尝试导入了a.py,所以需要调用f(),并尝试访问b.x.但是b.x没有定义。可以这样解决,只需要将b.py导入的g()函数修改成a.py即可:不管什么时候导入,都可以正常运行:(8)与Python标准库模块名冲突Python有一个非常丰富的模块库,并且支持“开箱即用”。因此,如果不刻意避免,很容易发生命名冲突。比如你的代码中可能有一个email.py模块,由于同名,很可能会和Python自带的标准库模块冲突。(9)Python2.x与Python3.x的区别,未按规定处理。看foo.py:在Python2中可以跑的很好:但是在Python3中:解决办法:在Py3k中跑结果:在Python招聘指南中,有很多关于Python2和Python3的思考和讨论需要付出移植代码时要注意。你可以去看看。(10)滥用__del__方法例如,有一个名为mod.py的文件:接下来,你在another_mod.py文件中进行如下操作:你会得到一个AttributeError异常。当解释器关闭时,模块的全局变量都设置为None。因此,在上面的示例中,调用__del__时foo已全部设置为None。一个很好的解决方法是改用atexit.register()。顺便说一句,当程序完成执行时,您注册的处理程序将停止工作,直到解释器关闭。修复上述问题的代码:此实现提供了一种干净可靠的方法来调用任何清理函数,但要服从正常的程序终止。总结Python是一种强大而灵活的编程语言,它自带许多机制和模式来极大地提高生产力。就像任何语言或软件工具一样,人们对其功能的了解或欣赏是有限的,其中一些弊大于利,有时还会带来一些陷阱。
