day 14 note 异常和常用模块
01. 数据持久化
1. 数据持久化
1) 需要持久化的数据通过一个文件来保存
2) 需要这个被持久化的数据的时候,不直接给值,而是从文件中读这个数据
3) 如果被持久化的数据发生了改变,需要把最新的值再重新写入文件中
num = 0 # 上一次执行时的次数
with open('resource/count.txt', encoding='utf-8') as f:
num = int(f.read())
num += 1
print(num)
with open('resource/count.txt', 'wt', encoding='utf-8') as f:
f.write(str(num))
02. 登录注册系统
from fileManager import read_file, write_file
def read_file(file_url: str):
"""
获取指定文件中的内容
:param file_url: 需要读取内容的文件的路径
:return: 文件中的文本内容
"""
try:
with open(file_url, encoding='utf-8') as f:
return f.read()
except:
print('打开文件失败!')
return None
def write_file(file_url: str, data: str, mode='w'):
"""
将指定数据写入到指定文件中
:param file_url: 指定文件的路径
:param data: 需要写入到文件中的内容
:param mode: 打开方式,默认是 'w'
:return: None
"""
with open(file_url, mode, encoding='utf-8') as f:
f.write(data)
def show_main_page():
page = read_file('./resource/main_page.txt')
while True:
# 显示主页面
print(page)
# 给出选项
value = input('请选择(1~3):')
# 根据选择做不同的事情
if value == '1':
# print('登录')
login()
elif value == '2':
# print('注册')
register()
elif value == '3':
print('退出')
return
else:
print('其他情况')
def login():
# 1.输入账号和密码
user_name = input('请输入账号:')
password = input('请输入密码:')
# 2.判断登录是否成功
# 0)获取之前已经注册过的账号和对应的密码
users = eval(read_file('resource/users.txt'))
# 1)判断输入的账号是否是已经注册过的账号
if user_name not in users:
print('登录失败!账号不存在!')
return
# 2)判断输入的密码是否和注册时输入的密码一致
if users[user_name] != password:
print('登录失败!密码错误!')
return
print('登录成功!')
def register():
# 1.输入账号和密码
user_name = input('请输入账号:')
password = input('请输入密码:')
# 2.判断账号是否可以注册
# 1)先获取之前已经注册过的所有的账号
all_user = eval(read_file('resource/users.txt'))
# 2)看当前输入的账号是否在已经注册过的账号里面
if user_name in all_user:
print('注册失败!该账号已经注册!')
return
# 3.注册
all_user[user_name] = password
write_file('resource/users.txt', str(all_user))
print('注册成功!')
if __name__ == '__main__':
show_main_page()
03. 异常捕获
1. 异常
程序报错又叫程序出现异常;如果在执行程序的过程中,出现异常,那么这个程序会在出现异常的地方结束。
2. 异常捕获
异常捕获就是让程序在出现异常的时候不崩溃,可以继续执行。
什么时候捕获异常:明明知道某段代码可能会出现异常,但是又没有办法或者必要去通过修改这段代码来避免异常的时候,就可以使用异常捕获
1)语法一(捕获所有类型的异常):
try:
代码段1(需要捕获异常的代码段)
except:
代码段2(出现异常后会执行的代码段)
finally:
代码段
其他语句…
执行过程:先执行代码段1,如果没有出现异常不执行代码2直接执行后面其他语句;
如果出现异常,程序不崩溃,马上执行代码段2,执行完后才执行后面其他的语句。
2)语法二:
try:
代码段1(需要捕获异常的代码段)
except 异常类型:
代码段2(出现指定异常后会执行的代码段)
finally:
代码段
3)语法三
try:
代码段1(需要捕获异常的代码段)
except (异常类型1, 异常类型2,…):
代码段2(出现指定异常后会执行的代码段)
finally:
代码段
4)语法四
try:
代码段1(需要捕获异常的代码段)
except 异常类型1:
代码段11
except 异常类型2:
代码段22
except 异常类型3:
代码段33
…
finally:
代码段
3. 关键字 finally
所有的try-except结构后面都可以跟一个finally, 它不影响原来代码的执行。
finally后面的代码段,不管前面的try-except发生什么,都会执行 (包括出现异常没有捕获到)
# 案例1:
try:
age = int(input('请输入年龄:'))
except:
print('输入的年龄有误!')
print('游戏!')
# 案例2:
try:
age = int(input('请输入年龄:'))
print([1, 2][3])
print('=======')
print('-------')
except:
print('出现异常!')
04. 常用系统模块
1.随机模块
**import random 导入模块 **
1) randint(m, n) - 产生[m, n]的随机整数
print(random.randint(10, 20))
2) random() - 产生[0, 1)的随机小数
print(random.random())
产生[0 ~ 100)的随机小数
print(random.random()*100)
产生[10, 20)的随机小数
print(random.random()*10 + 10)
产生[50, 120)的随机小数
print(random.random()*70+50)
3) random.shuffle(列表) - 洗牌(随机打乱列表中元素的顺序)
nums = [10, 20, 30, 40, 50, 60]
random.shuffle(nums)
print(nums)
4) random.choice(列表) - 从列表中随机获取一个元素
random.choices(列表, k=N) - 从列表中随机取N个元素
nums = [10, 20, 30, 40, 50, 60]
print(random.choice(nums))
print(random.choices(nums, k=2))