这一章节我们来讨论一下生成器表达式。
从语法上来讲,生成器表达式跟列表解析一个样,只不过列表解析放在中括号里面,而生成器表达式放在小括号里面
>>> [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)01234>>>
例如我们可以通过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-目录
版权声明:本文为博主原创文章,未经博主允许不得转载。
人的不幸缘于欲望,所以知足者长乐。