近日内容(练习题/学习内容)汇总

本周内容回顾:

1.基本数据类型概括

1.整形 int
整形就相当于数字
格式: age = 18
类型转换
int()
可以用int(相应进制,几进制),转换为十进制
也可以通过oct 转为 8进制
		hex 转为 16 进制
    	bin 转为 2 进制
2.浮点型 float
浮点型就相当于带小数点的整数
格式:
salry = 35.2
浮点型的小数点不能有多个,只能有一个
类型转换:
float()
3.布尔值 bool
布尔值 只有两种状态表示
一个是True
一个是False
类型转化:
bool()   
在python中所有数据值都有布尔值
布尔值为False的为: '' {} [] 0 None
其余都为True
4.列表 list
列表内部可以存成多个数据值
格式:
data = [1,12,3,4,5,2,1,44,1,2]
内置方法:
1.索引取值
2.切片取值
3.反方向取值
4.append()
5.extend()
6.sort()
7.reverse()
8.insert()
8.remove()
列表是可变类型,是不可哈希的
5.字符串 str
类型转换:
str()
字符串相当于文本格式的数据类型,用双引号引起来的内容
如果字符串内需要使用引号引起来内容那么不能与外部包裹的引号一致。
如果多行注释赋值给变量名,那么就代表他是字符而不是注释
格式:
name = 'jason'
字符串内置方法:
1.split()
2.strip()
3.replace()
5.swapcase()
6.title()
7.capitalize()
8.索引取值
9.切片
10.反方向取值
11.endswith/startswith
12.upper/lower
13.isdigit()
14.zfill()
15.join()
6.元组 tuple
元组相当于小列表,但是元组内的数据值不能被改变。
元组为不可变类型,可哈希
类型转换:
tuple()
格式:
data = (1,)
如果元组内有一个数据值的话,我们在数据值后面添加一个逗号,这样就能表示他是元组的数据类型了
内置方法:
1.count()
2.index()
7.集合 set
集合只适合关系运算以及去重操作。
格式
s1 = {1,2,3,4,5,6}
由于集合内的元素是不能重复的
所以在如果有重复的数值在集合内会直接去重
内置方法:
&  
^
-
| 
8.字典 dict
格式:
d1 = {'name':'小敏','age':12}
键值对的形式表示字典
字典是通过键来取值
内置方法:
1.values()
2.keys()
3.fromkeys()
4.items()

2.格式化输出

1.%s %d 
2.{}.format
3.f'{}{}'

3.基本运算符/基本赋值符/逻辑运算符

1.基本运算符
+ 
-
*
/
//
%
**
2.基本赋值符
交叉赋值
a,b = b,a
解压赋值
l1 = [1,2,3]
a,b,c = l1
链式赋值
a = b = c =1
身份运算符
is
成员运算符
in 
not in
3.逻辑运算符
and 
or
not

4.python2 与python3中的区别

1.print
在python2中print无需()就可以直接打印
2.input
在python2 中 input获取的输入 输入什么数据类型 获取的就是什么数据类型
Python3中则为字符串类型
相当于python2中的raw_input方法
3.range()方法
在python2中range方法是直接生成一个列表,xrange方法就相当于在内存中放置了一个列表但是其中的数据在需要的时候才会被取出
python3中的range方法与python2中的xrange方法一样
4.默认编码不同
python2中的默认编码为ASCII
python3中的默认编码为UTF-8

5.垃圾回收机制

1.引用计数
name = 1
age = 1
我们可以看到两个变量名绑定的数据值都是一样的
那么当name = 1时
数据值1 身上的引用计数就为 1
变量名age也 =1 时 数据值1身上的引用计数就为2
垃圾回收机制是指当数据值身上的引用计数为0时
他会被垃圾回收机制识别并删除
2.标志清除
l1 = [1,2,3]
l2 = [4,5,6]
我们把l1列表中的数据添加到l2中
同样把l2列表中的数据添加到l1中
l1.append(l2)
l2.append(l1)
print(l1,l2)
l1 = [1,2,3,[4,5,6]]
l2 = [4,5,6,[1,2,3]]
此时我们删除l1,l2列表
del l1 
del l2
他们里面的数据值[4,5,6]、[1,2,3]由于是互相引用的关系,计数不为0
但是我们无法通过变量名去访问到这两个数据了
所以垃圾回收机制会给这种类型的数据打上一个标记,统一进行删除操作
3.分代回收
在我们写很长一段代码的过程中会有很多变量名与对应的数据值
那么垃圾回收机制会根据变量名与绑定数据值出现的频率进行分层
如果变量名与绑定的数据值在整个代码块中出现的次数很低,那么对它检测的频率就越高,一旦它的引用计数为0,那么就会被系统当作垃圾回收
相反,出现次数越多,那么检测它的频率就越低

