本文介绍了Python的异常处理,模块,包,标准库。是Python系列文章的第7篇。
【Python 基础】一文补齐Python基础知识
【趣学Python:B站四大恶人】一文掌握列表、元组、字典、集合
【Python进阶】一文掌握Python函数用法
【Python进阶】Python面向对象之类与对象详解
【Python进阶】Python面向对象之装饰器与封装
【Python进阶】Python面向对象之继承和多态详解
【Python进阶】Python异常处理和模块详解
【Python进阶】Python文件(I/O)操作详解
py
文件就是一个模块,要想创建模块,实际上就是创建一个python文件。注意:模块名要符号标识符的规范。1.在一个模块中引入外部模块:
① import 模块名
(模块名,就是python文件的名字,注意不要文件名后缀 .py
)
② import 模块名 as 模块别名
2.在每一个模块内部都有一个__name__属性,通过这个属性可以获取到模块的名字
'''
test_model.py
'''
print('我是test_module模块')
print(__name__)
import test_module as test
print(test.__name__)
print(__name__)
模块导入:
可以只引入模块中的部分内容:
语法:from 模块名 import 变量,变量....
from m import Person
from m import test
from m import Person,test
也可以为引入的变量使用别名
语法:from 模块名 import 变量 as 别名
from m import test2 as new_test2
更一般的:
# 全部导入
from m import *
import xxx
import xxx as yyy
from xxx import yyy , zzz , fff
from xxx import *
from xxx import yyy as zz
包也是一个模块;
当我们模块中代码过多时,或者一个模块需要被分解为多个模块时,这时就需要使用到包;
普通的模块就是一个 py
文件,而包是一个文件夹;
包中必须要 __init__.py
文件,这个文件中可以包含有包中的主要内容;
__pycache__
是模块的缓存文件;
py代码在执行前,需要被解析器先转换为机器码,然后再执行;所以我们在使用模块(包)时,也需要将模块的代码先转换为机器码然后再交由计算机执行;而为了提高程序运行的性能,python会在编译过一次以后,将代码保存到一个缓存文件中,这样在下次加载这个模块(包)时,就可以不再重新编译而是直接加载缓存中编译好的代码。
官方文档
在开发过程中,如果要实现某些基础的功能,可以先去Python标准库中查找相关的模块,如果有满足业务需求的,就不用自己再写了,可以直接使用Python标准库中提供的模块,提高开发效率。
sys.argv
print(sys.argv)
sys.modules
pprint.pprint(sys.modules)
sys.path
pprint.pprint(sys.path)
sys.platform
print(sys.platform)
sys.exit()
sys.exit('程序出现异常,结束!')
import os
os.environ
pprint.pprint(os.environ['path'])
os.system()
os.system('dir')
os.system('notepad')
程序在运行过程当中,不可避免的会出现一些错误,比如:使用了没有赋值过的变量、使用了不存在的索引、除0…这些错误在程序中,我们称其为异常。程序运行过程中,一旦出现异常将会导致程序立即终止,异常以后的代码全部都不会执行!
程序运行时出现异常,目的并不是让我们的程序直接终止!
Python是希望在出现异常时,我们可以编写代码来对异常进行处理!
try
语句:
try:
代码块(可能出现错误的语句)
except 异常类型 as 异常名:
代码块(出现错误以后的处理方式)
except 异常类型 as 异常名:
代码块(出现错误以后的处理方式)
except 异常类型 as 异常名:
代码块(出现错误以后的处理方式)
else:
代码块(没出错时要执行的语句)
finally:
代码块(该代码块总会执行)
try
是必须要有的,else
语句可有可无,except
和 finally
至少有一个。
可以将可能出错的代码放入到 try
语句,这样如果代码没有错误,则会正常执行; 如果出现错误,则会执行 expect
子句中的代码,这样我们就可以通过代码来处理异常,避免因为一个异常导致整个程序的终止;
实例:
print('开始执行try语句···')
try:
# try中放置的是有可能出现错误的代码
print(10/0)
except:
# except中放置的是出错以后的处理防暑
print('哈哈哈,出错了~~~')
else:
print('程序正常执行没有错误')
print('执行结束!')
输出:
开始执行try语句···
哈哈哈,出错了~~~
执行结束!
当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会再继续传播;如果函数中没有对异常进行处理,则异常会继续向函数调用处传播。如果函数调用处处理了异常,则不再传播;如果没有处理,则继续向调用处传播。直到传递到全局作用域(主模块)如果依然没有处理,则程序终止,并且显示异常信息。
def fn():
print('Hello fn')
print(a)
print(10/0)
def fn2():
print('Hello fn2')
fn()
def fn3():
print('Hello fn3')
fn2()
fn3()
当程序运行过程中出现异常以后,所有的异常信息会被保存一个专门的异常对象中,而异常传播时,实际上就是异常对象抛给了调用处,比如 :
ZeroDivisionError
类的对象专门用来表示除0的异常;NameError
类的对象专门用来处理变量错误的异常;在Python为我们提供了多个异常对象,官方文档。
使用builtins查询内置函数和变量的名称:
>>> import builtins
>>> dir(builtins)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning',
'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError',
'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning',
'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False',
'FileExistsError', 'FileNotFoundError', 'FloatingPointError',
'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError',
'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError',
'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError',
'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented',
'NotImplementedError', 'OSError', 'OverflowError',
'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError',
'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning',
'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError',
'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError',
'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError',
'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning',
'ValueError', 'Warning', 'ZeroDivisionError', '_', '__build_class__',
'__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs',
'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable',
'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits',
'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit',
'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr',
'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass',
'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview',
'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property',
'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars',
'zip']
异常的捕获分为两种,捕获指定的异常和捕获所有异常。
as xx
此时 xx
就是异常对象;print('异常出现前')
l = []
try:
# print(c)
# l[10]
# 1 + 'hello'
print(10/0)
except NameError:
# 如果except后不跟任何的内容,则此时它会捕获到所有的异常
# 如果在except后跟着一个异常的类型,那么此时它只会捕获该类型的异常
print('出现 NameError 异常')
except ZeroDivisionError:
print('出现 ZeroDivisionError 异常')
except IndexError:
print('出现 IndexError 异常')
# Exception 是所有异常类的父类,所以如果except后跟的是Exception,他也会捕获到所有的异常
# 可以在异常类后边跟着一个 as xx 此时xx就是异常对象
except Exception as e :
print('未知异常',e,type(e))
finally :
print('无论是否出现异常,该子句都会执行')
print('异常出现后')
可以使用 raise
语句来抛出异常,raise
语句后需要跟一个异常类或异常的实例。
也可以自定义异常类,只需要创建一个类继承 Exception
即可;
class MyError(Exception):
pass
def add(a,b):
# 如果a和b中有负数,就向调用处抛出异常
if a < 0 or b < 0:
# raise用于向外部抛出异常,后边可以跟一个异常类,或异常类的实例
# raise Exception
# 抛出异常的目的,告诉调用者这里调用时出现问题,希望你自己处理一下
# raise Exception('两个参数中不能有负数!')
raise MyError('自定义的异常')
# 也可以通过if else来代替异常的处理
# return None
r = a + b
return r
print(add(-123,456))
参考:https://edu.aliyun.com/course/1782