python开发day14

__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 (错误类型,错误类型43 [as 变量3]

异常处理语句3

…..

except:

异常处理语句other

else:

未发生异常语句

finally:

最终语句

作用:

尝试捕获异常,将程序转为正常状态并继续执行

示例:except

# def div_apple(n):

#     print("%d个苹果您想分给几个人?"%n)

#     s = input("请输入人数:")

#     cnt = int(s)

#     result = n / cnt

#     print("每个人分了%d个苹果"%result)

# try:

#     div_apple(10)#输入不为整数时错误修改

# except ValueError:

#     print("分苹果失败,程序已接到通知并转为正常状态")

# print("程序正常退出")

# try:

#     div_apple(10)#错误输入0时,错误修改

# except ValueError:

#     print("分苹果失败,程序已接到通知并转为正常状态")   

# except ZeroDivisionError:

#     print("没有人来,自个享受吧")

#else:#分苹果成功时显示

# print("分苹果时没有发生异常")

# finally:    #在任何情况下都会执行

#     print("我一定会执行")

# print("程序正常退出")

练习:

   写一个函数:

      def get_score():

         ....

      此函数来获取用户输入的学生成绩信息(0~100的整数)

      如果用户输入出现异常则此函数返回0,否则返回用户输入的成绩

      score = get_score()

      print("您输入的成绩:", score)

解:

# def get_score():

#     s = input("请输入学生成绩(0~100): ")

#     try:

#         score = int(s)

#     except ValueError:

#         return 0

#     if 0 <= score <= 100:

#         return score

#     return 0

# score = get_score()

# print("您输入的成绩:", score)

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("关掉天然气")

# except  valueError

# pass

# fry_egg()

#print(“程序正常执行”)

raise  语句

作用:

触发一个错误,让程序进入异常状态

语法:

raise  异常类型

raise 异常对象

示例

# def make_exception():

#     print("begin")

#     #触发ValueError类型的异常并进入异常状态

#     raise ValueError

#     print("end")

#     err = ValueError("这是我自己定义的一个错误")

#     raise err

#     print("end")

# try:

#     make_exception()

#     print("make_exception调用结束")

# except ValueError as e:

#     print("try里出现了值错误通知,已捕获!!!")

#     print("接收的异常通知是:",e)

练习:

写一个函数get_age()用来获取一个人的年龄信息

此函数规则用户只能输入1~140之间的整数,如果用户输入其它的数则之间触发 ValueError 类型错误!

解:

# 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的整数!!,获取年龄失败")

# def get_age():

#     age =int(input("请输入年龄(1~140)之间的整数: "))

#     if age not in range(1,141):

#         raise ValueError

#     return age    

# try:

#     age = get_age()

#     print("用户输入的年龄是:",age)

# except ValueError as err:

#     print("用户输入的不是1~140的整数!!,获取年龄失败")

Assert 语句(断言语句)

语法:

Assert真值表达式,错误数据(通常是字符串)

作用:

当真值表达式为False时,用错误数据创建一个

AssertionError 类型的错误,并进入异常状态

等同于:

if 真值表达式 == False

raise   AssertionError(错误数据)

示例

# def get_acore():

#     s = int(input("请输入学生成绩: "))

#     # assert语句来断言s是否在0~100之间

#     assert 0 <= s <=100,"用户输入的整数不在范围内"

#     return s

# try:

#     score = get_acore()

#     print("学生成绩为:",score)

# except ValueError:

#     print("用户输入的成绩无法转换为整数!!!")

异常小结:

语句:

try-exxept

捕获异常,尝试接收异常通知

try-finally

执行一定要执行的语句

raise

发生异常通知,将程序转为异常状态(进入异常流程)

assert

根据条件来触发AssertionError类型的异常

With 语句(以后再学)

为什么要用异常处理机制

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

练习:

1. 一个球从100米高空落下,每次落地后反弹高度为原高度的一半,再落下,写程序

1) 算出皮球在第10次落地后反弹多高

2) 打印出皮球共经历了多少米路程

解:

# 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('皮球在第10次落地后反弹为:',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('皮球共经历%d'%get_distance(100, 10),'')

2. 分解质数,输入一个正整数,分解质因数

如输入:90则打印:

90 = 2* 3* 3 *5

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))

(质数是指最小能被原数整除的素数(不包含1))

猜你喜欢

转载自blog.csdn.net/weixin_42312995/article/details/80778058