• 简看pythong迭代器和生成器


    一、迭代器

    什么是迭代?

      迭代:更新换代的过程,每次的迭代都必须基于上一次的结果

      迭代器:迭代取值的工具

    为什么要用?

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

      ps:需要迭代取值的数据类型:str、list、tuple、dict、set。

    二、什么是可迭代对象 

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

      可迭代对象有:str、list、tuple、set、dict

             文件对象(执行内置__iter__之后还是本身,没有任何变化),因为文件对象本身就是迭代器对象

    三、什么是迭代器对象 (迭代器对象:既内置有__iter__也内置有__next__方法)

      1、可迭代对象执行内置的__iter__方法后,得到的就是该对象的迭代器对象

        内置__next__方法的
        内置__iter__方法

      ps:迭代器对象一定是可迭代对象,而迭代对象不一定是迭代器对象

      2、生成一个迭代器对象用.__iter__()

        迭代器取值调用.__next__()  #  如果迭代器值取完了,直接报错 StopIteration

        防止取值报错的方法:用 trt 和 except StopIteration,当无值可取吗,反馈输出条件

          try:

            print(iter_d.__next__())

          except StopIteration

            print('无值可取')

            break   

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

      4、迭代取值:

        __next__

          优点:1、不依赖于索引取值

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

          缺点:1、不能获取指定的元素

             2、去完之后会报StopIteration错

    四、for循环内部原理:

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

      2、调用__next__迭代取值

      3、内部有异常捕获StopIteration,当__next__报错,自动循环结束

    五、生成器及表达式

      定义:用户自定义的迭代器,本质是生成器(生成器表达式和列表生成式类似,通常被误认为元组生成式。)

      5.1、把函数变迭代器要点:  

      def func():

        yield 123,234

      g = func  #生成器初始化

        1、如果函数内有yild关键字,那么括号加执行函数的时候不会出发函数代码的执行

        2、yield后面跟的值就是调用迭代器__next__方法得到的值,可返回多个值,并且是按元组的形式返回

    ps:

    yield
    1.帮你提供了一种自定义生成器方式
    2.会帮你将函数的运行状态暂停住
    3.可以返回值
    # yield支持外界为其传参
    def dog(name):
        print('%s 准备开吃'%name)
        while True:
            food = yield
            print('%s 吃了 %s'%(name,food))
    # def index():
    #     pass
    
    # 当函数内有yield关键字的时候,调用该函数不会执行函数体代码
    # 而是将函数变成生成器
    # g = dog('egon')
    # g.__next__()  # 必须先将代码运行至yield 才能够为其传值
    # g.send('狗不理包子')  # 给yield左边的变量传参  触发了__next__方法
    # g.send('饺子')
    View Code

      5.2、列表生成式特点:

        res = ( i for i in range(1,1000) if i !=4)  #  生成器表达式

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

        必须通过__next__出发代码的运行

  • 相关阅读:
    mysql官网下载yum
    zookeeper和kafka的leader和follower
    查看目标端口是否被占用
    scala中的val,var和lazy
    scala的异常处理try catch
    Navicat总是提示主键不存在问题
    idea常用快捷键
    wiremock技术入门
    Liunx常用操作(11)-VI编辑器-末行模式命令
    Liunx常用操作(十)-VI编辑器-命令模式命令
  • 原文地址:https://www.cnblogs.com/xiaowangba9494/p/11190272.html
Copyright © 2020-2023  润新知