学习笔记☞python 基础☞包(二) &异常☞python3

包(二)

__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语法错误
TabErrorTab 和空格混用
SystemError一般的解释器系统错误
TypeError对类型无效的操作
UnicodeErrorUnicode 相关的错误
UnicodeDecodeErrorUnicode 解码时的错误
UnicodeEncodeErrorUnicode 编码时错误
UnicodeTranslateErrorUnicode 转换时错误
以下为警告类型 
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
    

        
        
        
        
        
        
        
        
        
        
        
        
        
       
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值