乐趣区

关于python:Python错误异常和模块

本篇次要讲两方面,谬误和异样以及模块。在编程时遇见错误信息在劫难逃,Python 中会也有很多种错误信息,常见的两种就是语法错误和逻辑谬误,逻辑谬误的品种有很多,占据了异样中大部分地位,上面就开始介绍一下这两个概念的相干常识。

谬误和异样

语法错误

语法错误英文示意为 SyntaxError,前面会跟着一些对于谬误的解释信息,不便你查找语句中的 bug,如下:

In [5]: print('naitangmao)
  File "<ipython-input-5-d5b793a8884b>", line 1
    print('naitangmao)
                      ^
SyntaxError: EOL while scanning string literal

语法错误顾名思义就是你的代码语句写错了,比方下面这个语句的谬误就是少了一个引号。产生谬误后,解释器会给出文件的名字和谬误行号,以及在谬误行上面有一个 ”^”,这个提醒你代码出错的地位,个别会位于箭头后面,这些提醒会便于编写者尽快找出谬误。

异样

有的时候一行代码在语法上可能没有什么谬误,然而执行的时候解释器也会报红,这种错误信息能够称为异样,和语法错误相比,异样的品种更多也更加常见。

举两个简略的例子:

In [6]: print(1/0)
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-6-2fc232d1511a> in <module>
----> 1 print(1/0)

ZeroDivisionError: division by zero

都晓得 0 是不能作为分母呈现的,所以 Python 就会给出一个 ZeroDivisionError,并揭示你这是一个零除谬误。

In [9]: 1+'1'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-9-d3bd1e37a107> in <module>
----> 1 1+'1'

TypeError: unsupported operand type(s) for +: 'int' and 'str'

整形与字符串之间不存在加法运算,解释器剖析出后会给出一个 TypeError,这是一个类型谬误,并且在前面给出谬误的解释。

异样解决

对于 Python 解释器而言,如果一段程序中某个局部呈现了异样,那么其前面的代码将不会被运行,但 Python 中有办法能够对异样进行解决,让异样不报红,进而帮忙整个程序实现运行,这种行为称作捕捉异样,以 try … except 语句组合实现。

In [11]: a = 1;b = '2'
In [12]: try:
    ...:     print(a+b)
    ...: except TypeError:
    ...:     print('类型谬误!')
类型谬误!

捕捉异样实现的过程:

  • 1. 执行 try 和 except 关键字之间的局部
  • 2. 如果没有异样产生,except 子句在 try 语句执行结束后就被忽略了。
  • 3. 如果在 try 子句执行过程中产生了异样,那么该子句其余的局部就会被疏忽。如果异样匹配于 except 关键字前面指定的异样类型,就执行对应的 except 子句。而后继续执行 try/except 语句之后的代码。
  • 4. 如果产生了一个异样,在 except 子句中没有与之匹配的分支,它就会传递到上一级 try 语句中。如果最终仍找不到对应的解决语句,它就成为一个未解决异样,终止程序运行,显示提示信息。

为了防止第 4 条状况产生,在 except 语句中能够应用所有异样的父类 Exception,这样就囊括了所有异样可能产生的情况:

In [15]: try:
    ...:     print(a+b)
    ...: except Exception as e:
    ...:     print(e)
unsupported operand type(s) for +: 'int' and 'str'

抛出异样

利用 raise 语句能够被动抛出一个异样,但抛出的异样必须是要继承于 Exception 的异样类或者异样示例。

In [16]: raise NameError('naitangmao')
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-16-b751158801b2> in <module>
----> 1 raise NameError('naitangmao')

NameError: naitangmao

除此下面介绍之外,用户还能够依据本人的需要本人定义异样,不再过多介绍,倡议把握的局部是每种异样呈现的起因以及异样解决的办法。

模块

第二局部就是模块,咱们有时可能会在不同文件之间利用同一个函数,笨一点的做法就是 copy 来 copy 去,Python 提供了一个机制能够在将一个文件中的内容导入另一个文件中应用,这样的文件就能够称为模块,须要留神的是并不是任何一个文件都能够当做模块,而必须是蕴含 Python 定义和申明的文件。

举一个简略的小例子帮忙了解下面这段话,首先能够创立一个 odd_num.py 文件,而后这个文件中只有一个函数,性能是实现过滤掉一个范畴内的偶数:

In [18]: def odd(n):
    ...:     result = []
    ...:     for i in range(n):
    ...:         if i % 2 != 0:
    ...:             result.append(i)
    ...:     return result

而后咱们能够在另一个文件中导入这个模块,如果咱们想应用这个函数的话,就能够通过 模块名. 函数名 的办法调用该函数,如下:

In [20]: import odd_num
In [21]: odd_num.odd(20)
Out[21]: [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

如果你只想用一个模块中的某个子模块,那么在导入时就能够指明须要导入的局部,这样子模块就能够独自应用,不用在以 模块名. 函数名 的模式:

In [22]: from odd_num import odd
In [23]: odd(20)
Out[23]: [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

如果你还想偷懒的话,能够利用 ’*’ 的模式导入, 这种写法是导入一个模块中的所有子模块:

In [24]: from odd_num import *

这种办法往往是不被举荐的,因为会让代码的可读性变差。

如果你有很多自定义的模块,为了更加标准、易找,那么你就能够将这些模块存入一个 ” 包 ” 中,须要留神的是,这个包中比方要有一个名为__init__.py 的文件,这个文件能够为空但必须存在,而后导入包中模块的形式就是 包名. 模块名

Python 自身也有自带的模块库,有一部分模块是内置于解释器之中,而后用户能够间接拜访这类模块的接口,很大水平上进步了效率,比方 time、sys 等等。如果你对于一个模块比拟生疏,你能够利用 dir()函数搜寻某个模块的定义,返回的后果是一个列表,其中包含模块内的办法、可供调用的接口等等。

In [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 的官网文档,外面会有更加具体的介绍。

退出移动版