zoukankan      html  css  js  c++  java
  • 迭代器和可迭代对象

    迭代器和可迭代对象:
    from colletions import Iterator迭代器
    from colletions import Iterable可迭代对象
    两个协议:
    1,可迭代协议:对象内部实现__iter__方法。
    2,迭代器协议:对象内部实现__iter__,__next__方法。
    迭代器:
    判断:
    1,dir(obj)列出所有方法,看是否有__next__方法。(迭代器没有__len__方法,即迭代器没有长度)
    2,bool = istance(obj,Iterator)看布尔值。
    生成:
    1,可以生成迭代器的前提必须是可迭代对象。
    2,通过obj1 = iter(obj),obj = obj1__iter__()可获得迭代器。
    取值:
    1,值的获取是一个一个取值的
    2, str = 'admin'
    obj = iter(str)=obj1__iter__()获取迭代器
    value = next(obj)=obj__next__()
    优缺点:
    1,惰性计算,延时计算,节省内存,取值不依赖于索引
    2,不能返回取值,不能按照索引取值,只能基于上一次取值进行下一次取值
    3,没有长度
    可迭代对象(不针对函数,只针对容器类数据类型、文件等对象):
    特点:重复、下一次重复基于上一次结果
    判断:
    1,dir(obj)列出所有方法,看是否有__iter__方法,或者是否有__len__方法。
    2,bool = istance(obj,Iterator)看布尔值。
    异同点:
    可迭代对象有长度,迭代器无长度
    都可以使用for遍历
    组成迭代器的本质是,先判断是否为迭代器,如果是就无需生成,再判断是否为可迭代对象,如果是则生成迭代器。

    生成器函数:
    关键字yiled的使用:
    1,yiled 参数 用于直接返回一个参数
    2,yiled from obj(容器类数据类型) 用于返回一个容器类数据类型,可通过obj.__next__()进行解压取值
    3,value = yiled 可用于对生成器内部变量的赋值,通过obj.send(value)进行传值
    4,value = yiled 参数 。参照1和3,即可接受传值又可以进行值的返回
    注意:3、4必须先激活(唤醒)yiled,才可以obj.__next__()取值
    方法:next(obj),obj.__next__(),obj.send(value)
    生成器函数的具体结构形式及调用:
    def fun():
    print('======')
    a = 0
    应用场景:
    1,yiled 1
    2,yiled from [1,2,3]
    3,a = yiled
    4,'''(外部传入的参数)value = yiled value1'''
    x = fun()获取生成器
    print(x.__next__())
    ...
    print(next(x))
    生成器表达式:
    y = (x for i in [0,1,2,3])
    print(y.__next__())

    列表推导式:[x for i in rang(10)]
    生成器推导式:(x for i in rang(10))

    关键字return和关键字yiled区别:
    1,关键字return用来结束函数,而yiled则不同
    2,return只能用来返回值,而yiled不但可以用于返回值也可以用于接收值


  • 相关阅读:
    异常单据锁定涉及的数据库表
    用友通只启用核算模块
    一个迟到MM如何让老师疯掉的
    偷偷看,别笑出声啊
    安装时又提示删除程序
    自动折行的设置
    酒后百态新编 恶搞
    系统管理中“站点”“运行状态”的含义
    神经病女士银行取钱
    HDOJ 1017
  • 原文地址:https://www.cnblogs.com/caoxing2017/p/7275703.html
Copyright © 2011-2022 走看看