(十四)python 包的相对导入,异常,try,raise语句,assert语句

目录

__init__.py内的__all__列表

包的相对导入

包的加载路径:

异常(基础)exception

    try语句

    try-except 语句语法

    try-finally语句

    raise 语句

    assert 语句(断言语句)

异常小结:


__init__.py内的__all__列表

    作用:
        用来记录此包中有哪些包或模块需要在from import *语句导入时被导入
    说明:
        __all__列表只在from xxx import * 语句中起作用

包的相对导入

    是指包内模块的相互导入

    语法:
        from 相对路径包或模块import * 属性或模块
        或
        from 相对路径包或模块import * 
    说明:
        包的相对导入不能用于import xxx语句中
    相对路径:
        . 代表当前路径
        .. 代表上一级目录
        ... 代表上二级目录
        .... 以此类推
        注:相对导入时不能超出包的外部


包的加载路径:

    同模块的加载路径搜索
    1.搜索当前路径
    2.搜索sys.path给定的路径


异常(基础)exception

    什么是错误
        错误是指由于逻辑或语法等导致一个程序无法正常执行的问题
    特点:
        有些错误是无法预知的
    什么是异常
        异常是程序出错时标识的一种状态
        当异常发生时,程序不会再向下执行,
        而转去调用此函数的地方待处理此错误并恢复为正常状态
    作用:
        用作信号,通知上层调用者有错误需要处理

    try语句

        两种语法:
            try-except 语句
            try-finally语句

    try-except 语句语法

        try:
            可能触发异常的语句
        except 错误类型1 [as 变量1]:
            异常处理语句1
        except 错误类型2 [as 变量2]:
            异常处理语句2
        except (错误类型3,错误类型4) [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  # <-- 此处可能会触发ZeroDivisionError类型的错误
    print("每个人分了%d个苹果" % result)

try:
    div_apple(10)  # 此函数可能会触发错误,分苹果失败
    print("分完苹果")
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  # <-- 此处可能会触发ZeroDivisionError类型的错误
    print("每个人分了%d个苹果" % result)

try:
    div_apple(10)  # 此函数可能会触发错误,分苹果失败
    print("分完苹果")
except (ValueError, ZeroDivisionError):
    print("苹果不分了")
print("程序正常退出")
# 此示例示意 try-except语句的用法

def div_apple(n):
    print("%d个苹果您想分给几个人?" % n)
    s = input("请输入人数: ")
    cnt = int(s)  # <--此处可能触发ValueError类型的错误
    result = n / cnt  # <-- 此处可能会触发ZeroDivisionError类型的错误
    print("每个人分了%d个苹果" % result)

try:
    div_apple(10)  # 此函数可能会触发错误,分苹果失败
    print("分完苹果")
except ValueError:
    print("苹果不分了")
except:
    print("其它类型的错误已捕获!")
print("程序正常退出")

练习:
    写一个函数:
        def get_score():
            ....
    此函数来获取用户输入的学生成绩信息(1~100的整数)
    如果用户输入出现异常则此函数返回0,否则返回用户输入的成绩

def get_score():
    try:
        score = int(input("请输入成绩:"))
        if 0 <=score <=100 :
            return score
        else:
            return 0
    except:
        return 0
    return score

score = get_score()
print("您输入的成绩是:",score)
#此示例示意 try-except语句中 as 的用法

def div_apple(n):
    print("%d个苹果您想分给几个人?" % n)
    s = input("请输入人数: ")
    cnt = int(s)  <--此处可能触发ValueError类型的错误
    result = n / cnt  <-- 此处可能会触发ZeroDivisionError类型的错误
    print("每个人分了%d个苹果" % result)

try:
    div_apple(10)  # 此函数可能会触发错误,分苹果失败
    print("分完苹果")
except ValueError as e:
    print("苹果不分了")
    print("错误的值是:", e)
except:
    print("其它类型的错误已捕获!")
print("程序正常退出")


    try-finally语句

        语法:
            try:
                可能触发异常的语句
            finally:
                一定要执行的最终语句
        说明:
            1.finally 子句不可以省略
            2.一定不存在except子句
        作用:
            通常用try-finally语句来做触发异常时必须要处理的事情,无论异常是否发生,finally子句都会被执行
        注:
            try-finally 语句不会改变程序的状态(正常/异常)状态

def fry_egg():
    print('打开气')
    try:
        count = int(input("鸡蛋数:"))
        print("共煎了",count,'个鸡蛋')
    finally:
        print("关闭气")

fry_egg()


    raise 语句

        作用:
            触发一个错误,让程序进入异常状态
        语法:
            raise 异常类型
            或
            raise 异常对象

# 此示例示意用raise语句来触发异常

def make_exception():
    print("begin")

    # 触发ValueError类型的异常并进入异常状态
    # raise ValueError
    err = ValueError("这是我自己定义的一个错误")
    raise err

    print("end")

make_exception()
# try:
#     make_exception()
#     print("make_exception调用结束")
# except ValueError as e:
#     print("try里出现了值错误通知,已捕获!!!")
#     print("接收的异常通知是: ", e)

练习:
    写一个函数get_age() 用来获取一个人的年龄信息
    此函数规则用户只能输入1~140之间的整数。如果用户输入其他的数则直接触发
    ValueError类型的错误!

    def get_age():
        ...

def get_age():
    s = input("请输入年龄(1~140): ")
    a = int(s)  # int函数里可能会触发ValueError类型的错误
    if 1 <= a <= 140:
        return a
    raise ValueError("用户输入的整数不在1~140之间")

try:
    age = get_age()
    print("用户输入的年龄是:", age)
except ValueError as err:
    print("用户输入的不是1~140的整数!!,获取年龄失败")


    assert 语句(断言语句)

        语法:
            assert 真值表达式,错误数据(通常是字符串)
        作用:
            当真值表达式为False时,用错误数据创建一个AssertionError类型的错误,并进入异常状态
        等同于:
            if 真值表达式== False:
                raise AssertionError(错误数据)


异常小结:

    语句:
        try-except
            捕获异常,尝试接收异常通知
        try-finally
            执行一定要执行的语句
        raise
            发送异常通知,将程序转为异常状态(进入异常流程)
        assert
            根据条件来触发AssertionError类型的异常
        with 语句(以后再学)

    为什么要用异常处理机制
        在程序调用层数较深时,向主调程序传递错误信息需要层层return返回比较麻烦,
        所以用异常处理机制来解决此类问题

def f1():
    print("开始建房子打地基")
    err = ValueError("打地基挖出古董")
    raise err
    print("完成打地基工作")
    return "地基完成"
def f2():
    print("开始建设地上部分")
    # err = ValueError("规划要建高压线")
    # return err
    print("地上部分建完..")
    return "地上完成"
def f3():
    # 建地基
    r1 = f1()
    # 建地上部分
    r2 = f2()
    return r1 + r2
def built_house():
    '''接项目的人'''
    return f3()

try:
    h = built_house()  # 建房子的函数,此函数应当返回一个房子对象
    print(h)
except ValueError as e:
    print("错误原因是:", e)
    print('改建博物管')

练习:
 1.一个球从100米高空落下,每次落地后反弹高度为原高度的一半,在落下,写程序
    1)算出皮球在第10次落地后反弹多高
    2)打印除皮球共经历了多少米路程
