from itertools import*# 合并for i in chain([1,2,3],['a','b','c']):print(i,end=' ')#chain.from_iterable 采用懒方式计算defmake_iterables_to_chain():yield[1,2,3]yield['a','b','c']for i in chain.from_iterable(make_iterables_to_chain()):print(i,end=" ")# zip() 返回一个迭代器,会多个迭代器的元素结合到一个元组中for i inzip([1,2,3],['a','b','c']):print(i)# 较短的迭代器为准
r1 =range(3)
r2 =range(2)print(list(zip(r1,r2)))# [(0,0),(1,1)] # zip_longest 以较长的迭代器 为准 缺省的 值为 Noneprint(list(zip_longest(r1,r2)))# islice() 函数返回一个迭代器,它按索引从输入迭代器返回所选择的元素for i in islice(range(100),5):print(i,end=" ")# 0 1 2 3 4for i in islice(range(100),5,10):print(i,end=" ")# 5 6 7 8 9for i in islice(range(100),0,100,10):print(i,end=" ")# tee() 函数根据一个原输入迭代器返回多个独立的迭代器(默认2 个)
r = islice(count(),5)
i1,i2 = tee(r)print('i1',list(i1))print('i2',list(i2))# tee() 创建的新的迭代器会 共享其输入迭代器,所以创建了新的迭代器后,不应再使用原迭代器for i in r:print(i,end=' ')if i >1:breakprint('i1',list(i1))# [3,4]print('i2',list(i2))# [3,4]# 原输入的一些值已经消费,新迭代器 不会再生成这些值
3.转换输入map
deftimes_two(x):return2* x
defmultiply(x,y):return(x,y,x*y)for i inmap(times_two,range(5)):# 映射print(i)
r1 =range(5)
r2 =range(5,10)for i inmap(multiply,r1,r2):print("{:d} * {:d} = {:d}",format(*i))# *i 表示元素分解# starmap 类似于 map 不过并不是 由多个迭代器构成一个元组,它使用 *语法 分解一个迭代器中的元素作为映射函数的参数
values =[(0,5),(1,6),(2,7)]for i in starmap(lambda x,y:(x,y,x * y),values):print("{:d} * {:d} = {:d}".format(*i))