3-4 如何对迭代器做切片操作

标准库中的itertools.islice,它能返回一个迭代对象切片的生成器
使用方式:
islice(iterable, stop) --> islice object
islice(iterable, start, stop[, step]) --> islice object
支持2,3,4个参数,不支持负索引

islice(iterable, stop) --> islice object
islice(iterable, start, stop[, step]) --> islice object
 |
 |  Return an iterator whose next() method returns selected values from an
 |  iterable.  If start is specified, will skip all preceding elements;
 |  otherwise, start defaults to zero.  Step defaults to one.  If
 |  specified as another value, step determines how many values are
 |  skipped between successive calls.  Works like a slice() on a list
 |  but returns an iterator.

注意:islice会消耗原迭代器对象

from itertools import islice
i = iter(range(10))

s = islice(i,3,6) # 3-6,步长默认为1
for x in s:
    print(x)  # 3,4,5

print("------")
for y in i:
    print(y) # 输出被消耗后的结果:6,7,8,9

实际案列:
有某个文本文件,我们想读取其中某范围的内容,如100-300行的内容。
python中的文本文件是可迭代对象,我们是否可以使用类似列表切片的方式
得到一个包含100-300行内容的生成器?
例如:
f = open('./a.txt')
f[100:300]

from itertools import islice

f = open("../static/风衣",encoding="utf-8")

s = islice(f,1,5) # 1-5行内容,步长为1
for line in s:
    print(line.strip())

print('----------------')

s = islice(f,3) # 1-3行内容,步长为1
for line in s:
    print(line.strip())
print('----------------')

s = islice(f,10,None,2) # 10-末尾行内容,步长为2
for line in s:
    print(line.strip())
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容