Python初学者常见错误详解


Posted in Python onJuly 02, 2019

前言

Python 以其简单易懂的语法格式与其它语言形成鲜明对比,初学者遇到最多的问题就是不按照 Python 的规则来写,即便是有编程经验的程序员,也容易按照固有的思维和语法格式来写 Python 代码,有一个外国小伙总结了一些大家常犯的错误,,我把他翻译过来并在原来的基础补充了我的一些理解,希望可以让你避开这些坑。

0、忘记写冒号

在 if、elif、else、for、while、class、def 语句后面忘记添加 “:”

if spam == 42
print('Hello!')

导致:SyntaxError: invalid syntax

1、误用 “=” 做等值比较

“=” 是赋值操作,而判断两个值是否相等是 “==”

if spam = 42:
print('Hello!')

导致:SyntaxError: invalid syntax

2、使用错误的缩进

Python用缩进区分代码块,常见的错误用法:

print('Hello!')
print('Howdy!')

导致:IndentationError: unexpected indent。同一个代码块中的每行代码都必须保持一致的缩进量

if spam == 42:
print('Hello!')
print('Howdy!')

导致:IndentationError: unindent does not match any outer indentation level。代码块结束之后缩进恢复到原来的位置

if spam == 42:
print('Hello!')

导致:IndentationError: expected an indented block,“:” 后面要使用缩进

3、变量没有定义

if spam == 42:
print('Hello!')

导致:NameError: name 'spam' is not defined

4、获取列表元素索引位置忘记调用 len 方法

通过索引位置获取元素的时候,忘记使用 len 函数获取列表的长度。

spam = ['cat', 'dog', 'mouse']
for i in range(spam):
print(spam[i])

导致:TypeError: range() integer end argument expected, got list. 正确的做法是:

spam = ['cat', 'dog', 'mouse']
for i in range(len(spam)):
print(spam[i])

当然,更 Pythonic 的写法是用 enumerate

spam = ['cat', 'dog', 'mouse']
for i, item in enumerate(spam):
print(i, item)

5、修改字符串

字符串一个序列对象,支持用索引获取元素,但它和列表对象不同,字符串是不可变对象,不支持修改。

spam = 'I have a pet cat.'
spam[13] = 'r'
print(spam)

导致:TypeError: 'str' object does not support item assignment 正确地做法应该是:

spam = 'I have a pet cat.'
spam = spam[:13] + 'r' + spam[14:]
print(spam)

6、字符串与非字符串连接

num_eggs = 12
print('I have ' + num_eggs + ' eggs.')

导致:TypeError: cannot concatenate 'str' and 'int' objects

字符串与非字符串连接时,必须把非字符串对象强制转换为字符串类型

num_eggs = 12
print('I have ' + str(num_eggs) + ' eggs.')

或者使用字符串的格式化形式

num_eggs = 12
print('I have %s eggs.' % (num_eggs))

7、使用错误的索引位置

spam = ['cat', 'dog', 'mouse']
print(spam[3])

导致:IndexError: list index out of range

列表对象的索引是从0开始的,第3个元素应该是使用 spam[2] 访问

8、字典中使用不存在的键

spam = {'cat': 'Zophie', 'dog': 'Basil', 'mouse': 'Whiskers'}
print('The name of my pet zebra is ' + spam['zebra'])

在字典对象中访问 key 可以使用 [],但是如果该 key 不存在,就会导致:KeyError: 'zebra'

正确的方式应该使用 get 方法

spam = {'cat': 'Zophie', 'dog': 'Basil', 'mouse': 'Whiskers'}
print('The name of my pet zebra is ' + spam.get('zebra'))

key 不存在时,get 默认返回 None

9、用关键字做变量名

class = 'algebra'

导致:SyntaxError: invalid syntax

在 Python 中不允许使用关键字作为变量名。Python3 一共有33个关键字。

>>> import keyword
>>> print(keyword.kwlist)
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

10、函数中局部变量赋值前被使用

someVar = 42
def myFunction():
print(someVar)
someVar = 100
myFunction()

导致:UnboundLocalError: local variable 'someVar' referenced before assignment

当函数中有一个与全局作用域中同名的变量时,它会按照 LEGB 的顺序查找该变量,如果在函数内部的局部作用域中也定义了一个同名的变量,那么就不再到外部作用域查找了。因此,在 myFunction 函数中 someVar 被定义了,所以 print(someVar) 就不再外面查找了,但是 print 的时候该变量还没赋值,所以出现了 UnboundLocalError

11、使用自增 “++” 自减 “--”