2.分解质因数,输入一个正整数,分解质因数
    如输入:90,则打印:
        90= 2* 3 * 3 * 5
   (质因数是指最小能被原数整除的素数(不包含1))
3.写程序打印杨辉三角(只打印6层)
     1
    1 1
   1 2 1
  1 3 3 1
 1 4 6 4 1
1 5 10 10 5 1

 # 1) 算出皮球在第10次落地后反弹多高
# 用循来来实现
def get_last_height(height, times):
    for _ in range(times):
        height /= 2
    return height

# 用递归来实现
# def get_last_height(height, times):
#     if times == 0:
#         return 100
#     return get_last_height(height, times - 1) / 2

print(get_last_height(100, 10))


# 2) 打印出皮球共经历了多少米路程
def get_distance(height, times):
    s = 0
    for _ in range(times):
        s += height + height / 2
        height /= 2
    return s

print(get_distance(100, 10))

#2
def is_prime(x):
    if x < 2:
        return False
    for i in range(2, x):
        if x % i == 0:
            return False
    # else:
    #     return True
    return True


def get_yinshu_list(n):
    '''用循环实现'''
    L = [] # 用来存放所有的质因数
    x = n  # x代表未分解的数
    while not is_prime(x):  # 当x不是素数时开始循环
        for i in range(2, x):
            if x % i == 0 and is_prime(i):  # 被整除,i是质因数
                L.append(i)
                x = int(x / i)
                break
    L.append(x)
    return L

n = int(input("请输入一个正整数: "))

# print(get_yinshu_list(n))
yinshu = get_yinshu_list(n)
s = '*'.join([str(x) for x in yinshu])
print("%d = %s" % (n, s))
#3.
def get_yanghui_list(n): # n代表层数
    '''此函数用于返回每一层的列表的列表'''
    layers = []  # 用于存储每一行的数据[[1], [1, 1], [1, 2, 1], ...]
    L = [1]
    for _ in range(n):  # 循环,每次加入layers中一行
        layers.append(L)  # 先把第一行加入
        # 算出下一行。再用L重新绑定
        one_line = [1]  # 最左边的1
        # 算出中间的数字
        for i in range(len(L) - 1):
            one_line.append(L[i] + L[i + 1])
        one_line.append(1)  # 加入最右边的1
        L = one_line  # 让L 绑定新算出的一行
    return layers

if __name__ == '__main__':
    # print(get_yanghui_list(6))
    for l in get_yanghui_list(6):
        print(l)

猜你喜欢

转载自blog.csdn.net/zh__quan/article/details/81839614