【2017-09-27】迭代器与生成器(五)

  • 展开嵌套序列
    yield from运用
    yield from iterable本质上等于for item in iterable
    示例:把多层嵌套的序列展开成一个单层列表
>>> from collections import Iterable
#>>>yield from flatten(i)相当于for x in  flatten(i):yield x
>>> def flatten(iterms,ignore_types=(str,bytes)):
    for i in iterms:
        if isinstance(i,Iterable) and not isinstance(i,ignore_types):
            yield from flatten(i)
        else:
            yield i
>>> items = [1, 2, [3, 4, [5, 6], 7], 8]
>>> for x in flatten(items):
    print(x)
    
1
2
3
4
5
6
7
8
>>> items1 = ['Dave', 'Paula', ['Thomas', 'Lewis']]
>>> for x in flatten(items1):
    print(x)

    
Dave
Paula
Thomas
Lewis
>>> 
  • 合并后的排序迭代对象
    一系列排序序列,将它们合并后得到一个排序序列并在上面迭代遍历
    运用heapq模块merge()函数,输入序列必须是排过序的,且它不会预先读取所有数据到堆栈中或者预先排序,也不会对输入做任何的排序检测。
    它的工作原理:仅仅检查所有序列的开始部分并返回最小的那个,这个过程一直会持续直到所有
    输入序列中的元素都被遍历完。
>>> import heapq
>>> a=[1, 4, 7, 10]
>>> b=[2, 5, 6, 11]
>>> for c in heapq.merge(a,b):
    print(c)
    
1
2
4
5
6
7
10
11

反过来验证,输入必须是排过序的,如果不是呢?

>>> a=[2,1,3]
>>> b=[2, 5, 6, 11]
>>> for c in heapq.merge(a,b):
    print(c)

    
2
1
2
3
5
6
11
>>> 
  • 迭代器代替 while 无限循环
    内置函数iter()的运用,返回指定对象的迭代器
    • iter(iterable) 参数为可迭代对象
    • iter(callable, sentinel) 持续调用参数callable直至其返回sentinel
f = open('1.txt')
for chunk in iter(lambda: f.read(10), ''):
       print(chunk)
       print("\n")
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容