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的列表生成式和生成器的更多相关文章
- 【转】Python之列表生成式、生成器、可迭代对象与迭代器
[转]Python之列表生成式.生成器.可迭代对象与迭代器 本节内容 语法糖的概念 列表生成式 生成器(Generator) 可迭代对象(Iterable) 迭代器(Iterator) Iterabl ...
- Python之列表生成式、生成器、可迭代对象与迭代器
本节内容 语法糖的概念 列表生成式 生成器(Generator) 可迭代对象(Iterable) 迭代器(Iterator) Iterable.Iterator与Generator之间的关系 一.语法 ...
- python 之 列表生成式、生成器表达式、模块导入
5.16 列表生成式 l=[]for i in range(100): l.append('egg%s' %i)print(l)l=['egg%s' %i for i in range(100 ...
- Python学习笔记(六)Python的列表生成式、生成器
列表生成式 List Comprehensions 列表生成式是Python内置的非常简单却强大的可以用来创建list的生成式. 简单的数值范围的list可以使用一下方式生成: >>> ...
- Python 中列表生成式和生成器
列表生成式 即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1,2,3,4,5,6,7,8,9,10]可以用l ...
- python基础----列表生成式、生成器表达式
结论: 1.把列表解析的[]换成()得到的就是生成器表达式 2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存 3.Python不但使用迭代器协议,让for循环变得更加通用 ...
- Python基础-列表生成式和生成器表达式
一.列表生成式(List Comprehension) 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list ...
- Python之列表生成式、生成器
列表生成式 ——可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁: >>> [x * x for x in range(1, 11)] [1, 4, ...
- python学习——列表生成式,生成器和迭代器
列表生成式 列表生成式,是python内置的非常简单却强大的可以用来创建list的生成式.它可以极大的简化语句. """列表生成式""" # ...
随机推荐
- selenium代理
selenium.KeyDown("id=ctaskName", "d"); selenium.KeyPress("id=cta ...
- nginx的常用命令
一.nginx的解压安装 #tar xzvf nginx-1.6.0.tar.gz #cd nginx-1.6.0 #./configure --prefix=/home/weixin/loca ...
- ASP.NET Core - 各项配置
之前搭建好了各项开发环境,现在来说说ASP.NET Core的各项配置.项目结构.以及在请求管道中挂载的各式各样的中间件.今天先来探讨探讨其各项配置及其项目结构 ASP.NET Core和上一代F ...
- MySQL入门很简单: 14MySQL日志
二进制日志: 以二进制文件的形式记录了数据库中的操作,但不记录查询语句 错误日志: 记录MySQL服务器的启动,关闭和运行错误等信息 通用查询日志: 记录用户登录和记录查询的信息 慢查询日志: 记录执 ...
- 在ABAP里取得一个数据库表记录数的两种方法
方法1:使用函数EM_GET_NUMBER_OF_ENTRIES 这个函数使用起来很简单,只需要将想查询的数据库表名称维护进输入参数IT_TABLES: 上图说明这个函数支持批量操作,我查询的两张表名 ...
- Recent plan + Summary (two weeks)
Plan: Homework: B365 (next week) B392, B335 Interview: Friday, do the assignment Thursday Summary: I ...
- Xapian简明教程(未完成)
第一章 简介 1.1 简介 Xapian是一个开源的搜索引擎库,它可以让开发者自定义的开发一些高级的的索引和查找因素应用在他们的应用中. 通过阅读这篇文档,希望可以帮助你创建第一个你的索引数据库和了解 ...
- Apache2.4 authz_core_module模块使用
Description: Core Authorization Status: Base Moduledentifier: authz_core_module Sourceile: mod_authz ...
- NYOJ(42)欧拉图
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=42 我是参考了红黑联盟的结题报告了的.但是有一个位置,应该是红黑联盟写错了吧,就是那个连通 ...
- JS获取页面传过来的值
利用JS获取页面的传值,此方法只适应Get传值. 获取页面之间的传值,在后台我们很容易获取,那我们在前台只利用JS怎么写呢? 在看代码之前你需要了解的 ① 参考:W3C Location 对象 Loc ...