python【5】-生成式,生成器
一、条件和循环
1. if语句
if <条件判断1>:
<执行1>
elif <条件判断2>:
<执行2>
else:
<执行4>
例如:
age=5
if age>=18:
print 'adult'
elif age>=6:
print 'teenager'
else:
print 'kid'
一定要注意条件语句结尾的冒号,以及代码段的缩进。
只要if参数是非零数值、非空字符串、非空list等,就判断为True
,否则为False
。
2.循环
range(num):返回0到num-1之间的整数。例如:
print range(5) >>>[0,1,2,3,4]
for循环:for x in ...
循环就是把每个元素代入变量x
,然后执行缩进块的语句。
s=0
for i in range(101):
s+=i
print s
while循环:只要条件满足,就不断循环,条件不满足时退出循环。
i=1
s=0 while(i<=100):
s=s+i
i=i+1 print s
3.迭代
dict类型for ..in ..迭代有以下几种方式:
d={'a':1,'b':2,'c':3}
默认迭代key
for k in d:
print k
iterkeys()返回key迭代器
for key in d.iterkeys():
print key
itervalues()返回value迭代器
for value in d.itervalues():
print value
iteritems()返回键值对迭代器
for key,value in d.iteritems():
print key+"="+str(value)
判断对象是否可迭代:通过collections模块的Iterable类型判断
from collections import Iterable
print isinstance(d,Iterable)
带下标迭代:Python内置的enumerate
函数可以把一个list变成索引-元素对
l=range(5)
for i,value in enumerate(l): print i,value
二、生成式
1.列表生成式
列表生成式是python受欢迎的语法之一,通过一句简洁的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理。语法格式为:
[exp for val in collection if condition]
相当于
result=[]
for val in collection:
if(condition):
result.append(exp)
我们看个例子:将列表中的字符串转换为小写组成新的列表。
L=['Hello',10,'World',None]
print [s.lower() for s in L if isinstance(s,str)]
运行结果: ['hello', 'world']
2.字典生成式
字典生成式基本格式如下:
{key-exp:val-exp for value in collection if condition}
例如:
print {i:i*10 for i in range(1,10) if(i%2==0)} 运行结果为: {8: 80, 2: 20, 4: 40, 6: 60}
3.集合生成式
集合生成式格式和列表生成式类似,只不过用的是大括号:
{exp for value in collection if condition}
例如:统计列表中字符串元素的各种长度。
L=['Hello',10,'World',None,'aa']
print {len(x) for x in L if isinstance(x,str)} 运行结果: set([2, 5])
4.嵌套列表生成式
嵌套列表生成式要注意for循环的顺序。
例如:我们想提取由两个列表组成的嵌套列表中,含有a的字符串:
L1=[['Cathy','Li'],['Zhang','Wang','Mike','Tom','Jack']]
print [name for list in L1 for name in list if name.count('a')>0] 运行结果: ['Cathy', 'Zhang', 'Wang', 'Jack']
我们还可以将嵌套列表中的数据进行扁平化展现,例如:
L2=[(1,3,5),(2,4,6),(100,200)]
print [value for t in L2 for value in t] 运行结果: [1, 3, 5, 2, 4, 6, 100, 200]
发现语法太简洁啦!!
三、生成器
在Python中,有一种自定义迭代器的方式,称为生成器(Generator)。
定义生成器的两种方式:
1.创建一个generator,只要把一个列表生成式的[]
改成()
,就创建了一个generator:
l=[x for x in range(1,10)]
print l g=(x for x in range(1,10))
print g.next()
print g.next() for x in g:
print x 运行结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
1
2
3
4
5
6
7
8
9
generator保存的是算法,每次调用next()
,就计算出下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
2.定义generator的另一种方法。如果一个函数定义中包含yield
关键字,那么这个函数就不再是一个普通函数,而是一个generator:
def fib(n):
a=1
b=1
i=0; yield a
yield b while(i<n):
a,b=b,a+b
i+=1
yield b for x in fib(10):
print x 运行结果:
1
1
2
3
5
8
13
21
34
55
89
144
生成器和普通函数区别:
普通函数是顺序执行,遇到return语句或者最后一行函数语句就返回;
而变成generator的函数,在每次调用next()
的时候执行,遇到yield
语句返回,再次执行时从上次返回的yield
语句处继续执行。
def test():
print 1
yield
print 2
yield
print 3
yield t=test()
t.next()#运行结果1
t.next()#运行结果2
t.next()#运行结果3
如需转载,请标明原文链接:http://www.cnblogs.com/janes/
python【5】-生成式,生成器的更多相关文章
- Python 列表生成式 生成器
[x for x in os.listdir("F:\XXX")] 生成器(x * x for x in range(10)) 如果列表元素按照某种算法推算出来,那我们就可以在循环 ...
- python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)
1.1迭代器 什么是迭代器: 迭代器是一个可以记住遍历的位置对象 迭代器对象从集合的第一个元素元素开始访问,直到所有元素被访问完结束,迭代器只能往前不会后退. 迭代器有两个基本方法:iter ,nex ...
- python协程函数应用 列表生成式 生成器表达式
协程函数应用 列表生成式 生成器表达式 一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._n ...
- python 基础 4.4 生成式 生成器 迭代器
一.生成式和生成器 列表生成式是python受欢迎的语法之一,通过一句简洁的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理. #/usr/bin/python #coding=u ...
- 一文搞懂Python迭代器和生成器
很多童鞋搞不懂python迭代器和生成器到底是什么?它们之间又有什么样的关系? 这篇文章就是要用最简单的方式让你理解Python迭代器和生成器! 1.迭代器和迭代过程 维基百科解释道: 在Python ...
- Day10 python高级特性-- 生成器 Generator
列表生成式可以创建列表,但是受内存限制,列表容量时有限的,创建一个巨量元素的列表,不仅占用很大的存储空间,当仅仅访问前几个元素时,后面的绝大多数元素占用的空间都被浪费了. 如果list的元素可以按照算 ...
- python高级之生成器&迭代器
python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...
- 【python】迭代器&生成器
源Link:http://www.cnblogs.com/huxi/archive/2011/07/01/2095931.html 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素 ...
- 第三篇:python高级之生成器&迭代器
python高级之生成器&迭代器 python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container ...
- python中的生成器函数是如何工作的?
以下内容基于python3.4 1. python中的普通函数是怎么运行的? 当一个python函数在执行时,它会在相应的python栈帧上运行,栈帧表示程序运行时函数调用栈中的某一帧.想要获得某个函 ...
随机推荐
- maven 打war包tomcat服务器乱码问题
今天用maven3的命令打war包,命令是mvn clean package -Dmaven.test.skip=true,打包后放在tomcat跑起来后发现tomcat的日志出现乱码. 后来在pom ...
- asp.net调用客户端WebBrowser 进行网站地址截屏
在asp.net网站中,如果要实现,在文本框中输入一个URL地址,就把该网页的页面整屏截下来,这段时间一直在研究这一块,在网上查了好多资料.自己又整合了一下. 其实也不是想象中的那么难.主要是通过调用 ...
- USB 设备的PID-Product ID,VID-Vendor ID
根据USB规范的规定,所有的USB设备都有供应商ID(VID)和产品识别码(PID),主机通过不同的VID和PID来区别不同的设备,VID 和PID都是两个字节长,其中,供应商ID(VID)由供应商向 ...
- 2017年1月4日 星期三 --出埃及记 Exodus 21:30
2017年1月4日 星期三 --出埃及记 Exodus 21:30 However, if payment is demanded of him, he may redeem his life by ...
- selenium-JS点击(项目应用)
public static JavascriptExecutor jse; 声明一个js public LogoutWebElements(WebDriver driver){ Logo ...
- mysql 替换某个字段中的某个字符
遇到这么个情况: 比如: Msql里面的某个表的某个字段里面存储的是一个人的地址,有一天这个地址的里面的某个地 名变了,那么他的地址也就要变: 比如: 原来是: number ...
- 【Spring】简单的Spring MVC入门例子
前言 测试特性需要搭建一个简单的Spring MVC的例子,遂记录之,只是例子,只为入门者之示例. 版本说明 声明POM文件,指定需引入的JAR. <properties> <spr ...
- mysql中常用的控制流函数
MySQL有4个函数是用来进行条件操作的,这些函数可以实现SQL的条件逻辑,允许开发者将一些应用程序业务逻辑转换到数据库后台. MySQL控制流函数: CASE WHEN[test1] THEN [r ...
- 历尽磨难之PL/SQL链接Oracle数据库
说起来都是泪啊,上司布置的任务需要远程连接Oracle数据库,说实话这又是我人生中的第一次.我听到以后觉得不是什么大问题,然而我错了..错的很厉害! 我搞了一天一夜才弄好,这里面原因有很多,大体来讲还 ...
- Javascript 知识点整理
1.十进制和十六进制相互转换 /* 十六进制转十进制 */ var test = FF; var x = parseInt(test ,16); //方法一 x = parseInt('0x'+tes ...