系列第四篇主要讲两个方面,错误与异常与模块。编程时难免会遇到错误信息。Python中的错误信息也有很多种。两种常见的是语法错误和异常。这两个是完全不同的概念。下面就来介绍一下这两个概念的相关知识。错误和异常语法错误在英文中表示为SyntaxError,后面是对错误的一些解释,方便大家查找语句中的错误,如下:In[5]:print('naitangmao)File"",line1print('naitangmao)^SyntaxError:EOLwhilescanningstringliteralSyntaxerror顾名思义就是你的代码语句写错了。比如上面语句的错误就是少了一个引号。发生错误后,解释器会给出文件名和错误行号,以及错误行下方的“^”,提示你代码哪里出错了,一??般在箭头前面,这些提示将有助于作者尽快发现错误。出了些问题。Exception有时一行代码可能没有语法错误,但是执行时解释器会报红。这种错误信息可以称为异常。与语法错误相比,异常的种类更多,也更常见。举两个简单的例子:[6]中:print(1/0)---------------------------------------------------------------------ZeroDivisionErrorTraceback(最近调用last)in---->1print(1/0)ZeroDivisionError:divisionbyzero知道0不能作为分母出现,所以Python会给出一个ZeroDivisionError,并提醒你这是除以零错误。在[9]中:1+'1'------------------------------------------------------------------TypeErrorTraceback(mostrecentcalllast)in---->11+'1'TypeError:unsupportedoperandtype(s)for+:'int'and'str'整数和字符串之间没有加法运算,解释器分析会报一个TypeError最后是类型错误,后面会给出错误的解释。异常处理对于Python解释器来说,如果程序的某个部分发生异常,后面的代码将不会运行,但是Python中有一些方法可以处理异常,使得异常不报红,反过来helps整个程序运行完毕。这种行为称为捕获异常,它是通过结合try...except语句来实现的。In[11]:a=1;b='2'In[12]:try:...:print(a+b)...:exceptTypeError:...:print('Typeerror!')...:类型错误!捕获异常实现的过程:1.执行try和except关键字之间的部分2.如果没有异常发生,执行完try语句后忽略except子句。3.如果try子句执行过程中发生异常,则忽略该子句的其余部分。如果异常与except关键字后指定的异常类型匹配,则执行相应的except子句。然后继续执行try/except语句之后的代码。4.如果发生异常,except子句中没有匹配的分支,则传递给上层的try语句。如果最终还是没有找到对应的处理语句,则成为未处理异常,终止程序,并显示提示信息。为了避免第四种情况,except语句中可以使用所有异常的父类Exception,它涵盖了所有可能的异常:In[15]:try:...:print(a+b)。..:exceptExceptionase:...:print(e)...:unsupportedoperandtype(s)for+:'int'and'str'throwsanexceptionraise语句可以主动抛出异常,但是抛出的异常必须是继承自Exception的异常类或异常实例。在[16]中:raiseNameError('naitangmao')------------------------------------------------------------------------NameErrorTraceback(mostrecentcalllast)in---->1raiseNameError('naitangmao')NameError:naitangmao除了上面的介绍,用户也可以根据自己的需要定义异常,不再多介绍,推荐掌握第一部分是每次异常的原因和异常处理的方法。模块的第二部分是模块。有时我们可能会在不同的文件之间使用同一个函数。笨办法就是抄来抄去。Python提供了一种机制,可用于将一个文件的内容导入另一个文件,这样的文件可以称为模块。需要注意的是,并不是任何文件都可以视为模块,而必须是包含Python定义和声明的文件。举一个简单的例子来帮助理解上面这段话。首先,你可以创建一个odd_num.py文件,然后这个文件里面只有一个函数。函数是过滤掉一个范围内的偶数:In[18]:defodd(n):...:result=[]...:foriinrange(n):...:ifi%2!=0:...:result.append(i)...:returnresult...:然后我们可以在另一个文件中导入这个模块。如果我们要使用这个函数,我们可以通过模块名的方法来调用这个函数。函数名,如下:In[20]:importodd_numIn[21]:odd_num.odd(20)Out[21]:[1,3,5,7,9,11,13,15,17,19]如果你只想在一个模块中使用一个子模块,那么在导入的时候可以指定需要导入的部分,这样子模块就可以单独使用,而不是模块名的形式。函数名:In[22]:fromodd_numimportoddIn[23]:odd(20)Out[23]:[1,3,5,7,9,11,13,15,17,19]如果你还想为了偷懒,可以用'*'的形式导入,也就是导入一个模块中的所有子模块:In[24]:fromodd_numimport*这种方法往往不被推荐,因为它会降低代码的可读性。如果你有很多自定义模块,为了更加规范和方便查找,那么你可以将这些模块存储在一个“包”中。需要注意的是,比如这个包文件中必须有一个名为__init__.py的文件,这个文件可以为空但必须存在,然后在包中引入模块的方式就是包名.模块名。Python本身也有自己的模块库,在解释器中内置了一些模块,然后用户可以直接访问这些模块的接口,大大提高了效率,比如time、sys等等。如果你对一个模块比较陌生,可以使用dir()函数来查找模块的定义,返回的结果是一个列表,包括模块中的方法,可以调用的接口等等在。在[24]:dir(time)Out[24]:['_STRUCT_TM_ITEMS','__doc__','__loader__','__name__','__package__','__spec__','altzone','asctime','ctime','daylight','get_clock_info','gmtime','localtime','mktime','monotonic','monotonic_ns','perf_counter','perf_counter_ns','process_time','process_time_ns','sleep','strftime','strptime','struct_time','thread_time','thread_time_ns','time','time_ns','timezone','tzname']综上,关于错误、异常和模块的一些常识综上,如果你对更高层次的用法感兴趣,可以找找Python的官方文档,里面会有比较详细的介绍。