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

    一 迭代器介绍

    1、什么是迭代器

    ​ 迭代器指的是迭代取值的工具

    ​ 什么是迭代?

    ​ 迭代就是一个重复的过程,但是每一次重复都是在上一次的基础上进行的

    ​ 单纯的重复不叫迭代

    2、为何要用迭代器

    ​ 1、迭代器提供了一种不依赖索引的,通用的迭代取值方案

    ​ 2、节省内存

    关于迭代器的详细介绍↓↓↓↓↓↓↓

    迭代器即用来迭代取值的工具,而迭代是重复反馈过程的活动,其目的通常是为了逼近所需的目标或结果,每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代

    while True:
        msg = input('>>: ').strip()
        print(msg)
    

    下述while循环才是一个迭代过程,不仅满足重复,而且以每次重新赋值后的index值作为下一次循环中新的索引进行取值,反复迭代,最终可以取尽列表中的值

    goods=['mac','lenovo','acer','dell','sony']
    
    index=0
    while index < len(goods):
        print(goods[index])
        index+=1
    

    1.1 可迭代对象

     1、内置于_iter_方法的对象都叫可迭代的对象
    

    内置的类型都是可迭代的对象

    字符串 列表 元组 字典 结合

    1.2 迭代器对象

    1、内置有_iter_方法的对象
    2、内置有_next_方法的对象
    调用迭代器对象的 _iter_方法得到它自己,就跟没调用一样
    调用迭代器对象的_next_方法返回下一个值,不依赖索引
    可以一直调用_next_直到取干净,则抛出异常StopIteration
    
    只要调用可迭代对象的_iter_方法就会拿到一个返回值,该返回值就是python帮我们做好的迭代器
    

    文件本身就是迭代器对象

    l = [1,2,3,4]
    l=l.__iter__()
    print(l.__next__())
    print(l.__next__())
    print(l.__next__())
    print(l.__next__())
    >>>1
    >>>2
    >>>3
    >>>4
    
    
    l = [1,2,3,4]
    l = iter(l)
    # next(l)
    print(next(l))
    print(next(l))
    print(next(l))
    

    二 for循环原理

    首先我们先想一个问题 for循环和while循环 做一个不需要索引取值的循环应该怎么做

    # 用while循环做一个不根据索引取值的循环方式
    nums = [111,222,3333]
    # nums_iter = iter(nums)  #需要把nums  _iter_成迭代器对象
    # while True:
    #     try:
    #         res = next(nums_iter)
    #         print(res)
    #     except StopIteration:  # 捕捉到一场终止循环
    #         break
    

    for循环又称为迭代循环,in后可以跟任意可迭代对象,上述while循环可以简写为

    nums = [111,222,3333]
    for x in nums:   #相当于省去了把可迭代对象  iter成迭代器对象的过程、
        print(x)
        
    # 1、先调用in后那个对象的__iter__方法,拿到迭代器对象
    # 2、 x = next(迭代器对象),执行一次循环体代码
    # 3、循环往复步骤2,直到值取干净抛出异常StopIteration,for会捕捉异常结束循环
    

    for循环 用迭代器取值有个特点取完就停止 那如何把同一个可迭代对象再重新取呢?

    nums =[111,22,33]
    # x = iter(nums)
    # for res in x:  # x.__iter__()
    #     print(res)
    # print('='*50)
    #
    # for res in x:  # x.__iter__()
    #     print(res)
    
    
    for res in nums:  # nums.__iter__()
        print(res)
    print('='*50)
    for res in nums:  # nums.__iter__()
        print(res)
    

    三迭代器的优缺点

    3.1优点

    1、为序列和非序列类型提供了一种统一的迭代取值方式。

    2、惰性计算:迭代器对象表示的是一个数据流,可以只在需要时才去调用next来计算出一个值,就迭代器本身来说,同一时刻在内存中只有一个值,因而可以存放无限大的数据流,而对于其他容器类型,如列表,需要把所有的元素都存放于内存中,受内存大小的限制,可以存放的值的个数是有限的。

    3.2缺点

    1、除非取尽,否则无法获取迭代器的长度

    2、只能取下一个值,不能回到开始,更像是‘一次性的’,迭代器产生后的唯一目标就是重复执行next方法直到值取尽,否则就会停留在某个位置,等待下一次调用next;若是要再次迭代同个对象,你只能重新调用iter方法去创建一个新的迭代器对象,如果有两个或者多个循环使用同一个迭代器,必然只会有一个循环能取到值。

    四 生成器的介绍

    生成器就是自定义迭代器

    想要把迭代器做成一个工具就需要用到函数的概念 函数的返回值 yield 与 return的一同

    相同:返回值层面用法一样

    不同点:return只能返回值一词,而yield可以返回多次

    def func():
        print('xxx')
        yield 111
        print('yyy')
        yield 222
        print('zzz')
        yield 333
        print('mmmm')
    g = func()
    print(g)  #generator  发生器
    #只要函数内部包含有yield关键字,那么函数名()的到的结果就是生成器,并且不会执行函数内部代码
    
    g.__iter__()
    g.__next__()
    #所以生成器就是迭代器,因此可以用next取值
    
    res=next(g)
    print(res)
    
    res=next(g)
    print(res)
    
    res=next(g)
    print(res)
    
    》》》
    <generator object func at 0x000001CD2BE062E0>
    xxx
    111
    yyy
    222
    zzz
    333
    
    
    

    那么一个有无限值的生成器应该怎么取值呢?

    def func():
        res = 1
        while   True:
            yield res
            res+=1
    g = func()
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    》》》
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    
    
    
    
  • 相关阅读:
    oracle语法
    cin.clear()、cin.sync()
    Intellij Idea Spring Boot 热部署
    navicat_premium_x64最新版安装说明
    激活navicat premium12
    时间戳Unix和时间之间的转换
    排序算法-- 大总结
    The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
    final
    static
  • 原文地址:https://www.cnblogs.com/cnblogswilliam/p/14212473.html
Copyright © 2011-2022 走看看