spam = 0
spam++

哈哈,Python 中没有自增自减操作符,如果你是从C、Java转过来的话,你可要注意了。你可以使用 “+=” 来替代 “++”

spam = 0
spam += 1

12、错误地调用类中的方法

class Foo:
def method1():
print('m1')
def method2(self):
print("m2")
a = Foo()
a.method1()

导致:TypeError: method1() takes 0 positional arguments but 1 was given

method1 是 Foo 类的一个成员方法,该方法不接受任何参数,调用 a.method1() 相当于调用 Foo.method1(a),但 method1 不接受任何参数,所以报错了。正确的调用方式应该是 Foo.method1()。

需要注意的是,以上代码都是基于 Python3 的,在 Python2 中即使是同样的代码出现的错误也不尽一样,尤其是最后一个例子。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中动态创建类实例的方法
Mar 24 Python
python实现自动发送报警监控邮件
Jun 21 Python
python调用摄像头显示图像的实例
Aug 03 Python
如何使用Python标准库进行性能测试
Jun 25 Python
Python Selenium 之数据驱动测试的实现
Aug 01 Python
python 进程间数据共享multiProcess.Manger实现解析
Sep 23 Python
python获取array中指定元素的示例
Nov 26 Python
使用pandas的box_plot去除异常值
Dec 10 Python
使用tensorflow实现矩阵分解方式
Feb 07 Python
Pytorch十九种损失函数的使用详解
Apr 29 Python
Python collections.defaultdict模块用法详解
Jun 18 Python
Python用any()函数检查字符串中的字母以及如何使用all()函数
Apr 14 Python
Python使用pyserial进行串口通信的实例
Jul 02 #Python
Python函数中参数是传递值还是引用详解
Jul 02 #Python
Python 运行.py文件和交互式运行代码的区别详解
Jul 02 #Python
python 函数中的内置函数及用法详解
Jul 02 #Python
使用python serial 获取所有的串口名称的实例
Jul 02 #Python
Python中那些 Pythonic的写法详解
Jul 02 #Python
python 中如何获取列表的索引
Jul 02 #Python
You might like
php中防止伪造跨站请求的小招式
2011/09/02 PHP
php stripslashes和addslashes的区别
2014/02/03 PHP
PHP实现的分页类定义与用法示例
2017/07/05 PHP
Mootools 1.2教程 滚动条(Slider)
2009/09/15 Javascript
在jQuery1.5中使用deferred对象 着放大镜看Promise
2011/03/12 Javascript
js自定义鼠标右键的实现原理及源码
2014/06/23 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
jQuery progressbar通过Ajax请求实现后台进度实时功能
2016/10/11 Javascript
AngularJS封装指令方法详解
2016/12/12 Javascript
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
2016/12/14 Javascript
BootStrap栅格系统、表单样式与按钮样式源码解析
2017/01/20 Javascript
BootStrap 表单控件之单选按钮水平排列
2017/05/23 Javascript
详解angularjs中如何实现控制器和指令之间交互
2017/05/31 Javascript
基于Node.js实现压缩和解压缩的方法
2018/02/13 Javascript
浅析vue-router原理
2018/10/19 Javascript
微信小程序实现预览图片功能
2020/10/22 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
2019/05/29 Javascript
Vue中对iframe实现keep alive无刷新的方法
2019/07/23 Javascript
详解Webpack4多页应用打包方案
2020/07/16 Javascript
js+css实现扇形导航效果
2020/08/18 Javascript
简单实现python爬虫功能
2015/12/31 Python
Centos Python2 升级到Python3的简单实现
2016/06/21 Python
python中kmeans聚类实现代码
2018/02/23 Python
django认证系统 Authentication使用详解
2019/07/22 Python
python创建子类的方法分析
2019/11/28 Python
python读取多层嵌套文件夹中的文件实例
2020/02/27 Python
Python爬虫之Selenium鼠标事件的实现
2020/12/04 Python
Python爬虫入门教程02之笔趣阁小说爬取
2021/01/24 Python
前端实现打印图像功能
2019/08/27 HTML / CSS
如何用JQuery进行表单验证
2013/05/29 面试题
国际贸易个人求职信范文
2014/01/04 职场文书
幼儿园六一儿童节主持节目串词
2014/03/21 职场文书
《长城和运河》教学反思
2014/04/14 职场文书
优秀教师先进个人事迹材料
2014/08/31 职场文书
毕业论文指导老师意见
2015/06/04 职场文书
2016年班主任培训心得体会
2016/01/07 职场文书