6.流程控制

流程控制就相当于我们把我们的思想通过代码的形式表现出来,在表现出来的时候我们需要通过大量的判断对错以及循环完成我们的代码结构,实现我们想要的功能

7.分支结构

单if 分支
语法结构:
if 条件:
	条件成立后后运行if的子代码
判断条件下的子代码需要保持4个空格的缩进量
if else 分支
语法结构
if 条件:
	条件成立后运行if 条件下的子代码
else:
    如果条件不成立后运行else下的子代码
if elif else
语法结构:
if 条件:
	条件成立后运行if 条件下的子代码
elif: 
    if条件不成立后,如果elif条件成立则执行elif下面的子代码
else:
    如果条件不成立后运行else下的子代码

8.循环结构

1.
while 循环
语法结构:
while 条件:
	如果条件成立,执行它的循环体代码
break 终止循环
continue 结束本次循环 并跳到条件判断处
while else
while 条件:
	如果条件成立 执行条件下的循环体代码:
else:
	当while循环条件不成立时执行else下面的子代码
for 循环
语法结构:
for 变量名 in 可迭代对象 :
	条件成立后执行for循环体代码,循环完成后会结束循环程序
for else
for 变量名 in 可迭代对象 :
	条件成立后执行for循环体代码,循环完成后会结束循环程序
else:
    当for循环没有被break强制停止循环时,循环结束后会执行else下面的子代码

9.range方法

range 方法可以帮我们快速生成一个内部含有多个数字的数据
range(1.50) # 1-49
range(50)  #0-49
range(1,50,2)  # 0-49 每隔一个数取一次值

10.可变与不可变类型理论

1.可变类型有:
列表 字典 集合 
2.不可变类型有:
字符串 布尔值 整形 浮点型 元组
他们的区别在于
可变类型的值被修改,但是它的内存地址不变
不可变类型的值被修改,内存地址会改变

11.额外练习总结:

1.
# 写代码实现,循环提示用户输入内容(Q或q终止),并将内容用
# "_"
# 连接起来。
solution:
'''
# while True:
#     data = input('请输入内容')  # 获取用户输入
#     if data.upper() == 'Q':  # 如果等于Q 结束循环
#         break
#     else:
#         text = '_'.join(data)  # 如果输入内容就用join方法加入_拼接输入的数据
#         print(text)
'''
    
2.
# 26.
# 写代码实现,将IP转换为整数。
# 如 10.3.9.12 转换规则为:
#      10            00001010
#       3             00000011
#       9             00001001
#      12            00001100
# 再将以上二进制拼接起来,然后再进行一次翻转。
# 最终将翻转之后的二进制转换为十进制。
solution:
    '''
    data_list = [10, 3, 9, 12]  # 建立相关数据列表
l1 =[]  # 建立空列表存储数据
for i in data_list:  # 遍历列表中数据
    bin_data = bin(i)  # 获取数据的二进制数据值
    bin_data1 = bin_data.strip('0b')  # 删除开头的0b,并赋值给变量
    a = bin_data1.zfill(8)  # 通过zfill方法补齐 8 位
    l1.append(a)  # 添加到空列表中
b = ''.join(l1)  # 通过join方法 将列表中的内容通过 空字符串拼接起来
print(int(b[::-1],2))  # 通过整形() 转成十进制
    '''

