__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 (错误类型,错误类型4)3 [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))