目录
__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)