600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 新手学Python时常见的语法错误和异常(Python基础)

新手学Python时常见的语法错误和异常(Python基础)

时间:2020-01-12 05:45:31

相关推荐

新手学Python时常见的语法错误和异常(Python基础)

大家好,今天我们简单介绍下在学习Python时常见的一些错误和异常。

记得刚接触Python的时候,一条简单的语句在执行的时候却总能遇到报错。然后各种艰难的复查发现可能是循环语句缺少冒号啊、用了中文的标点符号啊、引号/括号等少了一个或者无法匹配啊、函数方法或变量名拼写错误啊等等。

在Python编程中有两种可区分的报错:语法错误异常

语法错误又称解析错误,是我们在刚接触学习Python 时最容易遇到的错误,区区别于异常而言,语法错误非程序执行时的逻辑错误;

即使语句或表达式在语法上是正确的,但在尝试执行时,它仍可能会引发错误,而这个在执行时检测到的逻辑错误被称为异常。

1.语法错误

语句本身的语法存在问题,常见的有循环语句后面少了冒号、用了中文的标点符号、字符串赋值时引号少一个等等,属于非逻辑错误。

In[1]:foriinrange(10)...:print(i)File"<ipython-input-1-696a89bc759f>",line1foriinrange(10)^SyntaxError:invalidsyntax

在这个例子中,for循环遗漏了一个冒号。解析器会输出出现语法错误的那一行,并显示一个“箭头”,指向这行里面检测到的第一个错误。错误是由箭头指示的位置上面的 token 引起的(或者至少是在这里被检测出的):在示例中,在print()这个函数中检测到了错误,因为在它前面少了个冒号 (':') 。文件名和行号也会被输出,以便输入来自脚本文件时你能知道去哪检查。

In[2]:foriinrange(10):...:print(i)File"<ipython-input-7-6f0e28cee45c>",line1foriinrange(10):^SyntaxError:invalidcharacterinidentifier

在这个例子中,for循环后面我们错误使用了中文字符冒号(),在错误类型后面的提示invalid character in identifier也说的很明确,就是标识符中用了无效的字符。

In[3]:s='aFile"<ipython-input-2-2674c3b7142b>",line1s='a^SyntaxError:EOLwhilescanningstringliteral

在这个例子中,赋值字符串少了一个引号。在错误类型后面其实有提示EOL while scanning string literal,直译就是字符串扫描的时候EOL了吧。

2.异常

异常是在程序执行过程中发生的逻辑错误,大多数异常并不会被程序处理,大多数异常并不会被程序处理,此时会显示如下所示的错误信息:

In[4]:1/0Traceback(mostrecentcalllast):File"<ipython-input-8-9e1622b385b6>",line1,in<module>1/0ZeroDivisionError:divisionbyzeroIn[5]:1+2*varTraceback(mostrecentcalllast):File"<ipython-input-9-fa55356f14f5>",line1,in<module>1+2*varNameError:name'var'isnotdefinedIn[6]:1+'2'Traceback(mostrecentcalllast):File"<ipython-input-10-7e3aa5c4fbef>",line1,in<module>1+'2'TypeError:unsupportedoperandtype(s)for+:'int'and'str'

错误信息的最后一行告诉我们程序遇到了什么类型的错误。异常有不同的类型,而其类型名称将会作为错误信息的一部分中打印出来:上述示例中的异常类型依次是:ZeroDivisionErrorNameErrorTypeError。作为异常类型打印的字符串是发生的内置异常的名称,这一行的剩下的部分根据异常类型及其原因提供详细信息。

错误消息的开头部分以堆栈回溯的形式显示发生异常的上下文:通常它会包含列出源代码行的堆栈回溯;但是,它将不会显示从标准输入读取的行。

异常说明

1/0为例,我们知道0是无法作为除数的,这里就存在逻辑错误。在错误信息中,我们发现这是一个ZeroDivisionError异常类型,其发生异常的是代码第1行1/0位置,具体解释是division by zero(除数为0)。

2.1.常见的异常

NameError:当某个局部或全局变量在使用前未被定义时

In[7]:1+2*varTraceback(mostrecentcalllast):File"<ipython-input-9-fa55356f14f5>",line1,in<module>1+2*varNameError:name'var'isnotdefined

变量var在参与运算之前没有被定义,因此出现该异常提示。我们只需要在此代码前对var进行定义,方可正常执行后续代码。另外,我们在初学的时候,容易出现对变量名拼写错误,导致自以为已经定义但是依旧出现这个报错的情况:比如定义var=2,实际使用的时候是1+war的情况。

TypeError:当一个操作或函数被应用于类型不适当的对象时

In[6]:1+'2'Traceback(mostrecentcalllast):File"<ipython-input-10-7e3aa5c4fbef>",line1,in<module>1+'2'TypeError:unsupportedoperandtype(s)for+:'int'and'str'

对于运算符+的操作,不支持intstr,这个时候检查出现的变量类型即可完成自查。

IndentationError:当出现缩进不当时

In[7]:foriinrange(10):...:print(i)File"<ipython-input-6-0c8aafc23d7e>",line2print(i)^IndentationError:expectedanindentedblock

