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 10 Python
Linux下将Python的Django项目部署到Apache服务器
Dec 24 Python
使用python实现接口的方法
Jul 07 Python
Python实现抓取网页生成Excel文件的方法示例
Aug 05 Python
python实现学生管理系统
Jan 11 Python
Python运行不显示DOS窗口的解决方法
Oct 22 Python
python多维数组分位数的求取方式
Mar 03 Python
Python3创建Django项目的几种方法(3种)
Jun 03 Python
用Python制作mini翻译器的实现示例
Aug 17 Python
详解Python爬虫爬取博客园问题列表所有的问题
Jan 18 Python
Python趣味爬虫之用Python实现智慧校园一键评教
May 28 Python
python调用ffmpeg命令行工具便捷操作视频示例实现过程
Nov 01 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
PHP5.0对象模型探索之抽象方法和抽象类
2006/09/05 PHP
Zend的AutoLoad机制介绍
2012/09/27 PHP
jQuery 1.0.4 - New Wave Javascript(js源文件)
2007/01/15 Javascript
JavaScript 题型问答有答案参考
2010/02/17 Javascript
Bootstrap编写导航栏和登陆框
2016/05/30 Javascript
three.js绘制地球、飞机与轨迹的效果示例
2017/02/28 Javascript
Ionic2开发环境搭建教程
2020/08/20 Javascript
Nodejs之http的表单提交
2017/07/07 NodeJs
基于VuePress 轻量级静态网站生成器的实现方法
2018/04/17 Javascript
微信小程序实现刷脸登录
2018/05/25 Javascript
JS实现监控微信小程序的原理
2018/06/15 Javascript
微信小程序中进行地图导航功能的实现方法
2018/06/29 Javascript
vue刷新页面时去闪烁提升用户体验效果的实现方法
2018/12/10 Javascript
微信小程序获取用户openid的实现
2018/12/24 Javascript
通过扫小程序码实现网站登陆功能
2019/08/22 Javascript
JS自定义对象创建与简单使用方法示例
2020/01/15 Javascript
js与jquery获取input输入框中的值实例讲解
2020/02/27 jQuery
Vue 3.0 全家桶抢先体验
2020/04/28 Javascript
JavaScript实现烟花绽放动画效果
2020/08/04 Javascript
python去除所有html标签的方法
2015/05/05 Python
Python守护进程和脚本单例运行详解
2017/01/06 Python
python 执行shell命令并将结果保存的实例
2018/05/11 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
2019/10/17 Python
python实现将json多行数据传入到mysql中使用
2019/12/31 Python
纯CSS3打造动感漂亮时尚的扇形菜单
2014/03/18 HTML / CSS
html5基础标签(html5视频标签 html5新标签用法)
2013/12/30 HTML / CSS
Jogun Shop中文官网:韩国知名时尚男装网站
2016/10/12 全球购物
澳大利亚排名第一的儿童在线玩具商店:Toy Galaxy
2018/10/06 全球购物
纯净、自信、100%的羊绒服装:360Cashmere
2021/02/20 全球购物
介绍一下Linux内核的排队自旋锁
2014/08/27 面试题
JDBC操作数据库的基本流程是什么
2014/10/28 面试题
捐书活动总结
2014/05/04 职场文书
英文演讲稿开场白
2014/08/25 职场文书
小学语文教学反思范文
2016/03/03 职场文书
HTML基础详解(下)
2021/10/16 HTML / CSS
利用Python实现Picgo图床工具
2021/11/23 Python