3.
# 写代码实现,车牌的区域划分。
# car_list = ['鲁A32444', '沪B12333', '京B8989M', '京C49678', '黑C46555', '晋B25041', '沪C34567']
#根据以上代码获取各省车牌数量,例如:info = {"沪":2,"京":2 ...}
solution:
'''
car_list = ['鲁A32444', '沪B12333', '京B8989M', '京C49678', '黑C46555', '晋B25041', '沪C34567']
car_location_name = []
car_count = {}
for i in car_list:  # 遍历数据列表
    car_location_name.append(i[0])   # 遍历车属地名字添加进空列表中
    if car_location_name.count(i[0]) > 1:  # 判断车属地名字出现在车属地名字列表中是否大于依次
        car_count[i[0]] = car_location_name.count(i[0])  # 如果大于一次那么 将键值添加到字典中
    else:
        car_count[i[0]] = 1
print(car_count)
'''
4.
# # 将下述数据处理为如下格式的结果:
# #    info = [{'id':'1','name':'alex','age':'22','phone':'13651054608','job':'IT'},.... ..]
# # 提示:text的内容是根据 \n 分割(\n表示回车换行)。
text = """id,name,age,phone,job
1,alex,22,13651054608,IT
2,wusir,23,13304320533,Tearcher
3,老男孩,18,1333235322,IT"""
solution:
l1 = []
data = text.split('\n')  # 因为字符串打印的时候默认隐藏了换行符\n,所以我们先分割一下,分成4个列表
data1 = data[0].split(',')  # 我们先把键取出来 并且用,分割成列表[id,name,age,phone,job]
for i in range(1,len(data)):  # 遍历剩下分割好的列表
    d1 = {}
    data2 = data[i].split(',')  # 把剩下的数据用,再分割成列表
    for b in range(len(data1)):  # 遍历表头的索引,因为键的索引与值的索引都是一样的
        d1[data1[b]] = data2[b]  # 添加字典
    l1.append(d1)
print(l1)
5.
# 写代码实现
# 累乘计算器。
# content = input("请输入内容:")  # 用户可能输入 5*9*99.... 或 5* 9 * 10 * 99 或 5 * 9 * 99...
# # 补充代码实现
solution:
num = 1
content = input('请输入内容')
data = content.split('*')
for i in data:
    num *= int(i)
    num = num*i
print(num)
6.
# 使用for循环实现输出
# 9 * 9
# 乘法表
solution:
for i in range(1, 10):  # 循环1-9 赋值给i 也相当于数列的1-9打印
    for b in range(1,i+1):  # 横列的 1-9打印 循环 1-i+1 是横排的数字
        print(f'{b}*{i}',end=' ')
    print('')
7.
补充代码实现《棋牌游戏11点》
需求:
- 生成一副扑克牌(自己设计扑克牌的结构,小王和大王可以分别用14、15表示 )
- 3个玩家
  user_list = ["a","b","c"]
- 发牌规则
  - 默认先给用户发一张牌,其中 J、Q、K、小王、大王代表的值为0.5,其他就是则就是当前的牌面值。
  - 用户根据自己的情况判断是否继续要牌。
    - 要,则再给他发一张。
    - 不要,则开始给下个玩家发牌。
  - 如果用户手中的所有牌相加大于11,则表示爆了,此人的分数为0,并且自动开始给下个人发牌。
- 最终计算并获得每个玩家的分值,例如:
  result = {
      "a":8,
      "b":9,
      "c":0
  }
