zoukankan      html  css  js  c++  java
  • 零基础学python-19.8 生成器表达式:当迭代器遇上列表解析

    这一章节我们来讨论一下生成器表达式。

    从语法上来讲,生成器表达式跟列表解析一个样,只不过列表解析放在中括号里面,而生成器表达式放在小括号里面

    >>> [x for x in range(5)]
    [0, 1, 2, 3, 4]
    >>> (x for x in range(5))
    <generator object <genexpr> at 0x01E5F3A0>
    >>> list(x for x in range(5))
    [0, 1, 2, 3, 4]
    >>> 


    从上面的代码可以看见,小括号返回的是一个生成器,要使用list函数才能解析里面的内容。

    说白了,从结果上面来看,其实列表解析就是在使用list函数迫使生成器一次性生成所有结果。

    >>> g=(x for x in range(5))
    >>> next(g)
    0
    >>> next(g)
    1
    >>> 
    >>> [x for x in range(5)]
    [0, 1, 2, 3, 4]



    从执行上面来看,列表解析一次性在内存里面构建所有的结果,而生成器表达式只不过返回一个对象,而且这个对象支持迭代协议,只要在迭代环境当中都可以操作。

    >>> g=(x for x in range(5))
    >>> for item in g:
    	print(item)
    
    	
    0
    1
    2
    3
    4
    >>> 


    例如我们可以通过for来得到生成器里面的对象的值。

    >>> g=(x for x in range(5))
    >>> list(map(lambda x :x**2,g))
    [0, 1, 4, 9, 16]
    >>> 
    >>> g=(x for x in range(5))
    >>> list(filter(lambda x:x%2==0,g))
    [0, 2, 4]
    >>> 
    >>> g=(x for x in range(5))
    >>> list(sorted(g,reverse=True))
    [4, 3, 2, 1, 0]
    >>> 



    又如上面的代码,可以在map、filter和sorted等支持迭代协议的环境中,都可以支持对象的操作。

    总结:这一章节主要说明了生成器与列表解析之间的关系,以及生成器支持迭代协议,可以在迭代环境中对其中的对象进行操作。

    这一章节就说到这里,谢谢大家

    ------------------------------------------------------------------

    点击跳转零基础学python-目录

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Aurora 数据库支持多达五个跨区域只读副本
    Amazon RDS 的 Oracle 只读副本
    Amazon EC2 密钥对
    DynamoDB 读取请求单位和写入请求单位
    使用 EBS 优化的实例或 10 Gb 网络实例
    启动 LAMP 堆栈 Web 应用程序
    AWS 中的错误重试和指数退避 Error Retries and Exponential Backoff in AWS
    使用 Amazon S3 阻止公有访问
    路由表 Router Table
    使用MySQLAdmin工具查看QPS
  • 原文地址:https://www.cnblogs.com/raylee2007/p/4896712.html
Copyright © 2011-2022 走看看