python--第十五课
昨日内容回顾
-
作业讲解
1.装饰器 2.递归函数
-
算法简介及二分法
算法:解决问题的方法 二分法:每次取一半 def get_middle(l1,target_num): if len(l1) == 0: print('找不到') return # 注意这个地方一定不要忘了return,不写就一直报错!!! middle_index = len(l1) // 2 if target_num > l1[middle_index]: right_l1 = l1[middle_index+1:] return get_middle(right_l1,target_num) elif target_num < l1[middle_index]: left_l1 = l1[:middle_index] return get_middle(left_l1,target_num) else: print('找到了')
-
三元表达式
二选一 数据值1 if 条件 else 数据值2
-
各种生成式
l1 = [i+'嘿' for i in 'hello' if i != 'h'] d1 = {i:j for i,j in enumerate('hello')} s1 = {i for i in 'hello'}
-
匿名函数
lambda 形参:返回值
-
重要内置函数
map 映射 max\min 最大最小值 reduce 传多个返回一个
今日内容概要
- 作业讲解
- 重要内置函数
- 常见内置函数
- 可迭代对象
- 迭代器对象
- for循环内部原理
- 异常处理
今日内容详细
作业讲解
有下列用户数据
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()
重要内置函数
# zip 拉链
l1 = [11, 22, 33, 44, 55]
l2 = ['jason', 'kevin', 'oscar', 'jerry', 'tony']
l3 = [1, 2, 3, 4, 5]
res = zip(l1, l2, l3)
print(list(res))
[(11, 'jason', 1), (22, 'kevin', 2), (33, 'oscar', 3), (44, 'jerry', 4), (55, 'tony', 5)]
l1 = [11, 22, 33]
l2 = ['jason', 'kevin', 'oscar', 'jerry', 'tony']
l3 = [1, 2, 3, 4]
res = zip(l1, l2, l3)
print(list(res))
[(11, 'jason', 1), (22, 'kevin', 2), (33, 'oscar', 3)]
.
# filter
# l1 = [11, 22, 33, 44, 55, 66, 77, 88]
# res = filter(lambda x: x > 40, l1)
# print(list(res))
# sorted
l1 = [21, 12, 53, 64, 76, 32, 11, 22]
res = sorted(l1)
print(res) # 默认升序
常见内置函数
# 1.abs() 绝对值
# print(abs(-100))
# print(abs(100))
# 2.all() 所有数据值对应的布尔值为True结果才是True 否则返回False
# print(all([0, 1, 2, 3]))
# print(all([1, 2, 3, True]))
# 3.any() 所有数据值对应的布尔值有一个为True结果就是True 否则返回False
# print(any([0, None, '', 1]))
# print(any([0, None, '']))
# 4.bin() oct() hex() int()
# 5.bytes() 转换成bytes类型
# s1 = '今天周五 内容也很简单'
# print(s1.encode('utf8'))
# print(bytes(s1, 'utf8'))
# 6.callable() 判断名字是否可以加括号调用
# name = 'jason'
# def index():
# print('from index')
# print(callable(name)) # False
# print(callable(index)) # True
# 7.chr() ord() 基于ASCII码表做数字与字母的转换
# print(chr(65)) # A
# print(ord('A')) # 65
# 8.dir() 返回括号内对象能够调用的名字
# print(dir('hello'))
# 9.divmod() 元组 第一个数据为整除数 第二个是余数
# res = divmod(100, 2)
# print(res) # (50, 0)
# res = divmod(100, 3)
# print(res)
"""
总数据 每页展示的数据 总页码
100 10 10
99 10 10
101 10 11
"""
# page_num, more = divmod(9999, 20)
# print(divmod(99, 10)) # (9, 9)
# if more:
# page_num += 1
# print('总页码为:', page_num) # 总页码为: 500
# 10.enumerate() 枚举
# 11.eval() exec() 能够识别字符串中的python并执行
# s1 = 'print("哈哈哈")'
# eval(s1)
# exec(s1)
# s2 = 'for i in range(100):print(i)'
# eval(s2) # 只能识别简单的python代码 具有逻辑性的都不行
# exec(s2) # 可以识别具有一定逻辑性的python代码
# 12.hash() 哈希加密
# print(hash('jason'))
# 13.id() input() isinstance()
# 14.map() max() min()
# 15.open()
# 16.pow() 幂指数(次方)
# print(pow(2, 2))
# print(pow(2, 3))
# print(pow(2, 4))
# 17.range()
# 18.round() 四舍五入
# print(round(98.3))
# print(round(98.6))
# 19.sum()
# print(sum([11, 22, 33, 44, 55, 66]))
# 20.zip()
dict()方法
dict()括号里面必须是要给一个整体的数据,这个整体的数据可以是一个列表或者元组等,然后对这个整体数据进行for循环,遍历出每一个单个数据,这个时候要求这单个的数据也必须能够for循环,并且单个数据for循环出的数据只能有两个。只有同时满足这两点,每一个部分的数据就可以形成一个 一个的键值队,最终形成一个字典!!
可迭代对象
1.可迭代对象
对象内置有__iter__方法的都称为可迭代对象
"""
1.内置方法 通过点的方式能够调用的方法
2.__iter__ 双下iter方法
"""
2.可迭代对象的范围
不是可迭代对象
int float bool 函数对象
是可迭代对象
str list dict tuple set 文件对象
3.可迭代的含义
"""
迭代:更新换代(每次更新都必须依赖上一次的结果)
eg:手机app更新
"""
可迭代在python中可以理解为是否支持for循环
迭代器对象
1.迭代器对象
是由可迭代对象调用__iter__方法产生的
迭代器对象判断的本质是看是否内置有__iter__和__next__
2.迭代器对象的作用
提供了一种不依赖于索引取值的方式
正因为有迭代器的存在 我们的字典 集合才能够被for循环
3.迭代器对象实操
s1 = 'hello' # 可迭代对象
res = s1.__iter__() # 迭代器对象
print(res.__next__()) # 迭代取值 for循环的本质
一旦__next__取不到值 会直接报错
4.注意事项
可迭代对象调用__iter__会成为迭代器对象 迭代器对象如果还调用__iter__不会有任何变化 还是迭代器对象本身
for循环的本质
for 变量名 in 可迭代对象:
循环体代码
"""
1.先将in后面的数据调用__iter__转变成迭代器对象
2.依次让迭代器对象调用__next__取值
3.一旦__next__取不到值报错 for循环会自动捕获并处理
"""
异常捕获/处理
1.异常
异常就是代码运行报错 行业俗语叫bug
代码运行中一旦遇到异常会直接结束整个程序的运行 我们在编写代码的过程中药尽可能避免
2.异常分类
语法错误
不允许出现 一旦出现立刻改正 否则提桶跑路
逻辑错误
允许出现的 因为它一眼发现不了 代码运行之后才可能会出现
3.异常结构
错误位置
错误类型
错误详情
作业
1.整理今日内容及博客 录音 单词
2.整理本周疑难杂症 针对性解决
3.周日晚编写本周内容总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY