目录
- all 列表
- 包的相对导入、加载路径
- 异常
- try except语句
- try finally语句
- raise语句
- assert语句
- 小结
1. all 列表
包的__init__.py 文件内的 __all__ 列表 :
作用:
用来记录此包中哪些子包或模块在用 from 包名import *语句导入时被导入
说明:
__all__列表只对 from 包名import *语句起作用
用法 : 在__init__.py 文件内写入 __all__ = ["模块1","模块2"..."属性1","属性2"...]
2. 包的相对导入、加载路径
包的相对导入 :
包的相对导入是指包内模块的相互导入 !!!包内模块的互相导入!!!
语法 :
from 相对路径包或模块 import属性或模块名
或:
from 相对路径包或模块 import *
相对路径 :
. 代表当前目录
.. 代表上一级目录
... 代表上两级目录
.... 以此类推
注: 相对导入不能超出包的外部
用法 :
mypack/
__init__.py
menu.py
games/
__init__.py
contra.py
supermario.py
tanks.py
office/
__init__.py
excel.py
word.py
---------------------
import mypack.games.contra as contra
#使用相对路径调用menu.py模块内的show_menu函数:
from ..menu import show_menu
#使用绝对路径调用menu.py模块内的show_menu函数:
from pack.menu import show_menu
包的加载路径 :
和模块的加载路径相同,但没有系统内建包 :
1. 当前文件夹
2. sys.path 给出的路径
3. 异常
错误 Error :
错误是指由于逻辑或语句等导致一个程序无法正常执行的问题
特点:
有些错误是无法预知的
异常 exception :
异常是程序出错时标识的一种状态 (错误引起异常)
当异常发生时,程序不会再向下执行,而转去调用此函数的地方
等待处理此错误并恢复为正常状态
异常的作用 :
1.通知上层调用者有错误产生需要处理
2.用作信号
4. try except语句
try except 语句
语法 :
-------------------------------------------------
try :
可能触发异常的语句 #可能出错的地方,如果出错进入except语句
except 错误类型1 [as 变量1]: #至少有一个except语句块
异常处理语句1
except 错误类型2 [as 变量2]:
异常处理语句2
except (错误类型3,错误类型4)... [as 变量3]:
异常处理语句3
...
except :
异常处理语句 other #捕获其他未指明的异常
else :
未发生异常时执行的语句 #else,finnally可以没有
finally :
最终执行语句 #子句一定会被执行 无论是否异常都会被执行的语句
-------------------------------------------------
作用: 尝试捕获异常,将程序转为正常状态并继续执行
语法说明:
as 子句是用于绑定错误对象的变量,可以省略不写
except子句可以有一个或多个,但至少要有一个
else子句最多只能有一个,也可以省略不写
finally子句最多只能有一个,也可以省略不写
eg :
def div_apple(n) :
print('%d个苹果您想分给几个人?' % n)
s = input('请输入人数 ')
cnt = int(s) #<<=可能触发ValueError错误异常
#<<=可能触发 ZeroDivisionError错误异常
result = n / cnt
print('每个人分了',result,'个苹果')
#以下是调用者
#用try-except语句来捕获并处理ValueError类型的错误
try :
print('开始分苹果')
div_apple(10)
print('分苹果完成')
except ValueError :
print('div_apple内部出现ValueError错误,已处理')
print('用户输入不合法')
except ZeroDivisionError :
print('div_apple内部出现ZeroDivisionError错误,已处理')
print('用户输入不合法')
#except (ValueError,ZeroDivisionError):
# print('出现错误,已处理')
else :
print('程序正常执行')
finally :
print('finally子句一定会被执行')
print('程序正常退出')
练习 :
'''
函数get_score()来获取学生的成绩(0~100),如果输入出现异常,则返回0,
否则返回用户输入的成绩
'''
####方法1
def get_score() :
s = int(input('请输入学生额成绩(0~100),-1结束输入'))
if 0<= s <=100 :
return s
return 0
try :
score = get_score()
except :
score = 0
print('score = ',score)
####方法2
def get_score() :
try :
s = int(input('请输入学生额成绩(0~100),-1结束输入'))
except:
return 0
if 0 <= s <= 100:
return s
return 0
score = get_score()
print('score = ',score)
5. try finally语句
try-finally语句
语法:
-------------------------------
try:
可能触发异常的语句
finally:
最终语句
-------------------------------
说明:
finally 子句不可以省略
一定不存在except子句
作用:
通常用try-finally语句来做触发异常时必须要处理的事情,无论异常是否发生,finally子句都会被执行
注:
try-finally语句不会改变程序的(正常/异常)状态
应用场景
def fry_egg :
print('打开天然气')
try :
n = int(print('请输入煎蛋个数'))
print('煎蛋数为: ',n)
finally :
print('天然气关闭')
fry_egg()
#不论程序运行出现什么错误,最后天然气都会被关闭
6. raise语句
try-except 用来接受错误通知并将程序转为正常状态
错误通知如何发出 ?
raise 语句
作用:
触发一个错误,让程序进入异常状态
语法:
raise 异常类型
或
raise 异常对象
eg : 使用raise+异常类型 发出异常通知并由try-except捕获处理
def make_except():
print('开始')
raise ValueError
print('结束')
try :
make_except()
except ValueError :
print('try-except接收到异常')
print('make_except调用结束')
#
>>开始
>>>try-except接收到异常
>>>make_except调用结束
#使用异常对象构造异常通知
def make_except():
print('开始')
e = ValueError('ValueError')
#e为异常对象,ValueError()为函数
raise e #触发e绑定的错误
print('结束')
try :
make_except()
except ValueError :
print('try-except接收到异常')
print('make_except调用结束')
7. assert语句
assert 语句(断言语句)
语法:
assert 真值表达式, 错误数据(通常是字符串)
作用:
当真值表达式为False时,用错误数据创建一个 AssertionError 类型的错误,并进入异常状态
类似于:
if 真值表达式 == False:
raise AssertionError(错误数据)
eg : assert语句用法
def get_age():
a = int(input('请输入年龄: '))
assert 0<=a<=140 ,'年龄不在合法范围内'
#当 0<= a <= 140 为False时,返回AssertionError错误类型
return a
age = get_age()
print('age = ',age)
8. 小结
小结:
接收错误消息:
try-except
做必须要处理的事情的语句:
try-finally
发错误消息的语句:
raise 语句
assert 语句
###为什么要用异常处理机制###
在程序调用层数较深时,
向主调函数传递错误信息需要用return语句层层传递比较麻烦,
所以用异常处理机制
eg : 以建房为例,示意什么情况下使用异常处理机制
def f1() :
print('开始打地基')
print('.....')
print('地基建完')
return 0
def built_house():
...
built_house() #开始建房
练习 :
'''一个球100米高空落下,每次落下后反弹高度是原高度的一半,再落下,
写程序
1) 算出皮球在第10次落地后反弹高度是多少,
2) 打印出球共经过了多少米的路程 '''
def ball(height,times):
for _ in range(times):
height /= 2
return height
print('球从100米反弹10次后高度是,',ball(100,10))
def ball_instance(height,times):
s = 0
for _ in range(times):
s += height #把下落高度求出来
height /= 2
s+=height #把反弹高度累加到s
return s
print('球从100米反弹10次后总共走了,',ball_instance(100,10),'米')
'''分解质因数,输入一个正整数,分解质因数:
如:
输入: 90
打印:
90=2*3*3*5
(质因数是指最小能被原数整数的素数(不包括1))
思路 :
#1.先将小于n所有素数取出
#2.从小到大遍历除,找到能除尽的,返回n除该素数后的数
#3.一直除成素数,结束
'''
def isprime(n): #判断是否为素数
a=0
if n < 2 :
return False
for i in range(2,n):
if n%i==0 :
a+=1
if a > 0 :
return False
return True
def primes(n): #取出小于n的素数
L = []
for i in range(2,n):
if isprime(i) :
L.append(i)
return L
def solve(n) :
L = []
if isprime(n):
L.append(str(n))
return L
while isprime(n)==False:
p = primes(n)
for i in p :
if n%i==0:
L.append(str(i))
n = int(n/i)
if isprime(n):
L.append(str(n))
return L
continue
return L
if __name__ == '__main__':
n = int(input('请输入要分解的整数 :') )
s = sorted(solve(n))
s2 = '*'
s0 = s2.join(s) #使用 s.join()函数
print(n,'=',s0)
def is_prime(x):
'''判断 x是否为素数'''
if x <= 1:
return False
for i in range(2, x):
if x % i == 0:
return False
return True
def get_prime_list(n):
'''此函数根据给定一个整数,返回此整数所有因数的列表'''
# 如何用n求出所有的因数
L = [] # 用来存放所有因数(素数)
# 如果n不是素数,我们就拆出因数出来
while not is_prime(n):
# 把n拆出来一个素数因数,然后继续循环
# 找n的一个因数:
for x in range(2, n):
if is_prime(x) and n % x == 0:
# x一定是n的因数
L.append(x)
n /= x # 下次再求n的因数
n = int(n) # 转为整数
break
else:
L.append(n)
return L
if __name__ == '__main__':
n = int(input("请输入整数: "))
print(get_prime_list(n))