0

0

新手刚开始学习Python时容易出现的错误

伊谢尔伦

伊谢尔伦

发布时间:2017-01-16 16:23:15

|

1600人浏览过

|

来源于php中文网

原创

新手刚开始学习python语言时,会出现这样那样的错误,我们这里做了一些总结,希望给刚开始学习python的朋友们一点点注意。

语法错误

语法错误可能是你还在学习Python时最为常见的错误

>>> while True print "hi~"
  File "", line 1    
  while True print "hi~"
               ^
SyntaxError: invalid syntax

有一个箭头指向最早发现错误的地方,这里指向了print,因为Ture后面少了冒号

忘记在 if , elif , else , for , while , class ,def 声明末尾添加 :(导致 “SyntaxError :invalid syntax”) 该错误将发生在类似如下代码中:

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

使用 = 而不是 ==(导致“SyntaxError: invalid syntax”) = 是赋值操作符而 == 是等于比较操作。该错误发生在如下代码中: 

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

错误的使用缩进量。(导致“IndentationError:unexpected indent”、“IndentationError:unindent does not match any outer indetation level”以及“IndentationError:expected an indented block”) 记住缩进增加只用在以:结束的语句之后,而之后必须恢复到之前的缩进格式。该错误发生在如下代码中:

立即学习Python免费学习笔记(深入)”;

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

或者: 

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

或者:

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

在 for 循环语句中忘记调用 len() (导致“TypeError: 'list' object cannot be interpreted as an integer”) 通常你想要通过索引来迭代一个list或者string的元素,这需要调用 range() 函数。要记得返回len 值而不是返回这个列表。 该错误发生在如下代码中: 

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

尝试修改string的值(导致“TypeError: 'str' object does not support item assignment”) string是一种不可变的数据类型,该错误发生在如下代码中: 

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

而你实际想要这样做: 

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