必备技术点:随机抽排
import random
total_poke_list = [("红桃", 1), ("黑桃", 2), ("大王", 15), ("小王", 14)]
# 随机生成一个数,当做索引。
index = random.randint(0, len(total_poke_list) - 1)
# 获取牌
print("抽到的牌为:", total_poke_list[index])
# 踢除这张牌
data = total_poke_list.pop(index) # ("红桃", 1)
print("抽完之后,剩下的牌为:", total_poke_list)
​```
solution:
import random
total_poke_list = [('小王',14), ('大王', 15)]  # 建立一个列表里面先把大小王用元组的形式组起来
user_list = ['小明', '小王', '小李']  # 建立一个玩家列表
color_list = ['红桃', '黑桃', '草花', '方片']  # 建立扑克花色列表
result = {}  # 建立结果字典
# 1.首先创建个列表,创建扑克牌
for i in range(1, 14):  # 循环1-13
    for color in color_list:
        usually_poke = (color,i,)
        # 现在创建了 13*4 张不同花色的牌 现在需要把他们与 大王小王 合并一下
        total_poke_list.append(usually_poke)
# print("抽完之后,剩下的牌为:", total_poke_list)
# 用户开始抽牌 默认先给1个用户发一张牌
for user in user_list:
    index = random.randint(0, len(total_poke_list) - 1)
    print("{}抽到的牌为:".format(user), total_poke_list[index])
    poke = total_poke_list.pop(index)
    value = poke[1]
    socer = 0
    if poke[1] >= 10:
        value = 0.5
    socer += value
    print(f'目前{user}的分数为{socer}')
    while True:
        choice = input(f'{user}请问是否继续要牌,需要输入y,不需要输入n')
        if choice.lower() == 'n':
            print(f'{user}玩家不要牌了,到下一个玩家')
            break
        if choice.lower() == 'y':
            index = random.randint(0, len(total_poke_list) - 1)
            print("{}抽到的牌为:".format(user), total_poke_list[index])
            poke = total_poke_list.pop(index)
            value = poke[1]
            if poke[1] >= 10:
                value = 0.5
            socer += value
            print(f'目前{user}的分数为{socer}')
            if socer > 11:
                print(f'{user}玩家爆掉了')
                socer = 0
                break
    result[user] = socer
print(result)
8.
dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]}

# 请在字典中添加一个键值对,"k4": "v4",输出添加后的字典
# 请在修改字典中 "k1" 对应的值为 "alex",输出修改后的字典
# 请在k3对应的值中追加一个元素 44,输出修改后的字典
# 请在k3对应的值的第 1 个位置插入个元素 18,输出修改后的字典
solution:
dic['k4'] = 'v4'
print(dic)
dic['k1'] = 'alex'
print(dic)
dic['k3'].append(44)
print(dic)
dic['k3'].insert(0,18)
print(dic)
9.
dic1 = {
 'name':['alex',2,3,5],
 'job':'teacher',
 'oldboy':{'alex':['python1','python2',100]}
}

# 1,将name对应的列表追加⼀个元素’wusir’。
# 2,将name对应的列表中的alex全变成大写。
# 3,oldboy对应的字典加⼀个键值对’⽼男孩’:’linux’。
# 4,将oldboy对应的字典中的alex对应的列表中的python2删除
solution:
dic1['name'].append('wusir')
print(dic1)
b = dic1['name'][0].swapcase()
dic1['name'][0] = b
print(dic1)
dic1['oldboy']['老男孩'] = 'linux'
print(dic1)
del dic1['oldboy']['alex'][1]
print(dic1)
10.
例如:用户输入 x1|wupeiqi ,则需要再字典中添加键值对 {'x1':"wupeiqi"}
d1 = {}
while True:
    data = input('请输入信息:')
    a = data.split('|')
    if data.upper() == 'N':
        break
    d1[a[0]] = a[1]
print(d1)

# 获取用户输入并打印成下列格式
# 	 ------------ info of Jason -----------
#     Name : Jason
#     Age  : 18
#     Sex  : male
#     Job  : Teacher
#     ---------------- end -----------------
# name = input('请输入您的名字:')   # 获取用户输入
# age = input('请输入您的年龄:')
# sex = input('请输入您的性别')
# job = input('请输入您的工作')
# print(f'''------------ info of {name} -----------\nName : {name}\nAge  : {age}\nSex  : {sex}\nJob  : {job}\n---------------- end -----------------''')
# 用展位符{}和f 方法个格式化输出用户输入信息。 主要是占位符 换行的运用
# 准备说出下列变量名v绑定的结果
# v1 = 1 or 3  # 1
# v2 = 1 and 3 # 3
# v3 = 0 and 2 and 1  # 0
# v4 = 0 and 2 or 1   # 1
# v5 = 0 and 2 or 1 or 4 # 1
# # 错题:v # 0   or 逻辑运算应该看左边第一个数值 如果数值为真 那么 右边的条件就不需要判断了 如果 数值为假 那么 取后面的值就可以了
# v6 = 0 or False and 1
# print(v1,v2,v3,v4,v5,v6)
# 1.根据用户输入内容打印其权限
#     '''
#     jason --> 超级管理员
#     tom  --> 普通管理员
#     jack,rain --> 业务主管
#     其他 --> 普通用户
#     '''
# data = input('请输入用户名')
# if data == 'jason':
#     print('超级管理员')
# elif data == 'tom':
#     print('普通管理员')
# elif data == 'jack' or data == 'rain':  # jack等于用户输入或者rain等于用户输入都可以执行elif下面子代码
#     print('业务主管')
# else:
#     print('普通用户')

# 编写用户登录程序
#  要求:有用户黑名单 如果用户名在黑名单内 则拒绝登录
#     eg:black_user_list = ['jason','kevin','tony']
#  如果用户名是黑名单以外的用户则允许登录(判断用户名和密码>>>:自定义)
#     eg: oscar 123
# black_user_list = ['jason','kevin','tony']
# data = input('请输入用户名:')
# # 获取用户输入
# if data not in black_user_list:   # 如果用户输入用户名不在黑名单里
#     password = input('请输入密码:')
#     if password == '123':  # 判断密码是否正确
#         print('登录成功')
#     else:
#         print('密码错误,请重新输入') # 由于我们前面是有了判断,必须用户名不在黑名单,才可以继续往下进行判断
# else:
#     print('您已被拉黑,请联系客服')  # 如果在黑面单里 那么不需要在做判断,直接打印拉黑信息
# 编写用户登录程序
#  用户如果登录失败 则只能尝试三次
#  用户如果登录成功 则直接结束程序
# count = 0  # 设置一个计数器 为0 用来判断用户输入次数
# while True:
#     user = input('请输入用户名:')
#     data = input('请输入密码:')
#     if user == 'jason' and data == '123':
#         print('登录成功')
#         break   # 如果登录成功就结束循环
#     else:
#         count += 1
#         print(f'用户名或密码输入错误,您剩{3-count}次机会')  # 如果输错一次那么就 打印剩余机会次数
#         if count == 3:
#             print('程序结束')
#             break
# 4.猜年龄的游戏
#  假设用户的真实年龄是18 编写一个猜年龄的游戏 获取用户猜测的年龄
#  基本要求:可以无限制猜测 每次猜错给出提示(猜大了 猜小了) 猜对则结束程序
#  拔高练习:每次猜测只有三次机会 一旦用完则提示用户是否继续尝试 用户通过输入n或者y来表示是否继续尝试 如果是y则继续给用户三次猜测机会 否则结束程序
# age = 18
# count = 0
# while True:
#     choose_age = input('请输入您想猜的数字:')
#     if int(choose_age) == 18:
#         print('猜对了')
#         break
#     elif int(choose_age) < 18:
#         count += 1
#         print(f'猜小了,您还剩{3-count}次机会')
#     elif int(choose_age) > 18:
#         count += 1
#         print(f'猜大了,您还剩{3-count}次机会')
#     if count == 3:
#         choice = input('请选择是否继续猜,Y继续N退出')
#         if choice.upper() == 'Y':
#             count = 0
#             continue
#         if choice.upper() == 'N':
#             print('程序结束')
#             break
# 3.计算1-100所有的数之和
# count = 0
# for i in range(101):  # 遍历 1-100
#     count += i  # 计数器 = 计数器 + i(动态的100)
# print(count)

# 2.判断列表中数字2出现的次数
# count = 0
# l1 = [11, 2, 3, 2, 2, 1, 2, 1, 2, 3, 2, 3, 2, 3, 4, 3, 2, 3, 2, 2, 2, 2, 3, 2]
# for i in l1:  # 遍历l1列表
#     if i == 2:  # 如果 动态的i == 2 那么计数器+1  当遍历完整个列表后 count的次数就是2出现的次数
#         count += 1
# print(count)
# 3.编写代码自动生成所有页网址(注意总共多少页)
# 	https://movie.douban.com/top250
# for data in range(250):
#     if data % 25 == 0:  # 因为每页的等差值/步长为25 所以 第一页为0 依次类推
#         print(f'https://movie.douban.com/top250?start={data}&filter=')


#     # 我们知道每个页面和每个页面的等差值为25,那么一共250页我们就可计算出来它的值的范围
#     count = (25 * 10)
#     # 通过占位符 先写好模板准备替换关键数据
#     data = 'https://movie.douban.com/top250?start=%s&filter='
#     for i in range(0, count, 25):  # 进入循环
#         print(data % i)  # 输出数据内容
# 4.编写代码打印出下列图形(ps:for循环嵌套)
# *****
# *****
# *****
# *****
# l1 = '*'
# for i in range(4):
#     for b in range(4):
#         print(l1, end='')
#     print(l1)


# 2.基于字符串充当数据库完成用户登录(基础练习)
# data_source = 'jason|123'  # 一个用户数据
# #    获取用户用户名和密码 将上述数据拆分校验用户信息是否正确
# data = input('请输入用户名')
# pwd = input('请输入密码')
# data1 = data_source.split('|')   # 管道符分割 字符串 两个数据组成列表
# if data == data1[0] and pwd == data1[1]:   # 通过索引判断值是否与用户输入的值相等
#     print('登录成功')
# else:
#     print('输入错误')
# 3.基于列表充当数据库完成用户登录(拔高练习)  # 多个用户数据
# data_source = ['jason|123', 'kevin|321','oscar|222']
# data1 = input('请输入用户名')
# pwd = input('请输入密码')
# for i in data_source:
#     data = i.split('|')
#     if data[0] == data1 and data[1] == pwd:
#         print('登录成功')
#         break
# else:
#     print('输入错误,请重新输入')
# 2.去重下列列表并保留数据值原来的顺序
# 	eg: [1,2,3,2,1] 去重之后 [1,2,3]
# l1 = [2, 3, 2, 1, 2, 3, 2, 3, 4, 3, 4, 3, 2, 3, 5, 6, 5]
# l2 = []  # 建立一个空集合 存储l1的数据
# for i in l1:  遍历l1中的所有数据值
#     if i not in l2:  # 为了判断重复的值在不在 l2列表中
#         l2.append(i)  # 所以 不重复的i就添加进入l2
# print(l2)
# pythons={'jason','oscar','kevin','ricky','gangdan','biubiu'}
# linuxs={'kermit','tony','gangdan'}
#   1. 求出即报名python又报名linux课程的学员名字集合
#   2. 求出所有报名的学生名字集合
#   3. 求出只报名python课程的学员名字
#   4. 求出没有同时这两门课程的学员名字集合
# print(pythons & linuxs)  # & 是求两个集合共同出现的数据值
# print(pythons | linuxs)  # | 求两个集合共同有的 数据值
# print(pythons - linuxs)  # - 用一个集合减去另一个集合 剩下的就是他独有的值
# print(pythons ^ linuxs)  # ^ 求集合交集之外的所有数据值
# 4.统计列表中每个数据值出现的次数并组织成字典战士
# eg: l1 = ['jason','jason','kevin','oscar']
# 结果:{'jason':2,'kevin':1,'oscar':1}
# 真实数据
# l1 = ['jason','jason','kevin','oscar','kevin','tony','kevin']
# l2 = []
# d1 = {}
# for i in l1:
#     if i not in l2:
#         l2.append(i)
#     for b in l2:
#         count = l1.count(b)
#         d1[b] = count
# print(d1)
# 4.利用列表编写一个员工姓名管理系统
#     输入1执行添加用户名功能
#     输入2执行查看所有用户名功能
#     输入3执行删除指定用户名功能
#     '''分析 用户输入的不同 可以执行不同的代码'''
#     ps: 思考如何让程序循环起来并且可以根据不同指令执行不同操作
#     提示: 循环结构 + 分支结构
# 拔高: 是否可以换成字典或者数据的嵌套使用完成更加完善的员工管理而不是简简单单的一个用户名(能写就写不会没有关系)


notice = True
user_data_list = []  # 定义空列表 主要为了登录成功后 查看所有用户名的功能 只显示用户名不显示 密码
user_data_dict = {}  # 定义空字典 主要为了登录成功后 记录新增用户以及删除用户数据的
admin_data = {'随风': 4897}  # 自定义管理员,它的权限比员工多
login_count = 0  # 计数器 ,密码输入错误3次后 结束程序
common_data = {}
while notice:
    print('欢迎使用随风出品员工登录管理系统,请先注册/登录!')
    login_choice = input('请输入序号\n1.注册\n2.登录\n请输入您的选择:')
    if int(login_choice) == 1:
        common_name = input('请输入需要注册的用户名:')
        common_password = input('请输入需要注册的密码(仅限数字)')
        common_data[common_name] = common_password
        print(f'恭喜,{common_name}注册成功')
    elif int(login_choice) == 2:
        login_name = input('请输入登录用户名')
        login_password = input('请输入登录密码')
        if login_name in common_data and login_password == common_data[login_name]:
            choice_login = input('输入Q进入员工模式/输入M进入管理者模式')  # 获取用户输入Q/M 选择模式
            if choice_login.upper() == 'M':  # 如果是M 就往下进行
                admin_username = input('请输入管理者用户名>>>>>:')
                admin_password = input('请输入管理者密码:')
                if admin_username in admin_data and int(admin_password) == admin_data[admin_username]:  # 判断用户输入的用户名是不是在管理员内,判断用户输入密码是否等于管理员字典内的值
                    print(f'欢迎{admin_username}进入管理者模式,请根据选项编号选择您要执行的操作')
                    while notice:  # 做一个循环 让管理员重复选取功能编号
                        choice = input(
                            '     请输入选项编号\n  1.  添加用户名\n  2.  查看所有用户名\n  3.  删除指定员工\n  4.  退出程序并回到登录界面\n  5.修改指定员工信息\n       >>>>>>>>')
                        if choice.strip() == '1':
                            user_name = input('请输入用户名>>>>>:')
                            if user_name in user_data_list:  # 如果 用户名已经在存储用户名的列表中 结束本次循环进入while条件判断处
                                print('用户名已存在,请重新输入')
                                continue
                            user_password = input('请输入密码:>>>>>')
                            user_data_dict[user_name] = user_password  # 在用户存储信息字典中添加 用户输入的账户以及密码
                            user_data_list.append(user_name)  # 把用户输入的用户名添加到用户列表中
                            print(f'成功!用户{user_name}已经添加到系统中')
                        elif choice.strip() == '2':
                            print(f'已经为您展示出已有用户名信息:\n{user_data_list}')  # 打印用户列表信息
                        elif choice.strip() == '3':
                            choice_del = input('请输入您想要删除的用户名>>>>>:')
                            if choice_del not in user_data_dict:  # 判断输入的数据在不在字典中
                                print(f'您输入的{choice_del}不在系统中!请重新输入')
                            else:
                                user_data_dict.pop(choice_del)  # 移除存储用户信息字典中的 数据
                                user_data_list.remove(choice_del)  # 移除存储用户信息列表中的 数据
                                print(f'用户{choice_del}已从系统中移除')
                        elif choice.strip() == '4':
                            print('已退出管理员登录界面')
                            break  # 结束循环
                        elif choice.strip() == '5':
                            re_name = input('请输入原有需要修改的用户名:')
                            if re_name in user_data_list:
                                qe_name = input('请输入新用户用户名信息:')
                                qe_pwd = input('请输入新用户密码信息:')
                                user_data_list.remove(re_name)
                                user_data_list.append(qe_name)
                                user_data_dict.pop(re_name)
                                user_data_dict[qe_name] = qe_pwd
                                print(f'亲爱的{qe_name}您好,用户名以及密码已修改成功')
                            else:
                                print('没有此用户,请重新输入')
                                continue
                        else:
                            print('进入选项失败,请输入对应的选项编号(数字)')
                    else:
                        login_count += 1  # 如果输入选项之外的数字,计数器+1
                        print(f'用户名或密码输入错误,您还有{3 - login_count}次机会,请重新输入')
                        if login_count == 3:  # 如果计数器次数 = 3次 结束运行
                            print('您已经输入错误三次,结束运行')
                            break
                        continue
                else:
                    print('22')
            if choice_login.upper() == 'Q':
                print('欢迎您进入员工模式,您的权限为/添加员工信息/查看员工信息')
                while notice:
                    choice = input('     请输入选项编号\n  1.  添加用户名\n  2.  查看所有用户名\n 3.  退出程序并回到登录界面\n  >>>>>>>>')
                    if choice.strip() == '1':
                        user_name = input('请输入用户名>>>>>:')
                        if user_name in user_data_list:
                            print('用户名已存在,请重新输入')
                            continue
                        user_password = input('请输入密码:>>>>>')
                        user_data_dict[user_name] = user_password
                        user_data_list.append(user_name)
                        print(f'成功!用户{user_name}已经添加到系统中')
                    elif choice.strip() == '2':
                        print(f'已经为您展示出已有用户名信息:\n{user_data_list}')
                    elif choice.strip() == '3':
                        print('已退出员工管理界面')
                        break
                    else:
                        print('进入选项失败,请输入对应的选项编号(数字)')
                else:
                    login_count += 1
                    print(f'用户名或密码输入错误,您还有{3 - login_count}次机会,请重新输入')
                    if login_count == 3:
                        print('您已经输入错误三次,结束运行')
                        break
    else:
        print('请输入数字编号进行选择')
        continue
posted @ 2022-10-03 16:23  dd随风  阅读(42)  评论(0编辑  收藏  举报