内置函数、可迭代对象、迭代器对象
考试题讲解
有下列用户数据
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:装饰器知识 附赠:实现上述主体功能即可 其他扩展优化功能可暂且不写
'''
1.先编写校验用户身份的装饰器
2.然后再考虑如何保存用户登录状态
3.再完善各种需求
'''
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']}
}
# 9.创建全局变量记录用户登录状态以及当前用户的执行权限
is_login = {
'is_login': False,
'access_list': []
}
def auth_user(func_id):
def outer(func_name):
def inner(*args, **kwargs):
# 10.先判断当前用户是否登录
if is_login.get('is_login'):
# 11.获取当前用户执行权限
access = is_login.get('access_list')
# 12.判断当前函数编号是否在用户权限内
if func_id in access:
res = func_name(*args, **kwargs)
return res
else:
print('你没有当前功能编号为:%s 的函数执行权限' % func_id)
else:
# 1.先获取用户的身份编号
user_id = input('请输入您的身份编号>>>:').strip()
# 2.判断用户编号是否存在
if user_id in user_data:
# 3.获取用户名和密码
username = input('username>>>:').strip()
password = input('password>>>:').strip()
# 4.根据用户编号获取真实用户字典数据
real_dict = user_data.get(user_id)
# 5.比较用户名和密码是否正确
if username == real_dict.get('name') and password == real_dict.get('pwd'):
# 6.获取当前用户可执行的函数编号
access = real_dict.get('access') # ['1', '2']
# 10.保存用户登录状态并记录用户权限
is_login['is_login'] = True
is_login['access_list'] = access
# 7.判断当前用户是否含有当前被装饰函数的执行权限 假设当前被装饰函数功能编号是 func_id
if func_id in access:
# 8.用户拥有该函数的执行权限
res = func_name(*args, **kwargs)
return res
else:
print('你没有当前功能编号为:%s 的函数执行权限' % func_id)
return inner
return outer
@auth_user('1') # 被装饰的函数 提前传入该函数的功能编号
def func1():
print('from func1')
@auth_user('2') # 被装饰的函数 提前传入该函数的功能编号
def func2():
print('from func2')
@auth_user('3') # 被装饰的函数 提前传入该函数的功能编号
def func3():
print('from func3')
func1()
func2()
func3()
常见内置函数
数学运算
函数 | 作用 |
---|---|
abs() | 求函数得绝对值 |
divmod() | 返回俩个数值得商和余数 |
max() | 返回最大值 |
min() | 返回最小值 |
pow() | 返回俩个数值得幂运算 |
round() | 对浮点数进行四舍五入求职 |
sum() | 求和 |
类型转换
函数 | 作用 | 函数 | 作用 |
---|---|---|---|
bool() | 布尔值,根据传入的参数判断是否正确 | int() | 整型类型,根据传入的参数可以转换成整型;其他进制之间得转换 |
float() | 浮点型类型,根据传入的参数可以转换成浮点型 | complex() | 根据传入的参数转换为一个复数 |
str() | 字符串类型 | bytearray() | 根据传入的参数创建一个新的字节数组 |
bytes() | 根据传入的参数创建一个新的不可变字节数组 | memoryview() | 根据传入的参数创建一个新的内存查看对象 |
ord() | 返回Unicode字符对应的整数 | chr() | 返回整数所对应的Unicode字符 |
bin() | 将整数转换成二进制 | oct() | 将整数转换成八进制 |
hex() | 将整数转换成十六进制 | tuple() | 根据传入的参数创建一个新的元组 |
list() | 根据传入的参数创建一个新的列表 | range() | 根据传入的参数创建一个新的range对象 |
dict() | 根据传入的参数创建一个新的字典 | iter() | 根据传入的参数创建一个新的可迭代对象 |
set() | 根据传入的参数创建一个新的集合 | slice() | 根据传入的参数创建一个新的切片对象 |
frozenset() | 根据传入的参数创建的一个新的不可变集合 | super() | 根据传入的参数创建一个新的子类和父类关系的代理对象 |
enumerate() | 根据可迭代对象创建枚举对象 | object() | 创建一个新的object对象 |
序列操作
函数 | 作用 | 函数 | 作用 |
---|---|---|---|
all() | 判断可迭代对象的每个元素是否[都为True值] | any() | 判断可迭代对象的每个元素是否[有为True值] |
filter() | 使用指定的方法过滤可迭代对象的元素 | map() | 映射,使用指定方法作用传入的每个可迭代对象的元素,生成新的可迭代对象 |
next() | 返回可迭代对象中的下一个元素值 | reversed() | 反转序列生成新的可迭代对象 |
sorted() | 排序,对可迭代对象进行排序,返回一个新的列表 | zip() | 以最小长度来匹配,返回一个新的元组类型迭代器 |
对象操作
函数 | 作用 | 函数 | 作用 |
---|---|---|---|
help() | 返回对象的帮助信息 | dir() | 返回对象或者当前作用域内的属性列表 |
id() | 返回对象的唯一标识符 | hash() | 获取对象的哈希值 |
type() | 返回对象的类型 | len() | 返回对象的长度 |
ascii() | 返回对象的可打印表字符串表现方式 | format() | 格式化显示值 |
vars() | 返回当前作用域内局部变量和其值组成的字典 |
反射操作
函数 | 作用 | 函数 | 作用 |
---|---|---|---|
import() | 导入模块 | isinstance() | 判断对象是否是类 |
issubclass() | 判断是否是另一个类 | hasattr() | 检查对象是否含有属性 |
getattr() | 获取对象的属性值 | setattr() | 设置对象的属性值 |
delattr() | 删除对象的属性 | callable() | 检测对象是否可被调用 |
变量操作
函数 | 作用 |
---|---|
globals() | 局部空间的使用全局空间的名字 |
locals() | 局部空间使用局部空间的名字 |
交互操作
函数 | 作用 |
---|---|
print() | 输出 |
input() | 输入 |
文件操作
函数 | 作用 |
---|---|
open() | 使用指定的模式和编码打开文件,返回文件读写对象 |
编译执行
函数 | 作用 |
---|---|
compile() | |
eval()、exec() | 能够识别字符串中python代码并执行 |
repr() | 返回一个对象的字符串表现形式(给解释器) |
装饰器
函数 | 作用 |
---|---|
property() | 标示属性的装饰器 |
classmethod() | 标示方法为类的装饰器 |
staticmethod() | 标示方法为静态方法的装饰器 |
可迭代对象
1.迭代如何理解
更新换代,每次迭代都需要基于上一次的成果
2.如何判断可迭代对象
# 不属于迭代
# while True:
# print('嘿嘿嘿')
# 属于迭代
n = 0
while n < 10:
print(n)
n += 1
内置(通过句点符直接可以取到的方法)有`_`_iter_`_`方法的都叫做可迭代对象
`__`_iter_`__`针对双下划线开头和结尾的方法,我们同一读法叫做双下XXX
3.可迭代对象和不可迭代对象的类型
可迭代对象:字符串, 列表 ,字典 ,元组 ,集合 ,文件对象(本身就是迭代器对象)
不可迭代对象:整型 ,浮点型, 布尔值, 函数名
迭代器对象
1.作用
迭代器对象给我们提供了一种不依赖于索引取值的方式
正是因为有迭代器对象的存在 我们才能对字典、集合这些无序类型循环取值
2.如何判断迭代器对象
内置有__
iter__
和__
_next__
的对象都称为迭代器对象
3.可迭代对象和迭代器对象的关系
可迭代对象调用__
iter__
方法之后就会变成迭代器对象
迭代器对象调用__
iter__
方法无论多少次还是迭代器对象本身
4.迭代器反复使用
l = [11, 22, 33, 44]
print(l.__iter__().__next__()) # 11 每次都是产生了一个新的迭代器对象
print(l.__iter__().__next__()) # 11
print(l.__iter__().__next__()) # 11
print(l.__iter__().__next__()) # 11
res = l.__iter__() # 固定好的迭代器
print(res.__iter__().__next__()) # 11 每次使用的都是一个迭代器对象
print(res.__iter__().__next__()) # 22
print(res.__iter__().__next__()) # 33
print(res.__iter__().__next__()) # 44
5.针对双下方法的使用
res = l.__
iter__
()----->也可以写为iter(l)
res.__
next__
()----->也可以写为next(res)
6.迭代器对象特殊的地方
可迭代对象、可迭代器对象,通过打印操作无法直接看出内部数据的具体情况,类似于python3中的range()方法,可以将它看作是一个工厂,什么时候要数据什么时候给
7.迭代对象迭代取值
res = 'jason'.__iter__() # res已经是迭代器对象
print(res.__next__()) # j
print(res.__next__()) # a
print(res.__next__()) # s
print(res.__next__()) # o
print(res.__next__()) # n
print(res.__next__()) # 报错
'''当挨个取值完以后如果还要继续取值的话,就会报错'''
d1 = {'name': 'jason', 'pwd': 123}
# 先将字典变成迭代器对象
res = d1.__iter__()
print(res.__next__()) # name
print(res.__next__()) # pwd
l1 = [11, 22, 33, 44, 55, 66, 77, 88]
# 需求:不使用for循环 依次打印出列表中所有的数据值
# 1.先将列表变成迭代器对象
res = l1.__iter__()
# 2.定义一个计数器
count = 0
# 3.编写while循环
while count < len(l1):
print(res.__next__())
count += 1
for循环本质
语法结构:
for 变量名 in 可迭代对象
循环体代码
1.for会自动将in后面的数据调用__iter__()变成迭代器对
2.之后每次循环调用__next__()取值
3.最后没有值__next__()会报错 for能够自动处理该错误 让循环正常结束