对迭代器做切片操作
实际案例:读取文件一定范围的的内容,例如获取5行到10行内容。Python文本文件是可迭代对象,是否可以利用列表切片的方式实现5到10行文本内容的生成器。
案例文件内容
方法一:readlines()
f=open(r'C:\Users\zengjiamin\Desktop\python.txt')
L=f.readlines()
for x in L[5:10]:
print(x)
缺点:readlines()会把文件所有内容读取出来,如果某日志文件内容特别大好几个G,全部读取可能会导致灾难性的问题。
方法二:迭代方式 使用标准库中的itertools.islice,返回一个迭代对象切片生成器。
from itertools import islice
f=open(r'C:\Users\zengjiamin\Desktop\python.txt')
f.seek(0)#因为之前使用过f.readlines(),导致文件指针已经跑到文件内容末尾处。使用f.seek(0)使文件指针回到起始点。
for x in islice(f,5,10):
print(x)
islice帮助
islice(iterable, stop) --> islice object
islice(iterable, start, stop[, step]) --> islice object
在for语句中迭代多个可迭代对象
实际案例一(并行):学生期末考试成绩,语文,英文,数学分别存在三个列表里。同时迭代三个列表,计算每个学生总分。
zip()函数:
函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表
语法:
zip(iter1 [,iter2 [...]]) --> zip object
>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b) # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c) # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped) # 与 zip 相反,可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]
案例实现
from random import randint
#随机生成一个班10人的语文,数学,英语成绩。
chinese = [randint(60,100) for x in range(10) ]
math = [randint(60,100) for x in range(10) ]
English = [randint(60,100) for x in range(10) ]
total=[]
for c,m,e in zip(chinese,math,English):
total.append(c+m+e)
print(total)
实际案例二(串行):某年级有三个班,每个班的语文成绩存分别三个列表中,依次迭代每个列表,统计全年级英语高于90的人数。
标准库itertools.chain:
可以把一组迭代对象串联起来,形成一个更大的迭代器
语法
chain(*iterables) --> chain object
from random import randint
from itertools import chain
#随机生成三个班每个人的语文成绩
c1 = [randint(60,100) for x in range(10) ]
c2 = [randint(60,100) for x in range(11) ]
c3 = [randint(60,100) for x in range(12) ]
count=0
for s in chain(c1,c2,c3):
if s>=90:
count+=1
print(count)