文档操作&异常捕获&列表、字典推导式

【零】文档操作

【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}
posted @ 2024-04-09 20:25  光头大炮  阅读(10)  评论(1编辑  收藏  举报