Python新手入门最容易犯的错误总结


Posted in Python onApril 24, 2017

前言

Python 以其简单易懂的语法格式与其它语言形成鲜明对比,初学者遇到最多的问题就是不按照 Python 的规则来写,即便是有编程经验的程序员,也容易按照固有的思维和语法格式来写 Python 代码,之前小编给大家分享过了一篇《Python新手们容易犯的几个错误总结》,但总结的不够全面,最近看到有一个外国小伙总结了一些大家常犯的错误,16 Common Python Runtime Errors Beginners Find,索性我把他翻译过来并在原来的基础补充了我的一些理解,希望可以让你避开这些坑。

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 相关文章推荐
一个简单的python程序实例(通讯录)
Nov 29 Python
Python实现将sqlite数据库导出转成Excel(xls)表的方法
Jul 17 Python
Python实现的本地文件搜索功能示例【测试可用】
May 30 Python
利用Python如何制作好玩的GIF动图详解
Jul 11 Python
python实现换位加密算法的示例
Oct 14 Python
python七夕浪漫表白源码
Apr 05 Python
np.random.seed() 的使用详解
Jan 14 Python
Python中文分词库jieba,pkusegwg性能准确度比较
Feb 11 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
Jan 09 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
Mar 03 Python
FP-growth算法发现频繁项集——发现频繁项集
Jun 24 Python
Python连接Postgres/Mysql/Mongo数据库基本操作大全
Jun 29 Python
Python正则抓取新闻标题和链接的方法示例
Apr 24 #Python
Python的爬虫框架scrapy用21行代码写一个爬虫
Apr 24 #Python
fastcgi文件读取漏洞之python扫描脚本
Apr 23 #Python
批量获取及验证HTTP代理的Python脚本
Apr 23 #Python
深入理解python中的select模块
Apr 23 #Python
Python3如何解决字符编码问题详解
Apr 23 #Python
Python制作刷网页流量工具
Apr 23 #Python
You might like
PHP4在Windows2000下的安装
2006/10/09 PHP
PHP隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
2011/11/02 PHP
php 不使用js实现页面跳转
2014/02/11 PHP
ThinkPHP中关联查询实例
2014/12/02 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
2016/03/23 PHP
阿里云的WindowsServer2016上部署php+apache
2018/07/17 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
js 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
2010/04/14 Javascript
KnockoutJS 3.X API 第四章之数据控制流component绑定
2016/10/10 Javascript
小程序开发实战:实现九宫格界面的导航的代码实现
2017/01/19 Javascript
js 开发之autocomplete="off"在chrom中失效的解决办法
2017/09/28 Javascript
JavaScript如何获取到导航条中HTTP信息
2017/10/10 Javascript
Vue项目使用CDN优化首屏加载问题
2018/04/01 Javascript
Vue resource三种请求格式和万能测试地址
2018/09/26 Javascript
js实现百度登录窗口拖拽效果
2020/03/19 Javascript
跟老齐学Python之折腾一下目录
2014/10/24 Python
python定时器(Timer)用法简单实例
2015/06/04 Python
用Python实现随机森林算法的示例
2017/08/24 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
python查看模块安装位置的方法
2018/10/16 Python
python之消除前缀重命名的方法
2018/10/21 Python
Django项目中使用JWT的实现代码
2019/11/04 Python
Python动态导入模块和反射机制详解
2020/02/18 Python
opencv-python的RGB与BGR互转方式
2020/06/02 Python
CSS3的 fit-content实现水平居中
2017/09/07 HTML / CSS
世界最大的海报和艺术印刷商店:AllPosters.com
2017/02/01 全球购物
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
菲律宾领先的在线时尚商店:Zalora菲律宾
2018/02/08 全球购物
澳大利亚Mocha官方网站:包、钱包、珠宝和配饰
2019/07/18 全球购物
企业宣传工作方案
2014/06/02 职场文书
社团活动总结书
2014/06/27 职场文书
镇副书记专题民主生活会对照检查材料思想汇报
2014/10/02 职场文书
毕业论文指导教师评语
2014/12/30 职场文书
2015年化工厂工作总结
2015/05/04 职场文书
如何让2019年上半年的工作总结更出色!
2019/07/01 职场文书