zoukankan      html  css  js  c++  java
  • 迭代器,生成器

    一,迭代的概念

      迭代器是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下次一迭代的初始值

    while True: #只是单纯地重复,因而不是迭代
        print('===>') 
        
    l=[1,2,3]
    count=0
    while count < len(l): #迭代
        print(l[count])
        count+=1

    二,为什么要用迭代器

      迭代器:

        优点: 1),提供一种不依赖索引的迭代取值方式

           2),更加节省内存

        缺点: 1),不如按照索引取值的方式灵活

            2),取值一次性的,只能往后取值,无法预测值的个数

    三,如何使用迭代器

      可迭代的对象:str list tuple dict set 文件对象

        但凡内置有_iter_方法的对象都称之为可迭代对象

      迭代器对象: 文件对象

        既可以内置_iter_方法又可以内置_next_方法的对象都称之为迭代器对象

    调用可迭代对象_iter_ 方法,会有一个返回值,该返回值就是内置的迭代器对象

    d = {'k1': 111, 'k2': 222, 'k3': 333}
    
    iter_d = d.__iter__()       #将数据类型可迭代对象转变成迭代器对象
    print(iter_d)
    
    try:    #让报错继续运行
        print(iter_d.__next__())
        print(iter_d.__next__())
        print(iter_d.__next__())
        print(iter_d.__next__())
    except StopIteration:   #捕捉'StopIteration'异常
        print('取值完毕')

    for循环的底层工作原理:

      1,调用in后面那个值对象的_iter方法,拿到一个迭代器对象iter_obj

      2,调用迭代器对象iter_obj._next_()将得到的返回值复制变量名k,循环往复直到取值完毕抛出异常StopIteration

      3,捕捉异常结束循环

    iter_d=d.__iter__()
    while True:
        try:
            v=iter_d.__next__()
            print(v)
        except StopIteration:
            break

     生成器:

      生成器就是一种自定义的迭代器

    如何得到生成器:

      但凡函数内出现yield关键字,再去调用函数不会立即执行函数体代码,会得到一个返回值,该返回值就是生成器对象,即定义的迭代器

    自定义一个迭代器

    def my_range(start, stop, step=1):
        while start < stop:
            yield start
            start += step
    
    
    r = my_range(1, 1000, 5)
    res = next(r)
    print(res)
    
    for i in my_range(1, 1000, 5):
        print(i)

    总结:

      1, 提供一种自定义迭代器的解决方案

      2, yield & return 

          相同点: 都可以返回值,返回值没有类型限制个数限制

          不同点: return 只能返回一个值,yield 却可以让函数暂停在某一个位置,可以返回多次值

    列表生成器

      把列表推导式的[]换成()就是生成器表达式

    with open('a.txt',mode='rt',encoding='utf-8') as f:
        # print(len(f.read()))
    
        # g=(len(line) for line in f)
        # res=sum(g)
    
        res = sum(len(line) for line in f)
        print(res)
  • 相关阅读:
    win7开启硬盘AHCI
    (32)odoo中的编码问题
    (31)odoo中的时间
    (30)odoo中的快捷标签
    css3 移动端页面全屏旋转,横屏显示。
    Turn.js 实现翻书效果
    WebStorm 2016 最新版激活(activation code方式)
    vue 状态管理vuex(九)
    webstorm中.vue报错(es6语法报错)-转
    Robot Framework自动化测试(一)
  • 原文地址:https://www.cnblogs.com/kp1995/p/10060308.html
Copyright © 2011-2022 走看看