zoukankan      html  css  js  c++  java
  • 迭代器

    迭代器

    ''''
    '''
    '''
    什么是迭代器
        迭代:更新换代的过程,每次迭代必须基于上次迭代的结果
        迭代器:迭代取值的工具
    
    可以迭代取值的数据类型
        字符串
        列表
        元组
        集合
        字典
        
    如何判断是否是可迭代对象
        内置方法有.__iter__的数据就是可迭代数据
     
    
    
    
    
    
    
    
    如何判断迭代器对象?
        内置方法有.__iter__
                  .__next__  两种内置方法的称为迭代器对象 
    文件属于迭代器对象
    
    迭代器对象不管执行多少次.__iter__ 最后还是迭代器本身   
    
    l = [1,2,3,4]
    iter_f = l.__iter__()
    print(iter_f is iter_f.__iter__().__iter__().__iter__().__iter__())  # True
    
    
    内置方法.__iter__ 就是将可迭代对象转换为迭代器对象
    
    l = [1,2,3,4] 
    iter_l = l.__iter__()
    print(iter_l.__next__())
    print(iter_l.__next__())
    print(iter_l.__next__())
    print(iter_l.__next__())
    print(iter_l.__next__())
    # 迭代次数超过迭代器对象中元素个数时,会报错StopIteration
    
    
    异常处理
    l = [1,2,3,4]
    iter_l = l.__iter__()
    while True:
        try:
            print(iter_l.__next__())
        except StopIteration:
            print('取值结束')
            break
            
    迭代器取值的特点:
        只能往后依次取 不能返回再次取值
    
    '''

    for循环原理

    '''
    for 循环的本质
        for循环是将in后面的对象调用.__iter__ 转换成迭代器对象
        调用__next__ 进行迭代取值
        内部有异常捕获StopIteration  当__next__报错这个错时,直接结束循环
    
    迭代取值的优缺点
        优点:不依赖索引取值
             内存中只占一个空间,内存不会溢出
             
        缺点:不能索引取值
             全部取完再取会报StopIteration
             
    '''

    生成器

    '''
    生成器:就是 用户自己定义的迭代去,本质上就是迭代器
    def func():
        print('hello')
        yield
    在函数定义中出现yield就是代表生产器
    但是函数名加括号 不会触发函数体代码的运行
    
    '''
    
    
    def func():
        print('cly')
        yield 1
        print('clysb')
        yield 1,2
        print('clydsb')
        yield 1,2,3,4,5
    
    f = func()  # 生成器初始化,将函数变成迭代器
    print(f.__next__())
    print(f.__next__())
    print(f.__next__())
    
    '''
    yield关键字后面跟的值,就是__next__需要返回的值
    yield不能结束函数,但能暂定函数,需要再次__next__取值才会继续执行
    yield后 返回多个值时,会将多个值以元组的形式返回
    
    yield 与 return的相同点在于 都能返回值,返回多个值都是以元组的形式返回
    
    yield 与 return的不同点在于 return能直接结束函数 , yield只是暂停函数
                                能从外部给yield传值
    
    def func():
        print('今天学了啥')
        while True:
            study = yield
            print(study)
    f = func()
    f.__next__()
    f.send('迭代器')  # 内部共做了两个步骤 给yield左边的变量传参,在执行f.__next__一次
    # f.__next__()
    
    
    '''
    
    '''
    生成器表达式:
        f = (i for i in range(10) if i != 4)
        这是一个生成器,并不是元组生产器
    生产器不会主动执行任何一行代码,
    必须通过.__next__触发代码执行
    '''
    def add(n,i):
        return n+i
    def test():
        for i in range(4):
            yield i
    g=test()
    
    for n in [1,10]:
        g=(add(n,i) for i in g)
    # 第一次for循环 add(1,i) for i in test()
    # 第二次for循环 add(10,i) for i in (add(1,i) for i in test())
    print(n)
    res=list(g)
  • 相关阅读:
    Spark RDD操作(1)
    scala学习笔记(8): 列表的map,flatMap,zip和reduce
    (转)hadoop基本操作命令
    Mac下配置环境变量
    Spark快速入门(1)
    urllib2 request 模拟伪装浏览器
    linux下面Zookeeper的单机模式(standalone)
    linux redis安装
    python OCR 图形识别
    mysql 、慢查询、到底如何玩
  • 原文地址:https://www.cnblogs.com/asdaa/p/11190831.html
Copyright © 2011-2022 走看看