【零】文档操作
【1】读和写(覆盖写和追加写)
# r(read) : 只读模式
# 将数据一次性全部读出
# w(write) : 只写模式
# 如果文件存在则打开文件,并将文件内荣清空然后写入新的内容
# 如果文件不存在则新建文件,并写入新的内容
# a(append) : 追加写模式
# 如果文件存在则打开文件,而是在文件的最后的结尾位置追加新的内容
# 如果文件不存在则新建文件,并写入新的内容
# 这三种操作模式其还是 wt / rt / at 操作文本
# 操作二进制数据
# wb / rb
【2】操作方法
# (1)读
# 一次性全部读出 read()
# 只读一行 readline()
# 逐行读出 readlines() --> 返回的一个列表,列表中的元素是每一行数据
# (2)写
# write() 一次性写入
# writelines(列表) 将列表中的所有元素拼接,拼接后一次性写入
【3】在文件内移动鼠标光标
# 句柄.seek(字节数,模式)
# 一个中文汉子占 3 字节
# 英文和特殊字符一般占 1 个字节
# with 语句打开文件 ---> 句柄.tell() 查看当前鼠标光标位置 ---> 在 0
# read(默认参数 -1)
# 发现光标移动到了最后一个字符的位置
【4】基于文件的登录和注册
# 基于文件实现登录和注册功能 (持久化存储数据)
func_menu = '''
------ 当前功能如下 ------
1.注册
2.登录
'''
while True:
print(func_menu)
func_id = input("请输入功能ID :>>>> ").strip()
if func_id == 'q':
break
if not func_id.isdigit() or func_id not in ['1', '2']:
print(f"当前ID错误!")
func_id = int(func_id)
if func_id == 1:
print(f"欢迎来到注册功能!")
# 输入用户名和密码
username_input = input("请输入用户名 :>>>> ").strip()
password_input = input("请输入密 码 :>>>> ").strip()
# 拼接数据格式(理想状态下用户唯一)
user_data = f'{username_input}|{password_input}'
# 打开文件写入数据 用户是可以连续注册的 采用 a 模式追加每一个用户数据
with open('user_data.text', 'a', encoding='utf8') as fp:
# 写入上面的数据
# 为了让每一个用户数据都占用一行 + \n 换行
fp.write(user_data + '\n')
print(f"当前用户 {username_input} 注册成功!")
elif func_id == 2:
# 先打印欢迎
print(f'欢迎来到登录功能')
# 输入用户名和密码
username_input = input("username :>>>>> ").strip()
password_input = input("password :>>>>> ").strip()
# 从文件中读取数据并做校验
data_dict = {}
with open('user_data.text', 'r', encoding='utf-8') as fp:
for line in fp:
username, password = line.strip().split('|')
# 有则修改无则添加
data_dict[username] = password
# {'dream': '666', 'opp': '666'}
password_true = data_dict.get(username_input)
if not password_true:
print(f"当前用户不存在,请先注册!")
continue
else:
if password_true != password_input:
print(f"当前密码错误")
continue
else:
print(f"欢迎用户 {username_input} 登录成功!")
break
【一】异常捕获
【1】什么是异常
- 异常是程序运行时可能发生的错误或意外情况。在Python中,异常是一种对象,表示程序执行期间发生的错误。
- 当出现异常时,程序的正常流程会被中断,跳转到异常处理流程。
【2】捕获异常
(1)语法
try:
# 正常可能会触发异常的代码
except ExceptionType as e:
# 触发异常后执行的代码
(2)示例
try:
name = "Dream"
name[0] = 'd'
except Exception as e:
print(f"触发异常 :>>>> {e}")
# 触发异常 :>>>> 'str' object does not support item assignment
(3)总结
- 字符串不允许索引取值修改值,因此会报错
- 报错后被except语句捕获到,并将异常信息打印出来
【3】异常捕获语法详细
# 【1】指定捕获指定的异常
# ZeroDivisionError
# try:
# print(int('a'))
# # 异常捕获的 try语法 要和 except 搭配
# # 值错误
# except ValueError:
# print(f"当前报错了! {ValueError}")
# try:
# print(1 / 0)
# except ZeroDivisionError:
# print(f"除数不能为0")
# 【2】捕获多个异常
# try:
# # print(int('a'))
# print(1 / 0)
# except (ValueError, ZeroDivisionError):
# if ValueError:
# print(f"当前 字母不能被 int 转换 报错!")
# elif ZeroDivisionError:
# print(f"除数不能为 0 ")
# 【3】多分支异常捕获
# try:
# # print(int('a'))
# print(1 / 0)
# except ValueError:
# print(ValueError)
# except ZeroDivisionError:
# print(ZeroDivisionError)
【4】捕获基本异常
# 不区分当前异常类型 ,只要是异常我就捕获
# try:
# # print(int("a"))
# print(1/0)
# except Exception as e:
# print(e)
【5】触发异常(对于 for循环)
# 达到某个条件的时候我想要主动触发异常
# for i in range(10):
# if i == 6:
# # 主动报错,告诉其他这里不能为 6
# # raise 错误类型
# raise ValueError('不能为 6')
【6】断言(assert)
# 达到某个为真的条件抛出异常信息
# for i in range(0, 10):
# # 在源码中会大量出现 --> 用到的时候再详细讲,现在你只需要认识即可
# assert i == 6, '不能为6'
【二】列表/字典推导式
【1】固定的语法
[表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]]
【1】列表推导式
(1)直接使用 range 关键字构建列表
number_list = []
for i in range(5):
number_list.append(i)
print(number_list) # [0, 1, 2, 3, 4]
number_list = [i for i in range(5)]
print(number_list) # [0, 1, 2, 3, 4]
(2)遍历列表
name_list = ['dream', 'opp']
# 想让每一个人名前面都加 nb_ --> nb_dream
# 原始
name_list_ = []
for i in name_list:
name_list_.append('nb_' + i)
print(name_list_)
# 列表推导式
name_list = ['nb_' + i for i in name_list]
(3)对每个元素进行取出空格
#原始
user_data = []
with open('user_data.text', 'r', encoding='utf-8') as file:
for line in file:
user_data.append(line.strip())
#推导式
with open('user_data.text', 'r', encoding='utf-8') as file:
user_data_list = [line.strip() for line in file]
print(user_data_list)
(4)利用一个元素生成新的列表
# 原始的方法
num_list_one = [i for i in range(10)]
num_list_two = [i for i in range(10, 20)]
num_list_new = []
for x in num_list_one:
for y in num_list_two:
num_list_new.append(x*y)
print(num_list_new)
#推导式
num_list_one = [i for i in range(10)]
num_list_two = [i for i in range(10, 20)]
num_list = [x * y for x in num_list_one for y in num_list_two]
num_list = [x * y for x in [i for i in range(10)] for y in [i for i in range(10, 20)]]
print(num_list)
(5)行和列转换
#原始的方法
num_list = []
for i in range(len(test[0])):
num_list_ = []
for row in test:
num_list_.append(row[i])
num_list.append(num_list_)
print(num_list)
#推导式
test = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
list_new = [[row[i] for row in test] for i in range(len(test[0]))]
print(list_new)
#输出结果:
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
(6)加入条件进行过滤
#原始的方法
num_one = []
for x in test:
if x % 2 == 0:
num_one.append(x)
list_two = list(filter(lambda x: x % 2 == 0, test))
print(list_two)
#推导式
test = [1, 2, 3, 4, 5, 6]
list_one = [x for x in test if x % 2 == 0]
print(list_one)
#输出结果:
[2, 4, 6]
[2, 4, 6]
【2】字典推导式
user_data_dict = {}
#原始的方法
with open('user_data.text','r',encoding='utf8') as fp:
for line in fp:
username,password = line.strip().split('|')
user_data_dict[username] = password
print(user_data_dict)
#推导式
with open('user_data.text', 'r', encoding='utf8') as fp:
user_data_dict = {line.strip().split('|')[0]: line.strip().split('|')[1] for line in fp}
print(user_data_dict)
【3】元组生成式
# ----> 先了解 生成的是生成器对象
# num_tuple = (i for i in range(10))
# # ---> (0,9)
# print(tuple(num_tuple))
【4】集合推导式
# 类似 列表推导式
set_num = {i for i in range(10)}
print(set_num)
#输出结果:
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}