• 迭代器/生成器


    迭代器

    #1.什么是迭代器
        迭代取值的工具
    
    #2.为什么用迭代器
        优点:
            1、提供一种不依赖索引的取值方式
            2、更节省内存(自定义迭代器是,它所占的内存是功能本身的代码量,)
        缺点:
            1、没有按索引取值灵活
            2、迭代器对象是一次性的,值可以取完,再想取值重新把可迭代对象定义为迭代器对象
    
          
    
    #3. 如何用迭代器
    
      可迭代的对象:  strlist	upledictset文件对象
          但凡内置有__iter__方法的对象都称之为可迭代对象
          可迭代对象).__iter__=====》》迭代器对象
    
      迭代器对象:   文件对象
        既内置有__iter__方法又内置有__next__方法的对象都称之为迭代器对象    

      __iter__与__next__简便写法

    k={'a':111,'b':222,'c':333}
    iter_k=iter(k)                      # k.__iter__()
    print(next(iter(k)))            #iter_d.__next__()    
    

      

    4.for循环的底层工作原理(必须是可迭代类型)

      1  把可迭代对象转换为迭代器对象,
       2  调迭代器的__next__方法,取值,取值
       3  用try和except监测异常,在把迭代器中值取完的情况下结束循环

    方式一方式二是一个引子
    方式一
    k={'a':111,'b':222,'c':333}
    k1=k.__iter__()
    
        print(k1.__next__())
        print(k1.__next__())
        print(k1.__next__())
        print(k1.__next__())
    ------------------------------------------------
    方式二
    k={'a':111,'b':222,'c':333}
    k1=k.__iter__()
    while True:
        v=k1.__next__()
        print(v)
    ----------------------------------------------
    方式一二执行结果一样,都会报错(超出索引范围)
    那么通过添加try和except来阻止报错
    k={'a':111,'b':222,'c':333}
    k1=k.__iter__()
    while True:
        try:                    #监管代码执行,遇到异常,捕捉异常,开始和except后的值匹配,是否是这个错误
            v=k1.__next__()
            print(v)
        except StopIteration:
            break
    View Code

      

    生成器

    一、什么是生成器

        只要函数内部包含有yield关键字,那么函数名()得到的结果就是生成器,并且不会执行函数内部代码

    二、如何用生成器

        但凡函数内出现yield关键字,再去调用函数不会立即执行函数体代码,通过next()调用

    def func():
        print('a')
        yield 1
        print('s')
        res=yield 2
        print('c')
        res=yield 3
    
    g=func()
    s=next(g)
    print(s)
    next(g)
    print(res)
    next(g)
    print(res)
    next(g)
    
    通过next()调用yield,因为生成器是迭代器的一种,所以在next执行完也会报错,仍通过try监测异常
    def func..
    ....
    try:
        g=func()
        print(next(g))
        next(g)
        next(g)
        next(g)
    except:
        print(0)
    View Code

    总结yield:
    1. 提供一种自定义迭代器的解决方案
    2. yield & return
      相同点: 都可以返回值,返回值没有类型限制和个数限制

      不同点: 函数遇到return会结束函数体
           遇到yield是让函数暂停在某一个位置

     

    小练习,自定义range

    def a(start,stop,s):
        while start<stop:
            yield start
            start+=s
    for i in a(1,50,2):        范围及步长自定义
        print(i)
    

      



        







  • 相关阅读:
    Web前端学习笔记之离线安装npm
    Java学习笔记之linux配置java环境变量(三种环境变量)
    Docker学习笔记之docker volume 容器卷的那些事(二)
    Docker学习笔记之docker volume 容器卷的那些事(一)
    Docker学习笔记之docker-save vs docker-export vs docker-commit
    Linux学习笔记之Linux运行脚本时 $' ' 错误
    K8S学习笔记之Flannel解读
    map_server地图服务器
    ros navigation stack 各个包的作用
    struct 与 class 的区别
  • 原文地址:https://www.cnblogs.com/pdun/p/10271723.html
Copyright © 2020-2023  润新知