• day13_迭代器,生成器


    迭代器:

    迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法。

    l = [1,2,3,4]
    l_iter = l.__iter__()
    while True:
        try:
            item = l_iter.__next__()
            print(item)
        except StopIteration:
            break

    迭代器有两种:一种是调用方法直接返回的,一种是可迭代对象通过执行iter方法得到的,迭代器有的好处是可以节省内存。

    生成器:

    1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行

    2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

    import time
    def genrator_fun1():
        a = 1
        print('现在定义了a变量')
        yield a
        b = 2
        print('现在又定义了b变量')
        yield b
    
    g1 = genrator_fun1()
    print('g1 : ',g1)       #打印g1可以发现g1就是一个生成器
    print('-'*20)   #我是华丽的分割线
    print(next(g1))
    time.sleep(1)   #sleep一秒看清执行过程
    print(next(g1))

     校服案例:

    def cloes():
        for i in range(1,1000):
            yield "校服第%d件"%i
    
    check = cloes()
    #print(list(cheak)) #print(next(check)) #print(check.__next__()) num
    = 0 #生成器可以通过两种方法实现:数据类型的强制转换 : 占用内存/next()输出下一结果,/for循环 for i in check: print(i) num += 1 if num == 5: break

     迭代器和生成器总结

     迭代器:
    # 双下方法 : 很少直接调用的方法。一般情况下,是通过其他语法触发的
    # 可迭代的 —— 可迭代协议 含有__iter__的方法('__iter__' in dir(数据))
    # 可迭代的一定可以被for循环
    # 迭代器协议: 含有__iter__和__next__方法
    # 迭代器一定可迭代,
    可迭代的通过调用iter()方法就能得到一个迭代器
    # 迭代器的特点:
    # 很方便使用,且只能取所有的数据取一次
    # 节省内存空间

    # 生成器
    # 生成器的本质就是迭代器
    生成器函数:
    #含有yield关键字的函数就是生成器函数
    特点:
    #调用函数的之后函数不执行,返回一个生成器
    #每次调用next方法的时候会取到一个值
    #直到取完最后一个,在执行next会报错

    # 从生成器中取值的几个方法
    # next
    # for
    # 数据类型的强制转换 : 占用内存

  • 相关阅读:
    DECLARE
    deallocvt
    科研院所
    jQuery Ajax 确定 form 表单 submit 提交成功
    Java实现 LeetCode 10 正则表达式匹配
    Java实现 LeetCode 10 正则表达式匹配
    Java实现 LeetCode 9 回文数
    Java实现 LeetCode 9 回文数
    Java实现 LeetCode 9 回文数
    Java实现 LeetCode 8 字符串转换整数(atoi)
  • 原文地址:https://www.cnblogs.com/wzc27229/p/10999547.html
Copyright © 2020-2023  润新知