在for循环后面的语句,应为缩进模块,但是这里并没有进行合理缩进,故而出现报错。

AttributeError:当试图使用一个对象没有的属性或方法时

In[8]:dic={'key1':'var1',...:'key2':'var2'}In[9]:dic.append('a')Traceback(mostrecentcalllast):File"<ipython-input-11-611a9bdb0662>",line1,in<module>dic.append('a')AttributeError:'dict'objecthasnoattribute'append'

比如我们定义一个字典dic,但是对它使用了列表的方法append,这个时候就会出现报错提示dict没有方法append。出现类型错误的时候,查看对象是否有想使用方法,或者查看一下你的方法拼写是否正确。

IndexError:当序列下标索引超出范围时

In[10]:lis=[1,2,3,4,5]In[11]:lis[6]Traceback(mostrecentcalllast):File"<ipython-input-13-8eaf39d436a7>",line1,in<module>lis[6]IndexError:listindexoutofrange

对于列表lis一共5个元素,若我们试图访问第7个元素也就是lis[6]时会出现 列表超出了范围的提示。通常我们在编写循环,访问序列元素的时候容易出现此类越界问题。

KeyError:当试图访问字典中不存在的键时

In[12]:dic={'key1':'var1',...:'key2':'var2'}In[13]:dic['key1']Out[13]:'var1'In[14]:dic['key']Traceback(mostrecentcalllast):File"<ipython-input-15-0b90da6672e1>",line1,in<module>dic['key']KeyError:'key'

在字典dic中,我们并没有key这个键,若我们试图访问不存在的键就会提示KeyError: 'key',此时我们复查key是否存在即可。

ModuleNotFoundErrorImportError的子类,当一个模块无法被定位时将由import引发

In[15]:importdocxtplTraceback(mostrecentcalllast):File"<ipython-input-22-bfd93c61f778>",line1,in<module>importdocxtplModuleNotFoundError:Nomodulenamed'docxtpl'

我们引入模块不存在的时候,会出现此报错,这个时候可以检查模块的名称拼写是否正确或者进行模块的安装(pip install docxtpl)。

ImportError:当我们试图引入不存在的库时,并且当from ... import中的 "from list" 存在无法找到的名称时

In[16]:fromosimportxTraceback(mostrecentcalllast):File"<ipython-input-20-a0857005ff12>",line1,in<module>fromosimportxImportError:cannotimportname'x'from'os'(C:\Users\Gdc\anaconda3\lib\os.py)

比如随便写的这个从os中import x,实际上不存在。

ValueError:当操作或函数接收到具有正确类型但值不适合的参数

In[17]:num=int(input('请输入一个整数:'))请输入一个整数:aTraceback(mostrecentcalllast):File"<ipython-input-23-9c8264b2c0f9>",line1,in<module>num=int(input('请输入一个整数:'))ValueError:invalidliteralforint()withbase10:'a'

比如当我们使用int对输入对象进行转化为整数时,输入的对象是字符串时,这是一个不合适的参数。

KeyboardInterrupt:当用户按下中断键 (通常为 Control-C 或 Delete) 时

In[18]:num=int(input('请输入一个整数:'))请输入一个整数:Traceback (most recent call last):File"<ipython-input-24-9c8264b2c0f9>",line1,in<module>num=int(input('请输入一个整数:'))File"C:\Users\Gdc\anaconda3\lib\site-packages\ipykernel\kernelbase.py",line860,inraw_inputreturnself._input_request(str(prompt),File"C:\Users\Gdc\anaconda3\lib\site-packages\ipykernel\kernelbase.py",line904,in_input_requestraiseKeyboardInterrupt("Interruptedbyuser")fromNoneKeyboardInterrupt:Interruptedbyuser

当程序执行过程中,我们使用Control+CDelete时,就会出现中断程序的提示,我常常在程序执行过程中想复制部分打印信息的时候错使用Control+C想着复制却使得程序中断的情况。

3.遇到错误和异常时怎么办?

其实,大部分的报错信息都有很明显的指引,已经具体到某行具体什么类型的错误以及对错误比较清晰的解释。

遇到报错不要慌,对于新手来说,常见的就是先检查基础语法对不对标识符是不是用了中文变量名的拼写是不是错了变量名是不是没定义就调用了缩进是不是没整对函数方法是不是用错了想引入的库是不是没有安装等等。

再就是复制报错信息,然后丢到搜索引擎里查!!基本上绝大多数报错都有人遇到过且在网上能找到相关的解决方案!!

4.标准异常查询

下面有我近几年的收集和整理,整体是围绕着【软件测试】来进行整理的,主体内容包含:python自动化测试专属视频、Python自动化详细资料、全套面试题等知识内容。

对于软件测试的的朋友来说应该是最全面最完整的面试备战仓库,为了更好地整理每个模块,我也参考了很多网上的优质博文和项目,力求不漏掉每一个知识点,很多朋友靠着这些内容进行复习,拿到了BATJ等大厂的offer,这个仓库也已经帮助了很多的软件测试的学习者,希望也能帮助到你

关注微信公众号【程序员二黑】即可领取Python自动化测试超硬核资源啦

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。