-
展开嵌套序列
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")