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

    一、迭代器

      迭代取值的工具,每一次迭代都必须基于上一次的结果

    为什么要用迭代器

      迭代器给你提供了一种不依赖于索引取值的方式

    怎么用迭代器

      

    l = [1,2,3,4,5]
    s = 'hello'
    n = 0
    while n <len(l):
        print(l[n])
        n += 1

    需要迭代取值的数据类型

    字符串,列表,元祖,集合,字典

    可迭代对象的定义

      只有通过内置有__iter__方法的都叫做可迭代对象

      补充:针对双下线开头 双下线结尾的方法,推荐读作 双下+方法名

    基本数据类型中,是可迭代对象的有

      字符串

      列表

      元祖

      字典

      集合

    可迭代对象

      执行内置的__iter__方法得到的就是该对象的迭代器对象

    二、迭代器对象

        1、内置有__iter__方法

        2、内置有__next__方法

        迭代器一定是可迭代对象

    迭代器取值

    l = [1,2,3,4]
    iter_l = l.__iter__()#生成一个迭代器对象
    
    print(iter_l.__next__())  # 迭代器取值 调用 __next__
    print(iter_l.next__())
    ...
    #可以一直取,但是取完了 就会直接报错

        迭代器对象无论执行了多少次 __iter__方法得到的还是迭代器对象本身

    迭代器取值的异常处理:  

    while Ture:
        
        try:
                print(lter_d.__next__())
        except  StopeTeration:  #报错类型
                break

     迭代器取值的特点

      只能往后取 不能往后退

    总结

      可迭代对象:内置有__iter__方法的

      迭代器对象:即内置有__iter__也内置有__next__方法

    迭代取值:

      优点

        1.不依赖索引取值

        2.内存中永远只占一份空间,不会导致内存溢出

      缺点

        1.不能够获取指定的元素

        2,取完后之后会报stopIteration错

    三、for循环的本质

      for循环的本质

        1.将in后面的对象调用__iter__转成可迭代对象

        2.调用__next__迭代取值

        3.内容有异常捕获StopIteration,当__next__报这个错 自动结束循环

    四、生存器

        用户自定义的迭代器

    yield关键字

      函数内如果有yield关键字,那么加括号执行函数的时候并不会触发函数体代码的运行

    列子

      初始化函数,将函数变成迭代器

    def func()
      print('frist')
      yield

    yield 后面跟的值就是调用迭代器__next__方法你能得到的值,既可以返回一个值也可以返回

    多个值,并且多个值也是按照元组的形式返回

    def func():
        print('second')
        yield  777
        print('third')
        yield  888
        print('forth')
        yield
        yield
    g = func()
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())  #没有值得话就是None

      range生成器

      

    def my_range(start,end,step):  # 实现range功能
       while start < end:
           yield start
           start += step
    for j in my_range(1,100,2):
        print(j)

    了解知识点

        yield支持外界为其传参

    当函数内有yield关键字的时候,调用该函数不会执行函数体代码,而是将函数变成生成器

    yield

      1.帮你提供了一种自定义生成器方式

      2.会帮你将函数的运行状态暂停住

      3.可以返值

    与return之间的异同点

      相同点:都可以返回值,并且都可以返回多个值

      不同点:

          yield可以返回多次值而return只能返回一次函数立即结束

          yield还可以接受外部传入的值

    五、生成式表达式

    表达式 

      res = (i for i in range(1,100)if i !=4)

      print(res)

    生成器不会主动执行一行代码

    必须通过__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循环g=(add(n,i) for i in test())
    
        # 第二次for循环g=(add(n,i) for i in (add(n,i) for i in test()))
    print(n)
    res=list(g)
    
    """
    for i in (add(10,i) for i in test()):  会执行所有的生成器内部的代码
        add(n,i)
    """
    
    
    
    
    #A. res=[10,11,12,13]
    #B. res=[11,12,13,14]
    #C. res=[20,21,22,23]  答案
    #D. res=[21,22,23,24]

          

  • 相关阅读:
    vuex
    koa2+node+vue自启服务运行本地脚本
    重新认识js(一)
    JQuery图片左右无缝滚动
    javascript兼容性很好的省市区联动,易修改
    JQuery超级简单的TAB选项卡
    ViewState的原理分析
    JQuery图片切换特效
    asp.net验证控件详解【转】
    时间线 制作
  • 原文地址:https://www.cnblogs.com/panyi2019/p/11190271.html
Copyright © 2011-2022 走看看