您的位置:首页 > 编程语言 > Python开发

Python基础(8)_迭代器、生成器、列表解析

2017-06-16 16:54 609 查看
一、迭代器

1、什么是迭代

  1重复
  2下次重复一定是基于上一次的结果而来

1#模拟tail-fa.txt
2importtime
3deftail(filepath,encoding):
4'''从文件读取最后一行内容'''
5withopen(filepath,encoding='utf-8')asf:
6f.seek(0,2)
7whileTrue:
8line=f.readline()
9ifline:
10yieldline
11else:
12time.sleep(0.5)
13defgrep(lines,pattern):
14'''guolv内容,如果有就返回'''
15forlineinlines:
16ifpatterninline:
17#print(line)
18yieldline
19
20g=tail('homework01.txt')
21g2=grep(g,'err0r')
22g3=grep(g2,'404')
23foriing3:
24print(i)


用生成器模拟tail-f|grep'error'功能
三、列表解析

python的三元运算格式如下:

  result=值1ifx<yelse值2这个是什么意思呢,就是结果=值1if条件1else值2

列表解析:

  用三元表达式,将结果写入列表,即为列表解析



列表解析实例:

1要求:列出1~10所有数字的平方
2####################################################
31、普通方法:
4>>>L=[]
5>>>foriinrange(1,11):
6...L.append(i**2)
7...
8>>>printL
9[1,4,9,16,25,36,49,64,81,100]
10####################################################
112、列表解析
12>>>L=[i**2foriinrange(1,11)]
13>>>printL
14[1,4,9,16,25,36,49,64,81,100]


1要求:列出1~10中大于等于4的数字的平方
2####################################################
31、普通方法:
4>>>L=[]
5>>>foriinrange(1,11):
6...ifi>=4:
7...L.append(i**2)
8...
9>>>printL
10[16,25,36,49,64,81,100]
11####################################################
122、列表解析
13>>>L=[i**2foriinrange(1,11)ifi>=4]
14>>>printL
15[16,25,36,49,64,81,100]


1要求:列出"/var/log"中所有已'.log'结尾的文件
2##################################################
31、普通方法
4>>>importos
5>>>file=[]
6>>>forfileinos.listdir('/var/log'):
7...iffile.endswith('.log'):
8...file.append(file)
9...
10>>>printfile
11['anaconda.ifcfg.log','Xorg.0.log','anaconda.storage.log','Xorg.9.log','yum.log','anaconda.log','dracut.log','pm-powersave.log','anaconda.yum.log','wpa_supplicant.log','boot.log','spice-vdagent.log','anaconda.program.log']
12##################################################
132.列表解析
14>>>importos
15>>>file=[fileforfileinos.listdir('/var/log')iffile.endswith('.log')]
16>>>printfile
17['anaconda.ifcfg.log','Xorg.0.log','anaconda.storage.log','Xorg.9.log','yum.log','anaconda.log','dracut.log','pm-powersave.log','anaconda.yum.log','wpa_supplicant.log','boot.log','spice-vdagent.log','anaconda.program.log']


四、生成器解析

1#############################################
2egg_list=['鸡蛋%s'%iforiinrange(10)]#列表解析
3
4#############################################
5
6laomuji=('鸡蛋%s'%iforiinrange(10))#生成器表达式
7print(laomuji)
8print(next(laomuji))#next本质就是调用__next__
9print(laomuji.__next__())
10print(next(laomuji))


总结:

  1.把列表解析的[]换成()得到的就是生成器表达式

  2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存

  3.Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。

例如,sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接这样计算一系列值的和:

sum(x**2forxinxrange(4))

而不用多此一举的先构造一个列表:

sum([x**2forxinxrange(4)])


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: