练习题
1.常用知识点
1.用户交互
获取用户输入:username = input('请输入您的用户名>>>:')
输出用户输入:print('')
2.格式化输出
'''
2.利⽤for循环及range⽅法⾃动⽣成链家⼆⼿房多⻚数据⽹址(⼗条以上即可)
初始⽹址:https://sh.lianjia.com/ershoufang/
'''
# 第一种方式
base_url = 'https://sh.lianjia.com/ershoufang/pg%s'
for i in range(1,101):
print(base_url % i)
#第二种方式
for i in range(1,101):
print(f'https://sh.lianjia.com/ershoufang/pg{i}')
3.解压赋值 #
name_list = ['almira', 'nina', 'lina', 'linda']
name1, name2, name3, name4 = name_list
print(name4)
2.循环结构
1.单if分支结构
语法结构:
if 条件:
条件成立之后执行的子代码
eg:
username = input('username>>>:')
if username == 'almira':
print('加油加油')
2.if...else...分支结构
语法结果:
if 条件:
条件成立之后执行的子代码
else:
条件不成立的时候执行的子代码
eg:
username = input('username>>>:')
if username == 'almira':
print('come on u can do it')
else:
print('滚犊子')
3.if...elif...else...分支结构
语法结构:
if 条件1:
条件1成立之后执行的子代码
elif 条件2:
条件1不成立 条件2成立执行的子代码
elif 条件3:
条件1和2都不成立 条件3成立执行的子代码
else:
上述条件都不成立 执行的子代码
ps:中间的elif可以写多个、上述子代码永远只会走一个
eg:
score = input('Please enter the student score>>>:')
score = int(score) # 将字符串的整数转换成整型
if score >= 90:
print('excellent')
elif 60 < score:
print('good')
else:
print('good good study,day day up!')
4.嵌套分支结构
age = 24
height = 162
weight = 45
is_beautiful = True
is_success = True
username = input('username>>>:')
if username == 'tony':
print('tony fined the target ')
if age < 24 and height > 160 and weight < 50 and is_beautiful:
print('can I have ur wechat plz?')
if is_success:
print('ok')
else:
print('go away u jerk')
else:
print('sry wrong person')
else:
print('game over')
3.while循环 for循环 range方法
name_list = ['almira', 'lili', 'linda', 'judy']
count = 0
while count < 4:
print(name_list[count])
count += 1
name_list = ['almira', 'lili', 'linda', 'judy']
for i in name_list:
print(i)
for i in range(101): # 起始位置为0 终止位置为100
print(i) # [0,.......100]
for i in range(10, 20): # 第一个为起始位置 第二个终止位置
print(i)
for i in range(1, 20, 2): # 第三个数为等差值 默认不写为1
print(i)
第一次作业
# 附加练习题(提示:一步步拆解)
# 1.想办法打印出jason
l1 = [11,
22,
'kevin',
['tony',
'jerry',
[123,
456,
'jason']
]
]
'''分步操作'''
# 1.先看大列表到底有几个数据值 以及我们想要的数据值在哪个里面
# print(l1[3])
l2 = l1[3] # ['tony', 'jerry', [123, 456, 'jason']]
# 2.再次思考小列表有几个数据值 以及我们想要的数据值在哪个里面
# print(l2[2])
l3 = l2[2] # [123, 456, 'jason']
# 3.最后转化成了简单的索引直接取值
print(l3[2])
'''简化操作'''
print(l1[3][2][2])
# 2.想办法打印出大宝贝
d1 = {'name': 'jason',
'others': {'a1': 'heiheihei',
'a2': {'k1': 'hahaha',
'k2': 'hehehe',
'k3': '大宝贝'}
}
}
'''分步操作'''
# 1.先拿大字典第二个键值对的值
# print(d1['others'])
d2 = d1['others'] # {'a1': 'heiheihei', 'a2': {'k1': 'hahaha', 'k2': 'hehehe', 'k3': '大宝贝'}}
# 2.再拿小字典第二个键值对的值
# print(d2['a2'])
d3 = d2['a2']
# 3.转化成简单的按k直接取值
print(d3['k3'])
'''简化操作'''
print(d1['others']['a2']['k3'])
# 3.想办法打印出run
data = {'username': 'jason',
'hobby': [11,
22,
{'height': 183,
'hobby': ['read',
'run',
'music'
]
}
]
}
'''分步操作'''
# print(data['hobby'])
data1 = data['hobby'] # [11, 22, {'height': 183, 'hobby': ['read', 'run', 'music']}]
# print(data1[2])
data2 = data1[2] # {'height': 183, 'hobby': ['read', 'run', 'music']}
# print(data2['hobby'])
data3 = data2['hobby']
print(data3[1])
'''简化操作'''
print(data['hobby'][2]['hobby'][1])
第二次作业
1.获取用户输入并打印成下列格式
------------ info of Jason -----------
Name : Jason
Age : 18
Sex : male
Job : Teacher
---------------- end -----------------
# 1.先制定一个打印的模板
info_demo = """
------------ info of %s -------------
Name : %s
Age : %s
Job : %s
---------------- end -----------------
"""
# 2.获取用户输入
username = input('username>>>:')
age = input('age>>>:')
job = input('job>>>:')
# 3.格式化输出
print(info_demo % (username, username, age, job))
2.准备说出下列变量名v绑定的结果
v1 = 1 or 3
v2 = 1 and 3
v3 = 0 and 2 and 1
v4 = 0 and 2 or 1
v5 = 0 and 2 or 1 or 4
v6 = 0 or False and 1
第三次作业
1.根据用户输入内容打印其权限
'''
jason --> 超级管理员
tom --> 普通管理员
jack,rain --> 业务主管
其他 --> 普通用户
'''
# 1.获取用户输入的用户名
username = input('请输入您的用户名>>>:')
# 2.判断用户名 打印不同的提示>>>:不同的条件执行不同的代码 那么需要使用分支结构
if username == 'jason':
print('超级管理员')
elif username == 'tom':
print('普通管理员')
# elif username == 'jack' or 'rain': # 错误写法
# elif username == 'jack' or username == 'rain': # 正确写法
elif username in ['jack', 'rain']: # 正确写法
print('业务主管')
else:
print('普通用户')
2.编写用户登录程序
要求:有用户黑名单 如果用户名在黑名单内 则拒绝登录
eg:black_user_list = ['jason','kevin','tony']
如果用户名是黑名单以外的用户则允许登录(判断用户名和密码>>>:自定义)
eg: oscar 123
3.编写用户登录程序
用户如果登录失败 则只能尝试三次
用户如果登录成功 则直接结束程序
# 4.定义一个计数器
count_num = 1
while True:
# 6.先判断当前尝试了几次
if count_num == 4:
print('很抱歉 您已经尝试了三次')
break
# 1.获取用户数据
username = input('username>>>:')
password = input('password>>>:')
# 2.校验数据是否正确
if username == 'jason' and password == '123':
print('登录成功')
break # 3.结束循环体代码
else:
print('用户名或密码错误')
# 5.每错误一次就让计数器自增1
count_num += 1
4.猜年龄的游戏
假设用户的真实年龄是18 编写一个猜年龄的游戏 获取用户猜测的年龄
基本要求:可以无限制猜测 每次猜错给出提示(猜大了 猜小了) 猜对则结束程序
拔高练习:每次猜测只有三次机会 一旦用完则提示用户是否继续尝试 用户通过输入n或者y来表示是否继续尝试 如果是y则继续给用户三次猜测机会 否则结束程序
# 1.先定义用户的真实年龄
real_age = 18
# 8.定义计数器
count_num = 1
# 6.添加循环结构
while True:
# 10.判断当前尝试的次数
if count_num == 4:
choice = input('您已经尝试了三次 是否继续尝试(n/y)>>>:')
# 11.判断用户输入的选择
if choice == 'y':
# 12.重置计数器
count_num = 1
else:
print('下次再来玩哟')
break
# 2.获取用户猜测的年龄
guess_age = input('你猜一猜我的年龄 好不好呀>>>:')
# 3.由于一会儿需要比较大小 所以要将用户输入的字符串年龄转成整型的年龄
guess_age = int(guess_age) # 有小bug 暂时不考虑
# 4.判断年龄是否猜测正确
if guess_age > real_age:
print('你这小伙子 真讨厌 人家有那么大吗')
# 猜测错了 计时器加一
count_num += 1
elif guess_age < real_age:
print('哎呀 你真讨厌 人家也没那么小啦')
# 猜测错了 计时器加一
count_num += 1
else:
print('你真棒 猜对了 嘿嘿嘿')
# 7.猜对了 直接结束循环
break
"""
1.先写注释(思维逻辑和想法)
2.先考虑主题功能 再考虑附加功能
"""
第四次作业
1.计算1-100所有的数之和
all_num = 0
for i in range(1, 101):
all_num += i
print(all_num)
2.判断列表中数字2出现的次数
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]
# 1.先定义一个记录数字2出现次数的计数器
count_num = 0
# 2.循环获取列表中每一个数据值判断是不是数字2
for i in l1:
# 3.如果i绑定的数据值是2 则让计数器自增1
if i == 2:
count_num += 1
# 4.等待for循环运行结束 打印计数器
print(count_num)
3.编写代码自动生成所有页网址(注意总共多少页)
https://movie.douban.com/top250?start=0&filter=
https://movie.douban.com/top250?start=25&filter=
https://movie.douban.com/top250?start=50&filter=
base_url = 'https://movie.douban.com/top250?start=%s&filter='
for i in range(0, 250, 25):
print(base_url % i)
4.编写代码打印出下列图形(ps:for循环嵌套)
*****
*****
*****
*****
for i in range(4): # 0 1 2 3 4次 4行
for j in range(5): # 0 1 2 3 4 5次 5列
print('*', end='')
print() # 内存循环结束 换行
'''
补充debug调试模式(程序员后期找bug必备工具)
'''
第五次作业
1.基于字符串充当数据库完成用户登录(基础练习)
data_source = 'jason|123' # 一个用户数据
获取用户用户名和密码 将上述数据拆分校验用户信息是否正确
# 定义用户真实数据
data_source = 'jason|123'
# 1.获取用户名和密码
username = input('username>>>:').strip()
password = input('password>>>>:').strip()
# 2.切割字符串 获取真实用户名和密码
real_name, real_pwd = data_source.split('|')
# 3.校验用户名和密码是否正确
if username == real_name and password == real_pwd:
print('登录成功')
else:
print('用户名或密码错误')
2.基于列表充当数据库完成用户登录(拔高练习) # 多个用户数据
data_source = ['jason|123', 'kevin|321','oscar|222']
data_source = ['jason|123', 'kevin|321', 'oscar|222']
# 1.先获取用户输入的用户名和密码
username = input('username>>>:').strip()
password = input('password>>>>:').strip()
# 2.循环获取列表中每一个真实数据
for data in data_source: # 'jason|123' 'kevin|321'
real_name, real_pwd = data.split('|') # jason 123
if username == real_name and password == real_pwd:
print('登录成功')
break
else:
print('用户名或密码错误')
data_source = ['jason|123', 'kevin|321', 'oscar|222']
username = input('username>>>:').strip()
password = input('password>>>:').strip()
user_data = f'{username}|{password}' # username + '|' + password
if user_data in data_source:
print('登录成功')
else:
print('用户名或密码错误')
3.利用列表编写一个员工姓名管理系统
输入1执行添加用户名功能
输入2执行查看所有用户名功能
输入3执行删除指定用户名功能
'''分析 用户输入的不同 可以执行不同的代码'''
ps: 思考如何让程序循环起来并且可以根据不同指令执行不同操作
提示: 循环结构 + 分支结构
# 1.先定义一个专门存储用户名的列表
data_list = []
# 2.添加循环结构
while True:
# 3.先打印项目功能 供用户选择
print("""
1.添加用户
2.查看用户
3.删除用户
""")
# 4.获取用户想要执行的功能编号
choice_num = input('请输入您想要执行的功能编号>>>:').strip()
# 5.根据不同的功能编号执行不同的分支代码
if choice_num == '1':
# 6.获取用户输入的用户名
username = input('请输入您的用户名>>>:').strip()
# 7.判断当前用户名是否已存在
if username in data_list:
print('用户名已存在')
else:
# 8.列表添加用户名
data_list.append(username)
print(f'用户名{username}添加成功')
elif choice_num == '2':
# 9.循环打印每一个用户数据
for name in data_list:
print(
f"""
------------user info---------
用户名:{name}
------------------------------
""")
elif choice_num == '3':
# 10.获取用户想要删除的用户名
delete_username = input('请输入您想要删除的用户名>>>:').strip()
# 11.先判断用户名是否存在
if delete_username in data_list:
data_list.remove(delete_username)
print(f'用户名{delete_username}删除成功')
else:
print('你个傻帽 用户名不存在 删毛线啊!!!')
else:
print('很抱歉 暂时没有您想要执行的功能编号')
第六次作业
1.优化员工管理系统
拔高: 是否可以换成字典或者数据的嵌套使用完成更加完善的员工管理而不是简简单单的一个用户名(能写就写不会没有关系)
员工的信息有:用户名 年龄 岗位 薪资...
员工管理系统:注册、查看(单个员工、所有员工)、修改薪资、删除员工
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]
3.有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
pythons={'jason','oscar','kevin','ricky','gangdan','biubiu'}
linuxs={'kermit','tony','gangdan'}
1. 求出即报名python又报名linux课程的学员名字集合
2. 求出所有报名的学生名字集合
3. 求出只报名python课程的学员名字
4. 求出没有同时这两门课程的学员名字集合
4.统计列表中每个数据值出现的次数并组织成字典战士
eg: l1 = ['jason','jason','kevin','oscar']
结果:{'jason':2,'kevin':1,'oscar':1}
真实数据
l1 = ['jason','jason','kevin','oscar','kevin','tony','kevin']
# 2.定义一个存储所有员工信息的字典
# user_data_dict = {} # {'编号':用户字典, '编号':用户字典}
'''
数据存储的方式1
{
'jason':[18, 'teacher', 10],
'kevin':[28, 'sale', 90]
}
数据存储的方式2
{
'jason':{'age':18, 'job':'teacher', 'salary':8000},
'kevin':{'age':28, 'job':'sale', 'salary':9000}
}
数据存储的方式3
{
'1':{'name':'jason','age':18, 'job':'teacher', 'salary':8000},
'2':{'name':'kevin','age':28, 'job':'sale', 'salary':9000},
'3':{'name':'jason','age':18, 'job':'teacher', 'salary':8000},
}
'''
# 1.先搭建系统骨架
# while True:
# print("""
# 1.创建员工信息
# 2.查看单个员工
# 3.查看所有员工
# 4.修改员工薪资
# 5.删除员工信息
# """)
# choice = input('请选择您想要执行的功能编号>>>:').strip()
# if choice == '1':
# while True:
# # 1.获取员工编号
# emp_id = input('请输入该员工的员工编号(q)>>>:').strip()
# if emp_id == 'q':
# break
# # 判断编号是否是纯数字
# if not emp_id.isdigit():
# print('员工编号必须是纯数字')
# continue
# # 2.判断员工编号是否已存在
# if emp_id in user_data_dict:
# print('员工编号已存在 请重新录入')
# continue
# # 3.获取员工详细信息
# username = input('请输入员工姓名>>>:').strip()
# age = input('请输入员工年龄>>>:').strip()
# job = input('请输入员工岗位>>>:').strip()
# salary = input('请输入员工薪资>>>:').strip()
# # 4.构建一个临时的小字典
# temp_dict = {}
# # 5.添加员工信息键值对
# temp_dict['emp_id'] = emp_id
# temp_dict['name'] = username
# temp_dict['age'] = age
# temp_dict['job'] = job
# temp_dict['salary'] = salary
# # 6.添加到大字典中
# user_data_dict[emp_id] = temp_dict
# print(f'员工{username}添加成功')
# elif choice == '2':
# while True:
# # 1.先获取员工编号
# target_id = input('请输入您想要查看的员工编号(q)>>>:').strip()
# if target_id == 'q':
# break
# # 2.判断员工编号是否不存在
# if target_id not in user_data_dict:
# print('员工编号不存在 无法查看')
# continue
# # 3.根据员工编号获取员工字典数据
# user_dict = user_data_dict.get(target_id)
# # 4.格式化输出
# print(f"""
# --------------info of emp-------------------
# 编号:{user_dict.get('emp_id')}
# 姓名:{user_dict.get('name')}
# 年龄:{user_dict.get('age')}
# 岗位:{user_dict.get('job')}
# 薪资:{user_dict.get('salary')}
# --------------------------------------------
# """)
# elif choice == '3':
# for user_dict in user_data_dict.values():
# print(f"""
# --------------info of emp-------------------
# 编号:{user_dict.get('emp_id')}
# 姓名:{user_dict.get('name')}
# 年龄:{user_dict.get('age')}
# 岗位:{user_dict.get('job')}
# 薪资:{user_dict.get('salary')}
# --------------------------------------------
# """)
# elif choice == '4':
# while True:
# # 1.先获取想要修改的员工编号
# target_id = input('请输入您想要修改的员工编号(q)>>>:').strip()
# if target_id == 'q':
# break
# if target_id not in user_data_dict:
# print('员工编号不存在')
# continue
# # 2.获取新的薪资
# new_salary = input('请输入该员工的新薪资待遇>>>:').strip()
# if not new_salary.isdigit():
# print('薪资只能是纯数字')
# continue
# # 3.获取员工字典
# user_dict = user_data_dict.get(target_id) # {'salary':123}
# # 4.修改字典中的薪资
# user_dict['salary'] = new_salary # {'salary': 321}
# # 5.修改大字典
# user_data_dict[target_id] = user_dict
# print(user_data_dict.get(target_id))
# elif choice == '5':
# while True:
# # 1.先获取想要修改的员工编号
# target_id = input('请输入您想要删除的员工编号(q)>>>:').strip()
# if target_id == 'q':
# break
# if target_id not in user_data_dict:
# print('员工编号不存在')
# continue
# # 2.字典删除键值对
# user_data_dict.pop(target_id)
# 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]
# 不考虑顺序的情况下 去重
# s1 = set(l1)
# l2 = list(s1)
# print(l2)
# 考虑顺序
# new_list = []
# for i in l1:
# if i not in new_list:
# new_list.append(i)
# print(new_list)
# 3.有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
# pythons={'jason','oscar','kevin','ricky','gangdan','biubiu'}
# linuxs={'kermit','tony','gangdan'}
# 1. 求出即报名python又报名linux课程的学员名字集合
# 2. 求出所有报名的学生名字集合
# 3. 求出只报名python课程的学员名字
# 4. 求出没有同时这两门课程的学员名字集合
# pythons = {'jason', 'oscar', 'kevin', 'ricky', 'gangdan', 'biubiu'}
# linuxs = {'kermit', 'tony', 'gangdan'}
# 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']
# 1.先定义结果集空字典
data_dict = {}
# 2.循环列表中每一个数据值
for name in l1: # 'jason' 'kevin'
# 3.判断当前数据值是否在字典的k中
if name not in data_dict: # {'jason':1}
data_dict[name] = 1
else:
data_dict[name] += 1
# data_dict[name] = data_dict.get(name) + 1
print(data_dict)
第七次作业
1.编写简易版本的拷贝工具
自己输入想要拷贝的数据路径 自己输入拷贝到哪个地方的目标路径
任何类型数据皆可拷贝
ps:个别电脑C盘文件由于权限问题可能无法拷贝 换其他盘尝试即可
1.获取想要拷贝的文件路径
source_file_path = input('请输入您想要拷贝的文件路径>>>:').strip()
2.获取目标文件的路径
target_file_path = input('请输入您想要拷贝到哪个地方的路径>>>:').strip()
3.打开第一个文件路径 读取内容写入第二个文件路径中
with open(r'%s' % source_file_path, 'rb') as read_f, open(r'%s' % target_file_path, 'wb') as write_f:
for line in read_f:
write_f.write(line)
2.利用文件充当数据库编写用户登录、注册功能
文件名称:userinfo.txt
基础要求:
用户注册功能>>>:文件内添加用户数据(用户名、密码等)
用户登录功能>>>:读取文件内用户数据做校验
ps:上述功能只需要实现一次就算过关(单用户) 文件内始终就一个用户信息
拔高要求:
用户可以连续注册
用户可以多账号切换登录(多用户) 文件内有多个用户信息
ps:思考多用户数据情况下如何组织文件内数据结构较为简单
提示:本质其实就是昨天作业的第二道题 只不过数据库由数据类型变成文件
while True:
print("""
1.注册功能
2.登录功能
""")
choice = input('请选择您想要执行的功能编号>>>:').strip()
if choice == '1':
username = input('please input your username>>>:').strip()
password = input('please input your password>>>:').strip()
# 2.校验用户名是否已存在
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
for line in f: # 'jason|123'
real_name, real_pwd = line.split('|')
if username == real_name:
print('用户名已存在 无法完成注册')
break # 一旦重复 没有必要继续往下校验是否重复了 直接结束循环
else:
with open(r'userinfo.txt', 'a', encoding='utf8') as f1:
f1.write(f'{username}|{password}\n')
print(f'用户{username}注册成功')
elif choice == '2':
# 1.获取用户名和密码
username = input('please input your username>>>:').strip() # 'jason'
password = input('please input your password>>>:').strip() # '123'
# 2.打开文件读取内容并校验
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
for line in f: # 'jason|123\n'
real_name, real_pwd = line.split('|') # 'jason' '123\n'
if real_name == username and real_pwd.strip('\n') == password:
print('登录成功')
break
else:
print('用户名或密码错误')
else:
print('没有该功能编号')
第八次作业
'''由于只讲了一点点函数的知识 所以只需要你们封装成函数就行'''
# 伪代码:主要用于表达逻辑 执行起来可能没有功能甚至报错
def register():
注册相关代码
def login():
登录相关代码
while True:
print("""
1.注册功能
2.登录功能
""")
choice = input('>>>:').strip()
if choice == '1':
register()
elif choice == '2':
login()
else:
print('暂无该功能编号')
第九次作业
1.编写一个用户认证装饰器
函数:register login transfer withdraw
基本要求
执行每个函数的时候必须先校验身份 eg: jason 123
拔高练习(有点难度)
执行被装饰的函数 只要有一次认证成功 那么后续的校验都通过
提示:全局变量 记录当前用户是否认证
# 定义一个变量记录用户的登录状态
is_login = False
def login_auth(func_name):
def inner(*args, **kwargs):
global is_login
# 先判断全局名称空间中的变量名is_login绑定的值是否为True
if is_login:
res = func_name(*args, **kwargs)
return res
username = input('username>>>:').strip()
password = input('password>>>:').strip()
if username == 'jason' and password == '123':
# 将全局名称空间中记录用户登录状态的数据值该为True
is_login = True
res = func_name(*args, **kwargs)
return res
else:
print('用户名或密码错误无法执行函数')
return inner
@login_auth
def register():
print('注册功能')
@login_auth
def login():
print('登录功能')
@login_auth
def shopping():
print('购物功能')
register()
login()
shopping()
第十次作业
1.利用有参装饰器编写多种用户登录校验策略
# 1.利用有参装饰器编写多种用户登录校验策略
"""
1.直接写死的 jason 123
2.数据来源于列表 ['jason|123','kevin|321','tony|222']
3.数据来源于文件 jason|123\n tom|321\n
"""
def login_auth(condition):
def outer(func_name):
def inner(*args, **kwargs):
# 获取用户名和密码
username = input('username>>>:').strip()
password = input('password>>>:').strip()
# 判断校验的策略
if condition == 'absolute':
if username == 'jason' and password == '123':
res = func_name(*args, **kwargs)
return res
else:
print('用户名或密码错误')
elif condition == 'list_type':
user_list = ['jason|123', 'tony|321', 'kevin|222']
user_data = f'{username}|{password}'
if user_data in user_list:
res = func_name(*args, **kwargs)
return res
else:
print('用户名或密码错误')
elif condition == 'file_type':
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
for line in f:
real_name, real_pwd = line.split('|')
if real_name == username and real_pwd.strip('\n') == password:
res = func_name(*args, **kwargs)
return res
return inner
return outer
@login_auth('absolute')
def index(*args, **kwargs):
print('from index')
@login_auth('list_type')
def func(*args, **kwargs):
print('from func')
@login_auth('file_type')
def foo(*args, **kwargs):
print('from foo')
# index()
# func()
foo()
2.利用递归函数依次打印列表中每一个数据值
l1 = [1,[2,[3,[4,[5,[6,[7,[8,]]]]]]]]
# 2.利用递归函数依次打印列表中每一个数据值
l1 = [1,[2,[3,[4,[5,[6,[7,[8,]]]]]]]]
"""
1.for循环l1里面的数据值
2.如果是数字 则打印
3.如果是列表 则循环
4.for循环小列表里面的数据值
5.如果是数字 则打印
6.如果是列表 则循环
7.for循环小小列表里面的数据值
8.如果是数字 则打印
9.如果是列表 则循环
"""
# print(isinstance(123, int)) # 判断第一个数据值是不是属于第二个参数指定的数据类型
# print(isinstance(123, str)) # 判断第一个数据值是不是属于第二个参数指定的数据类型
def get_num(l1):
for i in l1: # 递归函数需要结束条件 这里巧在for循环接收到空的能够被for循环的数据时 自动不执行
if isinstance(i,int):
print(i)
else:
return get_num(i)
get_num(l1)
第十一次作业
有下列用户数据
user_data = {
'1': {'name': 'jason', 'pwd': '123', 'access': ['1', '2', '3']},
'2': {'name': 'kevin', 'pwd': '321', 'access': ['1', '2']},
'3': {'name': 'oscar', 'pwd': '222', 'access': ['1']}
}
并有三个函数
def func1():
pass
def func2():
pass
def func3():
pass
要求:调用上述三个函数的时候需要从user_data中校验用户身份是否正确
并获取当前登录用户拥有的可执行函数功能编号即键access对应的功能编号列表
func1是1、func2是2、func3是3
并且一旦用户登录成功之后后续函数的调用不再校验用户身份
请思考如何获取函数功能编号 如何校验用户身份 如何校验权限
ps:装饰器知识 附赠:实现上述主体功能即可 其他扩展优化功能可暂且不写
user_data = {
'1': {'name': 'jason', 'pwd': '123', 'access': ['1', '2', '3']},
'2': {'name': 'kevin', 'pwd': '321', 'access': ['1', '2']},
'3': {'name': 'oscar', 'pwd': '222', 'access': ['1']}
}
"""
1.先写模板
2.再写用户校验
3.记录用户登录状态
4.再考虑用户权限问题
"""
is_login = {
'login_status': False, # 记录用户是否登录
'user_access': None # 记录登录用户的权限
}
def login_auth(func_id):
def outer(func_name):
def inner(*args, **kwargs):
# 6.先校验用户是否登录
if is_login.get('login_status'):
# 8.也需要校验功能编号是否在当前登录的用户权限中
if func_id not in is_login.get('user_access'):
print(f'您没有功能编号为{func_id}的函数执行权限')
return
res = func_name(*args, **kwargs)
return res
# 1.先获取用户的编号
user_id = input('请输入您的编号>>>:').strip()
# 2.校验用户编号是否存在
if user_id not in user_data:
print('用户编号不存在 无法完成身份校验 请滚蛋!!!')
return
# 3.获取用户的用户名和密码
username = input('请输入您的用户名>>>:').strip()
password = input('请输入您的密码>>>:').strip()
# 4.获取用户编号对应的真实数据进行比对
user_dict = user_data.get(user_id)
if user_dict.get('name') == username and user_dict.get('pwd') == password:
# 5.登录成功之后修改字典中登录状态
is_login['login_status'] = True
# 6.记录当前登录用户的权限编号
is_login['user_access'] = user_dict.get('access')
# 7.校验当前函数编号是否在当前用户权限列表内
if func_id in user_dict.get('access'):
res = func_name(*args, **kwargs)
return res
else:
print(f'您没有功能编号为{func_id}的函数执行权限')
else:
print('用户名或密码错误')
return inner
return outer
@login_auth('1')
def func1():
print('from func1')
@login_auth('2')
def func2():
print('from func2')
@login_auth('3')
def func3():
print('from func3')
func1()
func2()
func3()