zoukankan      html  css  js  c++  java
  • python的列表生成式和生成器

      1.列表生成式是Python受欢迎的语法之一,通过一句简洁的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理,语法格式为:

    [exp for val in collection if condition]

      相当于

    resul = []
    for val in collection:
        if(condition):
            result.appen(exp)

      例子:求1到10的偶数的平方,代码如下:

    li = [x*x  for x in xrange(1,11) if x%2==0]
    print (li)

      结果:[4, 16, 36, 64, 100]

      解释:

    • 依次取出xrange(1,11)从1到10的数字
    • 判断x*x是偶数,就保留,存在新的列表里
    • 把所有符合x*x是偶数的元素都放到新的列表中返回

    2.生成器

      通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

      所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。

      要创建一个generator,有很多种方法,第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:

    lt = (x*x for x in xrange(1,10) if x%2 == 0)
    print (lt)
    print (type(lt))
    for i in lt:
        print (i)

      可以通过调用next()函数打印出来。但正确的方法是使用for循环。结果:

      第二种方法就是使用yield关键字来定义,例子:

    def funb(n):
        sum = 0
        i = 0
        while(i<n):
            sum = sum +i
            i+=1
            yield(sum)
    print (type(funb(10)))
    for x in funb(10):
        print (x)

      结果:

      解释:函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

      小结:generator是非常强大的工具,在Python中,可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator。要理解generator的工作原理,它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。

      3.生成式和生成器的区别

      生成式:一次性生成所有的数据,然后保存在内存中,适合小量的数据

      生成器:返回一个可迭代对象及generator对象,必须通过循环才可以一一取出所有的结果

      可迭代对象:可以通过循环调用出来的,就是可迭代的对象,比如list,tuple,dict,生成式,生成器
      迭代器:被next()函数调用并不断返回下一个值的对象称为迭代器

  • 相关阅读:
    python进阶(1)--多进程与多线程概念
    mysql数据库(5)--表的相关操作
    mysql数据库(4)--表删除操作
    备注
    mysql数据库(3)--mysql的执行顺序
    mysql数据库(2)--窗口函数之序号函数
    Spring MVC 返回中文乱码
    郁闷,郁闷啊
    Struts2 下载文件
    js文件加载
  • 原文地址:https://www.cnblogs.com/huangdongju/p/7780367.html
Copyright © 2011-2022 走看看