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读取html中指定元素生成excle文件示例
Apr 03 Python
Python的__builtin__模块中的一些要点知识
May 02 Python
Python实现的端口扫描功能示例
Apr 08 Python
Python批处理删除和重命名文件夹的实例
Jul 11 Python
转换科学计数法的数值字符串为decimal类型的方法
Jul 16 Python
对python周期性定时器的示例详解
Feb 19 Python
Python实现去除图片中指定颜色的像素功能示例
Apr 13 Python
使用Python实现正态分布、正态分布采样
Nov 20 Python
Python Print实现在输出中插入变量的例子
Dec 25 Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
Sep 04 Python
Python中os模块的简单使用及重命名操作
Apr 17 Python
python tkinter Entry控件的焦点移动操作
May 22 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递归实现无限分类 格式化数组的详解
2013/06/08 PHP
php中请求url的五种方法总结
2017/07/13 PHP
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
2006/12/22 Javascript
将string解析为json的几种方式小结
2010/11/11 Javascript
jQuery版Tab标签切换
2011/03/16 Javascript
javascritp添加url参数将参数加入到url中
2014/09/25 Javascript
node.js中的fs.fchmodSync方法使用说明
2014/12/16 Javascript
jquery制作漂亮的弹出层提示消息特效
2014/12/23 Javascript
JavaScript页面模板库handlebars的简单用法
2015/03/02 Javascript
JS+CSS模拟可以无刷新显示内容的留言板实例
2015/03/03 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
JavaScript中的parse()方法使用简介
2015/06/12 Javascript
js实现简洁大方的二级下拉菜单效果代码
2015/09/01 Javascript
BootStrap创建响应式导航条实例代码
2016/05/31 Javascript
JavaScript中BOM对象原理与用法分析
2019/07/09 Javascript
go和python调用其它程序并得到程序输出
2014/02/10 Python
python实现的重启关机程序实例
2014/08/21 Python
python中pycurl库的用法实例
2014/09/30 Python
用Python的SimPy库简化复杂的编程模型的介绍
2015/04/13 Python
python数据结构链表之单向链表(实例讲解)
2017/07/25 Python
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
使用Python实现图像标记点的坐标输出功能
2019/08/14 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
Python3 assert断言实现原理解析
2020/03/02 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
2020/06/02 Python
Python爬虫JSON及JSONPath运行原理详解
2020/06/04 Python
一文带你了解Python 四种常见基础爬虫方法介绍
2020/12/04 Python
一些PHP的面试题
2015/05/06 面试题
高中运动会广播稿
2014/01/21 职场文书
业务部主管岗位职责
2014/01/29 职场文书
《猴子种树》教学反思
2014/02/14 职场文书
C++程序员求职信范文
2014/04/14 职场文书
小学六一儿童节活动方案
2014/08/27 职场文书
高质量“欢迎词”
2019/04/03 职场文书
详解CSS开发过程中的20个快速提升技巧
2021/05/21 HTML / CSS