ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

内置函数、可迭代对象、迭代器对象

2022-07-11 18:31:14  阅读:109  来源: 互联网

标签:__ .__ 迭代 对象 res 内置 print


目录

昨日内容回顾

三元表达式

主要用于二选一,不支持嵌套使用

表达式:条件为真时的结果 if 条件 else 条件为假时的结果

各种生成式

可以减少代码

1.列表生成式*

​ [数据处理 for i in 数据类型 if 条件]

2.字典生成式

​ {i:'数据' for i in range() if 条件}

3.集合表达式

​ {i for i in range() if 条件}

匿名函数

主要用于简单的业务逻辑处理 减少代码编写

语法结构:lambda 形参:返回值

重要内置函数

max()--->求最大值

min()--->求最小值

sum()--->求和

map()--->映射

filter()--->过滤,

reduce()--->一次取俩个值

zip()--->拼接

考试题讲解

	 有下列用户数据
    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能够自动处理该错误 让循环正常结束

标签:__,.__,迭代,对象,res,内置,print
来源: https://www.cnblogs.com/zxr1002/p/16467481.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有