上周内容回顾
# 【一】计算机的五大组成部分
# 控制器 : 负责调度整个计算机的硬件操作
# 运算器 : 负责处理数据和逻辑运算
# 存储器 : 负责存储数据和程序 (外存(硬盘)和内存(内存条))
# 输入设备 : 负责向电脑中输入内容
# 输出设备 : 计算机负责向用户输出内容
# 【二】计算机的三大核心硬件
# CPU : 控制器 + 运算器 组成 整个计算机的大脑 负责整个计算机的协调和运算
# 硬盘 : 机械硬盘(便宜,读取速度慢) 固态硬盘(贵,读取速度快)
# 内存 : 负责临时存储计算机中运行产生的数据
# 程序执行流程:
# 双击应用图标开始 --->
# 将应用数据从硬盘中读取到内存中 --->
# CPU 会将临时的程序数据从内存中读取出来 --->
# CPU 发送指令集交给固定的硬件 --->
# 硬件执行完毕后 --->
# 将结果从内存中读取出来 --->
# 显示器将结果显示出来 --->
# 程序结束 --->
# CPU 发送指令集 关闭程序
# 硬盘要将数据从内容中读取出来 然后保存到本地的硬盘中
# 【三】什么是编程和什么是编程语言
# 编程语言 就是 人与计算机之间交流沟通的媒介 类似于我们人类交流的 中文/英文/日文 ...
# 编程就是 将人能识别的代码转换为计算机可以识别的数据
# 【四】编程语言的分类
# 【1】机器语言
# 计算机是基于电运行的,高低电频之分 0 / 1 ,在最开始的时候是控制电流高低电频的变化从而控制计算机硬件
# 由 0 / 1 二进制数据组成的 数字串 就是机器语言
# 优点:直接操作硬件 效率高
# 缺点:学习成本高,不好学
# 【2】汇编语言
# 基于机器语言之上,用字符来代替上面的一串机器指令 ,字符就是指 英文大小写字母 / 标点符号
# 优点:直接操作硬件 效率高
# 缺点:学习成本高
# 【3】高级语言
# 用人类能看懂的字符来操作操作系统然后在控制底层硬件
# 先写代码 ---> 交给操作系统,负责转义 转译成机器语言 ---> 交给底层硬件 执行
# (1)编译型语言
# 先编译边执行 先将源代码根据操作系统的不同转换为自己系统的源文件
# 一篇文章要先将整个文章翻译后再使用
# c c++ java
# 优点:一次编译处处运行 效率高
# 缺点:跨平台性差
# (2)解释型语言
# 边解释边执行
# 一篇文章先翻译一部分,然后使用,然后再翻译一部分,然后再使用
# Python Go PHP
# 优点:跨平台性好
# 缺点:效率低(是相对于计算机来说的)
# 【五】Python介绍
# 创始人:龟叔
# 世界排名:第一
# 发展历史:1989开始写 1991 第一个版本发布 ... 2016 发布3.6 ...
# 我们使用的Python解释器版本是 Cpython 我们使用的解释器底层是c语言写起来的
# 【六】Python安装
# 傻瓜式安装(看笔记)
# 【七】PyCharm安装
# 傻瓜式安装(看笔记)
# 【八】Python知识点补充
# 【1】虚拟环境
# 虚拟环境就是 创建一个独立的Python运行环境
# 主要作用:为了隔离每一个项目之间不同的版本
# 创建虚拟环境的三种方式:
# 自带的 venv python venv 虚拟环境名字
# 第三方模块 virtualenv 先安装 pip install virtualenv 使用参考笔记
# 使用PyCharm
# 【2】PIP换源
# 默认的安装源是国外的,下载速度慢
# 于是各大机构就在国内开设了安装源,下载速度回很快
# 临时还源:pip install 模块名 -i 源地址
# 永久换源:pip set global.index-url 源地址
# 【九】PyCharm快捷键和插件操作
# ctrl + d 快速复制当前行
# ctrl + v :粘贴
# ctrl + x : 剪切
# ctrl + alt + l :格式化代码
# ctrl + / : 快速注释代码
# ...
# 【十】常量和变量
# 【1】什么是常量
# 常量就是程序在运行过程中不会改变的量
# 在Python中常量的变量名要用全大写声明
# 在Python中定义的常量是可以修改的但是不建议修改
# 自其它语言中常量一旦定义就无法再修改了
# 【2】什么是变量
# 变量就是程序在执行过程中不断变化的量
# 为了能够使用和处理这些数据
# 变量名 = 变量值
# 【3】变量名的命名规范
# 可以用数字 + 字母 + 下划线任意组合
# 数字不能作为变量名的开头
# 关键字不能作为变量名
# 【4】变量名的命名风格
# 驼峰提
# 大驼峰 : 每一个单词的首字母都大写
# 小驼峰 : 第一个单词的首字母小写 其他都大写
# 下划线组合
# 用下划线 + 数字 + 字母任意组合
# 【5】变量的三大特性
# 变量值 : 直接打印变量名
# 变量类型 :借助 type 函数
# 内存地址 : 借助 id
# 【十一】基本数据类型概述
# 但是在程序运行过程中会产生各种自己独有的数据
# 整数类型 int
# 浮点数类型 float
# 字符串类型 str
# 布尔类型 bool
# 字典类型 dict
# 列表类型 list
# 元组类型 tuple
# 集合类型 set
# 【十二】流程控制语句
# 顺序结构 : 程序从上到下依次执行
# 分支结构
# 单分支
# 双分支
# 多分支
'''
if 条件1:
条件1成立执行的代码快
elif 条件2:
条件2成立执行的代码快
elif 条件3:
条件3成立执行的代码快
else:
以上条件都不成立执行的代码快
'''
# 循环结构
# while 循环 continue 关键字 break 关键字
# 标志位
# 死循环:没有结束条件的循环语句
'''
声明标志位
tag = True
while 条件 and tag:
代码快
continue : 结束本次循环 进入到下一次循环
break : 结束整个循环
'''
# for 循环
# for i in 可迭代类型: print(i)
# range 关键字 : 能够帮我们生成一个指定区间的列表
# 在2.x的时候直接给你生成号的雷彪
# 3.x 之后就编程了生成器 用的时候再给你
# range(开始索引,结束索引, 步长) 顾头不顾尾
# 【十三】三元运算
# 为真的值 if 条件 else 条件为假的值
# ()[表达式] 取到 布尔值转换为 0 / 1 取索引所对应的元素
# {}[表达式] 取到布尔值转换为 True / False 取字典中招 True / False 对应的值
# 【十四】数据类型的内置方法
# 【1】整数类型的内置方法
# 强制类型转换 int(符合整数类型的字符串)
# bin 十进制转二进制
# oct 十进制转八进制
# hex 十进制转十六进制
# int 将其他进制转为十进制
# 【2】浮点数
# 强制类型转换 float(符合浮点数类型的字符串)
# 字符串.isdigit() 判断当前字符是否是整数类型的数据格式
# 【3】字符串
# 字符串拼接 + 号拼接 / ''.join(可迭代类型)
# 索引取值 正向索引取值(从0开始 从左向右) 负向索引取值 (从-1开始 从右向左)
# 切片取值 字符串[开始索引:结束索引:步长] 顾头不顾尾
# 计算数据长度 len
# 成员运算 in / not in
# 去除特殊字符 strip() 去除首尾的特殊字符(默认是空格和换行) / lstrip() 去除左侧的 / rstrip() 去除右侧的
# 切分 split() 切分字符串 默认是空格 切分的字符会消失
# 替换字符 replace(旧字符,新字符) 替换字符串中的字符 默认是全部替换
# 遍历字符串 for 循环 / while 循环
# 字符串重复 字符串 * 数字
# 字符串大小写转换 upper() lower()
# 首尾字符判断 startswith() endswith()
# 字符串格式化输出语法 %s站位 / '{}'.format(元素) / f"{name}"
# find 查找当前字符在字符串中所在的索引位置默认是从左向右找 并且找打一个旧不找了 如果找不到 就返回 -1 rfind 从右向左找
# index 查找当前字符在字符串中所在的索引位置默认是从左向右找 并且找打一个旧不找了 如果找不到 就报错 rindex 从右向左找
# 计算当前字符所在字符串中出现的次数 count()
# center(原字符串的长度 + 填充的字符个数,字符) 居中填充
# ljust(原字符串的长度 + 填充的字符个数,字符) 左对齐 填充在右侧
# rjust(原字符串的长度 + 填充的字符个数,字符) 右对齐 填充在左侧
# zfill(原字符串的长度 + 填充的字符个数) 用0填充至指定长度
# capitalize() 一句话的首字母大写
# title() 一句话的每个单词的首字母大写
# swapcase() 把大写字母转换为小写 把小写字母转换为大写
# isdigit() 判断当前字符是否是数字类型的数据格式
# 【4】列表
# 强制类型转换 将可迭代类型转换为 列表
# 索引取值 正向索引取值(从0开始 从左向右) 负向索引取值 (从-1开始 从右向左)
# 切片取值 列表[开始索引:结束索引:步长] 顾头不顾尾
# 计算数据长度 len
# 成员运算 in / not in
# 增加元素 .append() 默认追加在结尾 .insert(索引位置,元素) 插入到指定索引位置 extend(可迭代类型) 追加多个元素
# 删除元素 .remove(元素) 删除指定的元素 .pop(索引位置) 删除指定的索引位置的元素 del 列表[索引位置] 删除指定的索引位置的元素
# 颠倒元素 .reverse()
# 列表元素排序 .sort(reverse=True)
# 遍历循环 for / while
# 【5】元组类型
# 元组一个元素的时候也要加 , 不加 , 就是当前元素的类型
# 一个字符串或者一个数字的时候不要加 , 编程了元组
# 强制类型转换 将可迭代类型转换为 元组
# 索引取值 正向索引取值(从0开始 从左向右) 负向索引取值 (从-1开始 从右向左)
# 列表可以索引取值并修改值但是元组不行
# 切片取值 列表[开始索引:结束索引:步长] 顾头不顾尾
# 成员运算 in / not in
# 计算长度 len
# 遍历循环 for / while
# 元组拼接 元祖 + 元组 新的元组
# 元祖重复 元祖 * 数字
# 【6】布尔
# 真或假 True / False
# 为假的情况 : 空的其他类型 / 数字 0 / 布尔值False
# 【7】字典类型
# 大扩包裹的K:V键值对数据
# 取值: 字典[key] 取值 没有就报错 字典.get(key) 如果没有默认就是 None
# 计算长度 len
# 成员运算 in / not in
# 增加 元素 字典[key] = value 没有就新增 有就修改 字典.update(字典) 没有就新增 有就修改 字典.setdefault(key,value) 没有就新增 有就修改
# 删除 元素 字典.pop(key) 删除指定的key 字典.popitem() 随机删除一个key 字典.clear() 清空字典
# 键对 字典.keys()
# 值对 字典.values()
# 键值对 字典.items()
# 【8】集合类型
# 无序且去重
# 向集合中添加元素 集合.add(元素) 集合.update(可迭代类型)
# 从集合中删除元素 集合.remove(元素) 集合.discard(元素)
上周作业多用户登录注册
# 【一】登录注册
# 多用户的登陆和注册
menu = '''
############ 功能菜单 ############
1.注册
2.登陆
3.退出
############ 功能菜单 ############
'''
# 声明数据存储位置
user_data = {}
while True:
# 【1】打印功能菜单
print(menu)
# 【2】用户输入功能ID
func_id = input("请输入功能ID :>>>> ").strip()
# 【3】判断当前功能ID是否是整数
if not func_id.isdigit():
print(f"当前功能ID非法!")
continue
func_id = int(func_id)
# 【4】判断用户输入的功能ID是否存在
if func_id not in [1, 2, 3]:
print(f"当前功能ID不存在!")
continue
# 【5】进入到登陆或者注册逻辑中
if func_id == 1:
print(f"欢迎来到注册功能!")
# (1)让用户输入用户名和密码
username = input("请输入用户名 :>>>> ").strip()
password = input("请输入密码 :>>>> ").strip()
# (2)判断当前用户是否存在 如果不存在才能注册
if user_data.get(username):
print(f"当前用户{username} 已存在!请登录!")
continue
# 判断密码必须是三位
if len(password) != 3:
print("密码长度必须为3位!")
continue
# 判断密码必须包含数字 / 包含大小写字母
num_list = []
for i in range(0, 10):
num_list.append(str(i))
# num_list= ["1","2","3"]
# password = "123"
_data = {}
# {"1":1}
for i in password:
# i : 1
if i in num_list:
_data[i] = 1
if len(_data) == 0:
print("密码必须包含数字!")
continue
# (3)注册用户信息
user_data[username] = {
"username": username,
"password": password
}
print(f"当前用户 {username} 注册成功!")
elif func_id == 2:
print(f"欢迎来到登陆功能!")
# (1)让用户输入用户名和密码
username = input("请输入用户名 :>>>> ").strip()
password = input("请输入密码 :>>>> ").strip()
# (2)判断当前用户是否存在 如果存在才能继续登陆
if username not in user_data.keys():
print(f"当前用户{username}不存在!请先注册!")
continue
# (3)取出当前用户的用户名和密码进行登陆
if password != user_data[username]["password"]:
print(f"当前用户 {username} 密码错误!")
else:
print(f"登录成功!")
上周作业员工管理系统
# 员工管理系统
# 用户登录和注册 ---> 验证权限
# 增删查改用户
# 【一】定义功能菜单
menu = '''
************** 功能菜单 **************
1.用户注册
2.用户登陆
3.添加用户
4.查看所有用户
5.查看指定用户
6.删除指定用户
7.删除所有用户
8.修改指定用户信息
9.退出
************** 功能菜单 **************
'''
# 【二】分析流程
# 每一个工作的流程和主流程
# 【1】声明数据存储方式
# 【2】起整体逻辑
# 【3】分化每一个功能
# 以字典存储用户数据
'''
{
"username": {
"username": "username",
"password": "password",
"role": "role",
"age": "age",
"gender": "gender",
"hobby": "hobby",
}
}
'''
user_data = {
"dream_01": {
"username": "dream",
"password": "521",
"role": "admin",
"user_id": "00001",
"age": 18,
"gender": "male",
"hobby": ["music", "run"],
}
}
login_dict = {
"username": None,
"role": None
}
while True:
# 【1】打印功能菜单
print(menu)
# 【2】让用户输入功能ID
func_id = input("请输入功能ID :>>>> ").strip()
if not func_id.isdigit():
print(f"当前功能ID非法!")
continue
func_id = int(func_id)
if func_id not in list(range(1, 10)):
print(f"当前功能ID不存在!")
continue
# 【3】分化功能
if func_id == 1:
print(f"欢迎来到注册功能!")
# (1)让用户输入用户名和密码
username = input("请输入用户名 :>>>> ").strip()
password = input("请输入密码 :>>>> ").strip()
if username in user_data:
print(f"当前用户已存在,请先登录!")
continue
# (2)用户不存在则继续注册
if username == "dream" and password == "521":
role = "admin"
else:
role = "user"
user_data[username] = {
"username": username,
"password": password,
"role": role,
"user_id": None,
"age": None,
"gender": None,
"hobby": [],
}
print(f"当前用户 {username} 注册成功!")
elif func_id == 2:
print(f"欢迎来到登陆功能!")
# (1)让用户输入用户名和密码
username = input("请输入用户名 :>>>> ").strip()
password = input("请输入密码 :>>>> ").strip()
user_detail = user_data.get(username)
if not user_detail:
print(f"当前用户不存在,请先注册!")
continue
# (2)用户存在则继续登陆
if password != user_detail.get("password"):
print(f"当前密码错误,请重新输入!")
continue
login_dict["username"] = username
login_dict["role"] = user_detail.get("role")
if user_detail.get("role") == "admin":
role = "管理员"
else:
role = "用户"
print(f"欢迎当前 {role} 用户 {username} 登陆成功!")
elif func_id == 3:
print(f"欢迎来到添加用户功能!")
# 先校验当前用户是够是管理员
if login_dict.get("role") != "admin":
print("当前用户不是管理员,没有权限访问该功能!")
continue
# 管理员才能添加用户信息
while True:
# 实时更新当前用户ID列表
user_id_list = []
for username, user_detail in user_data.items():
user_id = user_detail.get("user_id")
user_id_list.append(user_id)
username = input("请输入用户名 :>>>> ").strip()
if username in user_data:
print("当前用户名已存在,请重新输入!")
continue
password = input("请输入密码 :>>>> ").strip()
role = input("请输入用户角色(1 admin / 0 user) :>>>> ").strip()
if role == "1":
role = "admin"
elif role == "0":
role = "user"
else:
print("当前角色输入错误,请重新输入!")
age = input("请输入用户年龄 :>>>>").strip()
if not age.isdigit():
print(f"当前年龄非法")
continue
age = int(age)
if age < 0 or age > 120:
print(f"当前年龄非法,不能是非人类!")
continue
user_id = input("请输入用户ID :>>>>").strip()
user_id = user_id.zfill(5)
if user_id in user_id_list:
print(f"当前用户ID {user_id} 已经被使用,请重新输入!")
continue
gender = input("请输入用户性别(0 女 / 1 男) :>>>>").strip()
if gender == "0":
gender = "女"
elif gender == "1":
gender = "男"
else:
print(f"不合法的性别!重新输入!")
continue
hobby_list = []
while True:
hobby = input("请输入用户爱好(输入q退出) :>>>>").strip()
if hobby == "q":
break
else:
if hobby in hobby_list:
print(f"当前爱好已存在,请重新输入!")
continue
else:
hobby_list.append(hobby)
user_data[username] = {
"username": username,
"password": password,
"role": role,
"user_id": user_id,
"age": age,
"gender": gender,
"hobby": hobby_list,
}
print(f"当前用户 {username} 信息添加成功!")
continue_choice = input("请选择是否继续添加用户信息(y/n) :>>>> ")
if continue_choice == "y":
continue
else:
print(f"当前功能已退出!")
break
elif func_id == 4:
print(f"欢迎来到查看所有用户功能!")
for username, user_info in user_data.items():
role = user_info.get("role")
if role == "admin":
role = "管理员"
else:
role = "普通用户"
print(f"""
################# 当前用户 {username} 信息如下 #################
用户名 :>>>> {username}
用户ID :>>>> {user_info.get("user_id")}
权限 :>>>> {role}
年龄 :>>>> {user_info.get("age")}
性别 :>>>> {user_info.get("gender")}
爱好 :>>>> {', '.join(user_info.get("hobby"))}
################# 当前用户 {username} 信息如上 #################
""")
elif func_id == 5:
print(f"欢迎来到查看指定用户功能!")
# 实时更新当前用户ID列表
user_id_dict = {}
for username, user_detail in user_data.items():
user_id = user_detail.get("user_id")
print(f"当前用户ID :>>>> {user_id} 用户名 :>>>> {username}")
user_id_dict[user_id] = username
user_id_input = input("请输入查看用户的指定ID :>>>> ").strip()
if user_id_input not in user_id_dict.keys():
print(f"当前用户ID不存在!")
continue
username = user_id_dict[user_id_input]
user_info = user_data.get(username)
role = user_info.get("role")
if role == "admin":
role = "管理员"
else:
role = "普通用户"
print(f"""
################# 当前用户 {username} 信息如下 #################
用户名 :>>>> {username}
用户ID :>>>> {user_info.get("user_id")}
权限 :>>>> {role}
年龄 :>>>> {user_info.get("age")}
性别 :>>>> {user_info.get("gender")}
爱好 :>>>> {', '.join(user_info.get("hobby"))}
################# 当前用户 {username} 信息如上 #################
""")
elif func_id == 6:
print(f"欢迎来到删除指定用户功能!")
# 实时更新当前用户ID列表
user_id_dict = {}
for username, user_detail in user_data.items():
user_id = user_detail.get("user_id")
print(f"当前用户ID :>>>> {user_id} 用户名 :>>>> {username}")
user_id_dict[user_id] = username
user_id_input = input("请输入查看用户的指定ID :>>>> ").strip()
if user_id_input not in user_id_dict.keys():
print(f"当前用户ID不存在!")
continue
username = user_id_dict[user_id_input]
user_info = user_data.pop(username)
elif func_id == 7:
print(f"欢迎来到删除所有用户功能!")
user_data.clear()
elif func_id == 8:
print(f"欢迎来到修改指定用户信息功能!")
user_id_dict = {}
for username, user_detail in user_data.items():
user_id = user_detail.get("user_id")
print(f"当前用户ID :>>>> {user_id} 用户名 :>>>> {username}")
user_id_dict[user_id] = username
user_id_input = input("请输入查看用户的指定ID :>>>> ").strip()
if user_id_input not in user_id_dict.keys():
print(f"当前用户ID不存在!")
continue
username = user_id_dict[user_id_input]
user_info = user_data[username]
password = input("请输入密码 :>>>> ").strip()
role = input("请输入用户角色(1 admin / 0 user) :>>>> ").strip()
if not role:
role = user_info.get("role")
if role == "1":
role = "admin"
elif role == "0":
role = "user"
else:
print("当前角色输入错误,请重新输入!")
age = input(f"请输入用户年龄{user_info.get('age')} :>>>>").strip()
if not age.isdigit():
print(f"当前年龄非法")
continue
age = int(age)
if age < 0 or age > 120:
print(f"当前年龄非法,不能是非人类!")
continue
user_id = input("请输入用户ID :>>>>").strip()
user_id = user_id.zfill(5)
if user_id in user_id_dict.keys():
print(f"当前用户ID {user_id} 已经被使用,请重新输入!")
continue
gender = input("请输入用户性别(0 女 / 1 男) :>>>>").strip()
if gender == "0":
gender = "女"
elif gender == "1":
gender = "男"
else:
print(f"不合法的性别!重新输入!")
continue
hobby_list = []
while True:
hobby = input("请输入用户爱好(输入q退出) :>>>>").strip()
if hobby == "q":
break
else:
if hobby in hobby_list:
print(f"当前爱好已存在,请重新输入!")
continue
else:
hobby_list.append(hobby)
user_data[username] = {
"username": username,
"password": password,
"role": role,
"user_id": user_id,
"age": age,
"gender": gender,
"hobby": hobby_list,
}
print(f"当前用户 {username} 信息添加成功!")
elif func_id == 9:
print(f"欢迎下次使用!")
break