尝试连接非字符串值与字符串(导致 “TypeError: Can't convert 'int' object to str implicitly”) 该错误发生在如下代码中: 

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

而你实际想要这样做: 

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

或者:

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

在字符串首尾忘记加引号(导致“SyntaxError: EOL while scanning string literal”) 该错误发生在如下代码中: 

print(Hello!') 或者: print('Hello!)

或者: 

myName = 'Al' print('My name is ' + myName + . How are you?')

变量或者函数名拼写错误(导致“NameError: name 'fooba' is not defined”) 该错误发生在如下代码中: 

foobar = 'Al' print('My name is ' + fooba)

 或者:

spam = ruond(4.2)

或者: 

spam = Round(4.2)

方法名拼写错误(导致 “AttributeError: 'str' object has no attribute 'lowerr'”) 该错误发生在如下代码中: 

spam = 'THIS IS IN LOWERCASE.' spam = spam.lowerr()

异常

即使语句和表达式语法正确,在执行时也可能出现错误,这种错误称为异常(Exceptions)。 异常并不都是致命的,你马上会学到如何处理他们。 许多异常程序都不处理,而是返回一个错误消息,例如:

>>> 10 * (1/0)
Traceback (most recent call last):
  File "", line 1, in ZeroDivisionError: integer division or modulo by zero
>>> 4 + git*3
Traceback (most recent call last):
  File "", line 1, in NameError: name 'git' is not defined
>>> '2' + 1
Traceback (most recent call last):
  File "", line 1, in TypeError: cannot concatenate 'str' and 'int' objects
>>>

错误消息的最后一行就是异常消息,冒号前是异常的类型。上面的 ZeroDivisionError, NameError, TypeError, 都是系统内置的异常。

处理异常

可以自己编写程序来处理异常,比如下面这个例子,它会返回异常,直到用户输入有效数据为止。

OmniAudio
OmniAudio

OmniAudio 是一款通过 AI 支持将网页、Word 文档、Gmail 内容、文本片段、视频音频文件都转换为音频播客,并生成可在常见 Podcast ap

下载
>>> while True:
...     try:
...         x = int(raw_input("Please enter a number: "))
...         break...     except ValueError:
...         print "Oops! That was no valid number. Try again..."... 
Please enter a number: x
Oops! That was no valid number. Try again...
Please enter a number: 32x
Oops! That was no valid number. Try again...
Please enter a number: 038

使用 try 和 except ExceptionName 来处理异常

如果没有异常产生,except 段会被跳过

如果某处有异常产生,后面的语句会被跳过,如果产生的异常类型和except后的类型一致,except后的语句会被执行

如果发生异常,但和except后的类型不一致,异常会传递到try语句外面,如果没有相应处理,那么就会打印出像上 一个例子那样的信息。

一个try语句可能有多个except与之对应,分别处理不同类型的异常,最多只有一种处理会被执行。一个except可以包含多 个类型名,比如:

... except (RuntimeError, TypeError, NameError):
...     pass

注意上面的三种异常类型,必须用括号把它们括起来,因为在现代python中, except ValueError, e 的意思是 except ValueError as e:(后面会讲这是什么意思)

最后一个except一般不指定名字,用于处理其余情况

import systry:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except IOError as e:    
       print "I/O error({0}): {1}".format(e.errno, e.strerror)
except ValueError:    
       print "Could not convert data to an integer."
except:    
       print "Unexpected error:", sys.exc_info()[0]    
       raise

try..except 语句还可以选择使用else,例如

for arg in sys.argv[1:]:    
     try:
        f = open(arg, 'r')    
   except IOError:        
           print 'cannot open', arg    
   else:        
           print arg, 'has', len(f.readlines()), 'lines'
        f.close()

需要注意,一旦使用else,每个except后都要有else,这种方式用于需要指定某一异常不出现时执行什么操作。

except子句可以在异常名后指定参数,这些参数被存储在异常实例产生时的 instance.arg

>>> try:
...     raise Exception('spam', 'eggs')
... except Exception as inst:
...     print type(inst)
...     print inst.args
...     print inst
...     x, y = inst.args
...     print 'x =', x
...     print 'y =', y
... 

('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs

异常处理不仅仅处理直接在try中出现的异常,还可以处理在try中调用函数的异常

>>> def mdiv():
...     x = 1/0
... 
>>> try:
...     mdiv()
... except ZeroDivisionError as detail:
...      print 'Handling run-time error:', detail
... 
Handling run-time error: integer division or modulo by zero

用户自定义异常

程序可以通过创建一个异常类来命令一个新的异常,这个异常类需要通过直接或者间接的方式由 Exception 类派生。

>>> class MyError(Exception):
...     def __init__(self, value):
...          self.value = value
...     def __str__(self):
...          return repr(self.value)
... 
>>> try:
...     raise MyError(1+5)
... except MyError as e:
...     print 'My exception occurred, value:', e.value
... 
My exception occurred, value: 6
>>> raise MyError('oops!')
Traceback (most recent call last):
  File "", line 1, in 
__main__.MyError: 'oops!'

在上面的例子中,__ init __ (), 覆盖了默认的 init 函数,新的行为创建了 value 属性, 替换了原有的 创建args属性的行为。

其它类可以做的事情,通过定义Exception类都可以完成。但是Exception类总是被设计地非常简单, 它们提供一些属性,这样错误处理时就可能方便地提取出这些属性。 当设计一个模块处理多种异常时,常常先定义一个基本的类,其它类在此基础上处理一些特殊情况。

class Error(Exception):    
    """Base class for exceptions in this module."""
    pass
    
class InputError(Error):    
    """Exception raised for errors in the input.    
    Attributes:        
       expr -- input expression in which the error occurred        
       msg  -- explanation of the error    """

    def __init__(self, expr, msg):        
       self.expr = expr        
       self.msg = msg
class TransitionError(Error):    
    """Raised when an operation attempts a state transition that's not    
       allowed.    
       
       Attributes:        
          prev -- state at beginning of transition        
          next -- attempted new state        
          msg  -- explanation of why the specific transition is not allowed    
       """

    def __init__(self, prev, next, msg):        
        self.prev = prev        
        self.next = next
        self.msg = msg

在定义局部变量前在函数中使用局部变量

(此时有与局部变量同名的全局变量存在)(导致“UnboundLocalError: local variable 'foobar' referenced before assignment”) 在函数中使用局部变来那个而同时又存在同名全局变量时是很复杂的,使用规则是:如果在函数中定义了任何东西,如果它只是在函数中使用那它就是局部的,反之就是全局变量。 这意味着你不能在定义它之前把它当全局变量在函数中使用。 该错误发生在如下代码中: 

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

尝试使用 range()创建整数列表

(导致“TypeError: 'range' object does not support item assignment”) 有时你想要得到一个有序的整数列表,所以 range() 看上去是生成此列表的不错方式。然而,你需要记住 range() 返回的是 “range object”,而不是实际的 list 值。 该错误发生在如下代码中: 

spam = range(10) 
spam[4] = -1

也许这才是你想做: 

spam = list(range(10)) 
spam[4] = -1

(注意:在 Python 2 中 spam = range(10) 是能行的,因为在 Python 2 中 range() 返回的是list值,但是在 Python 3 中就会产生以上错误)

错在 ++ 或者 -- 自增自减操作符。

(导致“SyntaxError: invalid syntax”) 如果你习惯于例如 C++ , Java , PHP 等其他的语言,也许你会想要尝试使用 ++ 或者 -- 自增自减一个变量。在Python中是没有这样的操作符的。 该错误发生在如下代码中: 

spam = 1
spam++

也许这才是你想做的: 

spam = 1 
spam += 1

忘记为方法的第一个参数添加self参数

(导致“TypeError: myMethod() takes no arguments (1 given)”) 该错误发生在如下代码中: 

class Foo(): def myMethod(): 
       print('Hello!') a = Foo() a.myMethod()

相关文章

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

79

2026.01.09

c++框架学习教程汇总
c++框架学习教程汇总

本专题整合了c++框架学习教程汇总,阅读专题下面的文章了解更多详细内容。

46

2026.01.09

学python好用的网站推荐
学python好用的网站推荐

本专题整合了python学习教程汇总,阅读专题下面的文章了解更多详细内容。

121

2026.01.09

学python网站汇总
学python网站汇总

本专题整合了学python网站汇总,阅读专题下面的文章了解更多详细内容。

12

2026.01.09

python学习网站
python学习网站

本专题整合了python学习相关推荐汇总,阅读专题下面的文章了解更多详细内容。

15

2026.01.09

俄罗斯手机浏览器地址汇总
俄罗斯手机浏览器地址汇总

汇总俄罗斯Yandex手机浏览器官方网址入口,涵盖国际版与俄语版,适配移动端访问,一键直达搜索、地图、新闻等核心服务。

71

2026.01.09

漫蛙稳定版地址大全
漫蛙稳定版地址大全

漫蛙稳定版地址大全汇总最新可用入口,包含漫蛙manwa漫画防走失官网链接,确保用户随时畅读海量正版漫画资源,建议收藏备用,避免因域名变动无法访问。

370

2026.01.09

php学习网站大全
php学习网站大全

精选多个优质PHP入门学习网站,涵盖教程、实战与文档,适合零基础到进阶开发者,助你高效掌握PHP编程。

45

2026.01.09

php网站搭建教程大全
php网站搭建教程大全

本合集专为零基础用户打造,涵盖PHP网站搭建全流程,从环境配置到实战开发,免费、易懂、系统化,助你快速入门建站!

12

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
云知梦PHP基础项目实战视频教程
云知梦PHP基础项目实战视频教程

共19课时 | 3.7万人学习

thinkphp3.2实战开发企业网站
thinkphp3.2实战开发企业网站

共52课时 | 13.9万人学习

前端零基础到vue实战课程
前端零基础到vue实战课程

共214课时 | 22.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号