• 列表生成式的进化版——生成器以及iterator


    在列表生成式中其实我们可能会碰到很多的局限性,一般列表生成式都比较简洁,如果想要通过比较复杂的算法生成一个列表的时候,就很难写出语句了。

    同时每次使用列表生成式时我们都使用了大量的内存,但是不妨我们使用一个现使用现算的式子来替代列表生成式,当使用这个列表的时候再自动计算生成。

    这就是生成器(generator)。 列表生成式的[]换成()就是代表生成器的语法。

    如果想一个一个使用元素,可以使用next()函数,接受一个iterator,取出其内容并递增。但其实大家很少这么使用,因为generator本身就是一个可以迭代的对象,所以我们不如直接使用for。

    生成器里面的一些东西我感觉和iterator有很大的关系,next的调用也是,在循环中每次取出iterator的值然后递增(或是从yield开始向后执行函数)

    注意,可以用*取用iterator中的内容,在取出内容之后自动递增迭代,而不需要next()。

    注: 一些复杂的函数其实其逻辑和生成器是一样的,通过循环获得对应的值,在一个函数中如果有yield关键字那么它就是一个生成器函数(iterator function),yield关键字比较类似返回但是和return不同,函数每次运行到yield值就会返回yield对应的值然后中断,使用next()函数或者在for语句中迭代到下一个循环中才能够继续执行该函数,每次中断就是一层,类比于产生了一个元素。

    >>> def fib(m):
          a, b, n = 0, 1, 0
          while n < m:
              yield b  #这里yield放在前面就是为了首先返回b的初始值 n+1才是迭代次数
              a, b = b, a + b   #yield后面的迭代的代码就是为了更新元素的值每使用一次更新一次
              n += 1
    >>> x = fib (10)
    >>> next(x)
    1
    >>> for i in x :
          print(i)
    
        
    1
    2
    3
    5
    8
    13
    21
    34
    55

     普通函数调用直接返回值,但是generator函数返回一个generator对象,后面学iterator可能会对这里的迭代有更好的理解。

  • 相关阅读:
    一些零碎小知识点积累随笔
    STM32学习笔记——新建工程模板步骤(向原子哥学习)
    记一次电信反射xss的挖掘与利用
    mysql字符串操作相关函数用法总结
    mysql学习笔记
    sigmoid function的直观解释
    多变量线性回归时使用梯度下降(Gradient Descent)求最小值的注意事项
    SAE中Python无法创建多线程的解决方案
    BCNF/3NF 数据库设计范式简介
    web.py下获取get参数
  • 原文地址:https://www.cnblogs.com/zy1120192493/p/12853901.html
Copyright © 2020-2023  润新知