包(二)
__init__.py文件
是常规包内必须存在的文件,__init__.py会在导入包时被自动调用作用:
1、编写此包的内容
2、再内部添加包的文档字符串
3、在__init__.py 文件内可以加载此包所依赖的其他模块
示例:
#__init__.py
'''
这是一个用来测试的包
此包有两个函数:
以下略
'''
def fx():
print('我是mypack内的fx()函数')
name1='我是mypack内的name1变量'
import math #导入其他的包
print('mypack包被加载',math.factorial(5))
包的__all__列表
作用:用来记录此包中有哪些子包或模块需要导入
当from 包 import *语句导入式,只查找__all__中的模块或子包
说明:
__all__列表只在 from 包 import *语句式起作用
说明:当子包或子包内的模块被导入时,上一层的包也会被先导入
例如:import mypack.games.contra
#实质会先到入mypack,再导入games,再导入comtra
包的相对导入:
包的相对导入是指包内的模块的相互导入语法:
from 相对路径包或模块 import 属性或模块名
或
from 相对路径包或模块 import *
相对路径:
在 from xxx import 语句中,xxx部分可以使用相对路径. 代表当前路径
.. 代表上一级目录
... 代表上二级目录
.... 以此类推
注:1.相对路径导入时不能超出包的外部
2.相对导入要避免循环导入
异常(基础) exception
什么是错误:
错误是指由于逻辑或语法等导致一个程序无法执行的问题错误的特点:
有些错误无法预知什么是异常:
异常是程序出错时标识的一种状态当异常发生时,程序不会再向下执行,而转去调用此函数的地方待处理此错误并恢复为正常状态
异常的作用:
通知上层调用者有错误产生需要处理用作信号
try 语句的两种语法:
try - except 语句try - fanally 语句
try - except语句的语法
try:可能触发异常的语句
except 错误类型1 [as 变量1]:
异常处理语句1
except 错误类型2 [as 变量2]:
异常处理语句2
except 错误类型3 [as 变量3]:
异常处理语句3
……
except:
异常处理语句other
else:
未发生异常的语句
finally:
最终语句
作用:
尝试捕获异常,将程序转为正常状态并继续执行
示例:
# 此示例示意 try-except语句来捕获异常
def div_apple(n):
'''此示例用分苹果来示意捕获异常'''
print('%d个苹果你想分给几个人?' % n)
s = input('请输入人数:')
cnt = int(s) # <==此处可能会引起valueError类型的错误
result = n / cnt
print('每个人分了', result, '个苹果')
if __name__ == '__main__':
try:
div_apple(10)
except ValueError:
print('发生了值错误,已转为正常状态')
except ZeroDivisionError:
print('发生了被零除错误,苹果收回办公室')
print('程序正常退出')
# 此示例示意 try-except语句来捕获异常
def div_apple(n):
'''此示例用分苹果来示意捕获异常'''
print('%d个苹果你想分给几个人?' % n)
s = input('请输入人数:')
cnt = int(s) # <==此处可能会引起valueError类型的错误
result = n / cnt
print('每个人分了', result, '个苹果')
if __name__ == '__main__':
try:
div_apple(10)
except(ValueError, ZeroDivisionError):
print('发生错误,苹果被收回')
print('程序正常退出')
# 此示例示意 try-except语句来捕获异常
def div_apple(n):
'''此示例用分苹果来示意捕获异常'''
print('%d个苹果你想分给几个人?' % n)
s = input('请输入人数:')
cnt = int(s) # <==此处可能会引起valueError类型的错误
result = n / cnt
print('每个人分了', result, '个苹果')
if __name__ == '__main__':
try:
div_apple(10)
except ValueError:
print('发生错误,苹果被收回')
except:
print('发生了除了值错误以外的错误,在这里处理')
print('程序正常退出')
# try-except_as
# 此示例示意 try-except语句来捕获异常
def div_apple(n):
'''此示例用分苹果来示意捕获异常'''
print('%d个苹果你想分给几个人?' % n)
s = input('请输入人数:')
cnt = int(s) # <==此处可能会引起valueError类型的错误
result = n / cnt
print('每个人分了', result, '个苹果')
if __name__ == '__main__':
try:
div_apple(10)
except ValueError as e: #===> as e绑定的错误对象的变量
print('发生错误,苹果被收回')
print('错误的值:',e)
except:
print('发生了除了值错误以外的错误,在这里处理')
print('程序正常退出')
#try_except_else
# 此示例示意 try-except语句来捕获异常
def div_apple(n):
'''此示例用分苹果来示意捕获异常'''
print('%d个苹果你想分给几个人?' % n)
s = input('请输入人数:')
cnt = int(s) # <==此处可能会引起valueError类型的错误
result = n / cnt
print('每个人分了', result, '个苹果')
if __name__ == '__main__':
try:
div_apple(10)
except ValueError:
print('发生错误,苹果被收回')
else:
# 此处语句只用在没有发生异常时才会执行
print('没有发生错误,苹果分完')
print('程序正常退出')
#try_except_finally
# 此示例示意 try-except语句来捕获异常
def div_apple(n):
'''此示例用分苹果来示意捕获异常'''
print('%d个苹果你想分给几个人?' % n)
s = input('请输入人数:')
cnt = int(s) # <==此处可能会引起valueError类型的错误
result = n / cnt
print('每个人分了', result, '个苹果')
if __name__ == '__main__':
try:
div_apple(10)
except ValueError:
print('发生错误,苹果被收回')
else:
# 此处语句只用在没有发生异常时才会执行
print('没有发生错误,苹果分完')
finally:
# 此子句内的语句无论是否发生异常都一定会执行
print('我一定会执行')
print('程序正常退出')
练习:
写一个函数get_scort()来获取用户输入的学生成绩(0-100的整数),如果输入错误,则此函数返回0,如果用户输入的数是0-100之间的数,返回这个数
'''
写一个函数get_scort()来获取用户输入的学生成绩(0-100的整数),如果输入错误,则此函数返回0,如果用户输入的数是0-100之间的数,返回这个数
def get_scort():
pass
scort = get_scort()
print('学生成绩是', scort)
'''
def get_scort():
n = input('输入学生成绩:')
try:
sco = int(n)
except:
return 0
if 0 <= sco <= 100:
return sco
else:
return 0
scort = get_scort()
print('学生成绩是', scort)
try - except 语句语法说明:
1、as 子句是用于绑定错误对象的变量,可以省略2、except 子句可以有一个或多个,但至少有一个
3、else子句最多有一个,也可以省略
4、finally子句最多只能有一个,也可以省略
try_finally 语句
语法:try:
可能触发异常的语句
finally:
最终语句
语法说明:
finally子句不可以省略
一定不存在except子句
作用:通常用try_finally语句来做触发异常时必须要处理的事件,无论异常是否发生,finally子句都会被执行
注:
try_finally语句不会改变程序的(正常/异常)状态
示例:
# 此示例示意try_finally语句的用法
# 厨房做饭为例
# 打开天然气后必须要关闭天然气
def fry_egg():
print('打开天然气')
try:
try:
count = int(input('请输入鸡蛋个数:'))
print('完成煎鸡蛋!共煎了%d个鸡蛋' % count)
finally:
print('关闭天然气')
except ValueError:
print('程序转为正常状态')
fry_egg() # 开始煎鸡蛋
print('程序正常退出')
Python全部的异常类型
错误类型 | 说明 |
---|---|
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
ValueError | 传入无效的参数 |
AssertionError | 断言语句失败 |
StopIteration | 迭代器没有更多的值 |
IndexError | 序列中没有此索引(index) |
IndentationError | 缩进错误 |
IOError | 输入/输出操作失败 |
ImportError | 导入模块/对象失败 |
NameError | 未声明/初始化对象 (没有属性) |
AttributeError | 对象没有这个属性 |
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
Exception | 常规错误的基类 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点计算错误 |
OverflowError | 数值运算超出最大限制 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
OSError | 操作系统错误 |
WindowsError | 系统调用失败 |
LookupError | 无效数据查询的基类 |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError Python | 语法错误 |
TabError | Tab 和空格混用 |
SystemError | 一般的解释器系统错误 |
TypeError | 对类型无效的操作 |
UnicodeError | Unicode 相关的错误 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
以下为警告类型 | |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |
raise语句:
作用:
触发一个错误,让程序进入异常状态语法:
raise 异常类型
或
raise 异常对象
示例:
# 以下示意其他语言中不用异常处理机制,用返回值方式返回错误问题
'''
def make_except(n):
# 假设n必须是0~100之间的数
print('begin...')
if n > 100: # 传过来的参数无效,怎么告诉调用者呢?
return -1
if n < 0:
return -2
print('end')
r = make_except(1000)
if r < 0:
print('发生错误')
else:
print('程序正常完成')
'''
# 此示例示意raise语句的语法
def make_except(n):
# 假设n必须是0~100之间的数
print('begin...')
if n > 100: # 传过来的参数无效,怎么告诉调用者呢?
raise ValueError
if n < 0:
raise ValueError('参数小于0错误:%d'%n)
print('end')
value = int(input('请输入一个数:'))
try:
r = make_except(value)
except ValueError as e:
print('make_raise 抛出了错误,此异常状态已处理')
print('错误的值是:',e)
print('发生错误')
print('程序正常完成')
assert语句(断言语句)
语法:assert 真值表达式,错误数据(通常是字符串)
作用:
当真值表达式为False时,用错误数据创建一个AssertionError类型的错误,并进入异常状态
等同于:
if 真值表达式 == False:
raise AssertionError(错误数据)
示例:
def ger_age():
a = input('请输入年龄:')
a = int(a)
assert a < 140, '年龄不可能大于140!!!'
assert a >= 0, '年龄不可能出现负数!!!'
return a
try:
age = ger_age()
except AssertionError as e:
print('发生断言错误!错误对象是:', e)
age = 0 # 做相应处理
print('您输入的年龄是:%d' % age)
为什么要用异常处理机制:
在程序调用层数较深时,向主函数传递错误信息需要层层的return返回比较麻烦,所以用异常处理机制练习:
1、一个球从100米高度落下,每次落地后反弹高度为原高度的一半,在落下,写程序1)算出皮球从第十次落地后反弹的高度是多少2)球共经过多少米路径
2、打印九九乘法表:
3、分解质因数:
输入一个正整数,分解质因数:
如输入90,则打印90=2*3*3*5