一、用于过滤的生成器函数

  - 从输入的可迭代对象中产出元素的子集,而不修改元素本身

import itertools

l1 = [1,2,3,4,5]

l2 = [True,False,True,False,True]

def predict(k):

    return l2[k-1]

# compress(it,selector_it)并行处理两个可迭代对象,
# 如果selector_it中的元素是真值,产出it中对应的元素
# 输出: 1,3,5
for i in itertools.compress(l1,l2):
print(i) # takewhile(predicate,it)当predicate返回真值时产出对应的元素,然后停止不再继续检查
# 输出:1
for i in itertools.takewhile(predict,l1):
print(i) # dropwhile(predicate,it)处理it,跳过predicate计算结果为True的元素后,
# 不再进一步检查,产出剩下的元素
# 输出:2,3,4,5
for i in itertools.dropwhile(predict,l1):
print(i) # filter(predicate,it)把it中的各个元素传给predicate,
# 如果predicate(item)返回真,则产出
# 输出:1,3,5
for i in filter(predict,l1):
print(i) # filterfalse(predicate,it)与filter类似,逻辑相反
# 输出:2,4
for i in itertools.filterfalse(predict,l1):
print(i) # islice(it,stop)作用类似于s[:stop]
# 输出:1,2,3
for i in itertools.islice(l1,3):
print(i) # islice(it,start,stop,step=1)作用类似于s[start:stop:step]
# 输出:1,3,5
for i in itertools.islice(l1,0,5,2):
print(i)

二、用于映射的生成器函数

  - 在输入的可迭代对象中的各个元素上做计算,然后返回结果。

import itertools
import operator l1 = [1,2,3,4,5] # accumulate(it)产出累计总和
# 输出:1,36,10,15
for i in itertools.accumulate(l1):
print(i) def sub(a,b):
return a-b # accumulate(it,func)把前两个元素传给func,
# 然后把计算结果和下一个元素传给它,以此类推
# 输出:1,1,1,1,1
for i in itertools.accumulate(l1,min):
print(i) # enumerate(it,start=0)产出由两个元素组成的元组,结构是(index,item)
# 其中index从start开始计数,item从it中获取
# 输出:(0,1),(1, 2),(2, 3),(3, 4),(4, 5)
for i in enumerate(l1,0):
print(i) def double(k):
return k*2 # map(func,it)把it中的各个元素传给func,产出结果
# 输出:2,4,6,8,10
for i in map(double,l1):
print(i) def join(*a):
return '_'.join(a) l1 = ['a','b','c']
l2 = ['a','b','c']
l3 = ['a','b','c'] # map(func,it1,it2,...)如果有多个可迭代对象,
# 那么func必须能接受多个参数,并行处理各个可迭代对象
# 输出:a_a_a,b_b_b,c_c_c
for i in map(join,l1,l2,l3):
print(i) # starmap(func,it)把it中各个元素传给func,产出结果
# 这个函数要求it中的元素也是可迭代对象,func的参数类型为*var
# 输出:a,bb,ccc
for i in itertools.starmap(operator.mul,enumerate(l1,1)):
print(i)

三、用于合并的生成器函数

  - 从输入的多个可迭代对象中产出元素

import itertools

l1 = [1,2,3,4]

l2 = [6,7,8,9,10]

# itertools.chain(it1,...,itN) 返回一个生成器
# 先产出it1中所有元素,然后产出it2中所有元素,以此类推
l3 = list(itertools.chain(l1,l2))
# l3: [1, 2, 3, 4, 6, 7, 8, 9, 10]
print('l3:',l3) # zip(it1,...,itN):返回一个生成器
# 并行从输入的各个可迭代对象中获取元素,产出由N个元素组成的元组
# 只要有一个可迭代对象到头了就停止,不报错
l4 = list(zip(l1,l2))
# l4: [(1, 6), (2, 7), (3, 8), (4, 9)]
print('l4:',l4) # itertools.chain.from_iterable(it) 返回一个生成器
# 参数it是一个由可迭代对象组成的可迭代对象,函数将这些对象拆分后产出
l5 = list(itertools.chain.from_iterable(l4))
# l5: [1, 6, 2, 7, 3, 8, 4, 9]
print('l5:',l5) # 但只会拆分一层,不会递归拆分
# l6: [((1, 6), (1, 6)), ((2, 7), (2, 7)), ((3, 8), (3, 8)), ((4, 9), (4, 9))]
l6 = list(zip(l4,l4))
print('l6:',l6) # l7:[(1, 6), (1, 6), (2, 7), (2, 7), (3, 8), (3, 8), (4, 9), (4, 9)]
l7 = list(itertools.chain.from_iterable(l6))
print('l7:',l7) l8 = [1,2]
l9 = [3,4]
l10 = [5,6]
# itertools.product(it1,...,itN) 返回一个生成器
# 计算笛卡尔积,从输入的各个可迭代对象中获取元素,合并成由N个元素组成的元组
l11 = list(itertools.product(l8,l9,l10))
# l11:[(1, 3, 5), (1, 3, 6), (1, 4, 5), (1, 4, 6), (2, 3, 5), (2, 3, 6), (2, 4, 5), (2, 4, 6)]
print('l11:',l11) # itertools.zip_longest(it1,...,itN,fillvalue=None) 返回一个生成器
# 并行从输入的各个可迭代对象中获取元素,产出由N个元素组成的元组
# 等到最长的可迭代对象到头后才停止,空缺的值用fillvalue填充
l12 = list(itertools.zip_longest(l1,l2,fillvalue='fill'))
# l12: [(1, 6), (2, 7), (3, 8), (4, 9), ('fill', 10)]
print('l12:',l12)

四、用于扩展输入的可迭代对象的生成器

import itertools

l1 = [1,2,3,4,5]

# itertools.combinations(it,out_len) 返回一个生成器
# 把it中out_len个元素的组合以元组的形式输出
l2 = list(itertools.combinations(l1,2))
# l2: [(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)]
print('l2:',l2) # itertools.combinations_with_replacement(it,out_len) 返回一个生成器
# 把it中out_len个元素的组合以元组的形式输出,包括相同元素
l3 = list(itertools.combinations_with_replacement(l1,2))
# l3: [(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 2), (2, 3), (2, 4), (2, 5), (3, 3),
# (3, 4), (3, 5), (4, 4), (4, 5), (5, 5)]
print('l3:',l3) # itertools.count(start=0,step=1) 返回一个生成器
# 从start开始不断产生数字,按step指定的步幅增加
l4 = list(itertools.islice(itertools.count(start=2,step=2),5))
# l4:[2, 4, 6, 8, 10]
print('l4:',l4) # itertools.cycle(it) 返回一个生成器
# 从it中拿出各个元素的副本,按顺序重复不断地产出各个元素
l5 = list(itertools.islice(itertools.cycle('ABC'),10))
# l5: ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A']
print('l5:',l5) # itertools.permutations(it,out_len=None) 返回一个生成器
# 生成out_len个it产出的元素的排列
l6 = list(itertools.permutations('ABC'))
# l6: [('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]
print('l6:',l6) # itertools.repeat(item,[times]) 返回一个生成器
# 重复不断产出指定元素,除非提供times指定次数
l7 = list(itertools.repeat(7,5))
# l7: [7, 7, 7, 7, 7]
print('l7:',l7)

五、用于重新排列元素的生成器函数

  - 以某种方式进行重排列

import itertools

# itertools.groupby(it,key=None) 返回一个迭代器
# 产出由两个元素组成的元素,形式为(key,group),其中key是分组标准,
# group是生成器,用于产生分组中的元素
# 使用这个函数之前必须对输入的可迭代对象使用分组标准进行排序,否则输出会混乱 for char, group in itertools.groupby('LLLLAAGGG'):
# L -> ['L', 'L', 'L', 'L']
# A -> ['A', 'A']
# G -> ['G', 'G', 'G']
print(char,'->',list(group)) animals = ['duck','eagle','rat','giraffe','bear','bat','dolphin','shark','lion']
animals.sort(key=len) for length,group in itertools.groupby(animals,len):
# 3 -> ['rat', 'bat']
# 4 -> ['duck', 'bear', 'lion']
# 5 -> ['eagle', 'shark']
# 7 -> ['giraffe', 'dolphin']
print(length,'->',list(group)) # reversed(seq) 从后向前,倒序产出seq中的元素
# seq必须是序列,或者是实现了__reversed__特殊方法的对象
for length,group in itertools.groupby(reversed(animals),len):
# 7 -> ['dolphin', 'giraffe']
# 5 -> ['shark', 'eagle']
# 4 -> ['lion', 'bear', 'duck']
# 3 -> ['bat', 'rat']
print(length,'->',list(group)) # itertools.tee(it,n=2) 返回一个迭代器
# 产生多个迭代器,每个迭代器都和输入的可迭代对象一致
g1,g2,g3 = itertools.tee('ABC',3)
l1 = list(g1)
l2 = list(g2)
l3 = list(g3)
# l1: ['A', 'B', 'C']
print('l1:',l1)
# l2: ['A', 'B', 'C']
print('l2:',l2)
# l3: ['A', 'B', 'C']
print('l3:',l3)

Python标准库中的生成器函数的更多相关文章

  1. python 生成器(四):生成器基础(四)标准库中的生成器函数

    os.walk 这个函数在遍历目录树的过程中产出文件名,因此递归搜索文件系统像for 循环那样简单. 用于过滤的生成器函数 模块  函数  说明 itertools  compress(it,sele ...

  2. Python 标准库中的装饰器

    题目描述 1.简单举例 Python 标准库中的装饰器 2.说说你用过的 Python 标准库中的装饰器 1. 首先,我们比较熟悉,也是比较常用的 Python 标准库提供的装饰器有:property ...

  3. Python标准库:内置函数hasattr(object, name)

    Python标准库:内置函数hasattr(object, name) 本函数是用来判断对象object的属性(name表示)是否存在.如果属性(name表示)存在,则返回True,否则返回False ...

  4. (转)python标准库中socket模块详解

    python标准库中socket模块详解 socket模块简介 原文:http://www.lybbn.cn/data/datas.php?yw=71 网络上的两个程序通过一个双向的通信连接实现数据的 ...

  5. Python标准库-数字的处理函数(math模块)

    Python标准库-数字的处理函数(math模块) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. #!/usr/bin/env python #_*_conding:utf-8_* ...

  6. (转)Python标准库:内置函数print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

    原文:https://blog.csdn.net/caimouse/article/details/44133241 https://www.cnblogs.com/owasp/p/5372476.h ...

  7. Python标准库:内置函数classmethod(function)

    把类函数当作类的一个方法返回. 类方法第一个參数是指明类,跟类中函数一样,第一个參数是指明类实例. 类方法修饰符採用以下的格式来使用: class C: @classmethod def f(cls, ...

  8. C++实现python标准库中的Counter

    看python standard library by exmple里面提到一个Counter容器,它像muliset一样,能够维持一个集合,并在常量时间插入元素.查询某个元素的个数,而且还提供了一个 ...

  9. Python标准库:内置函数ascii(object)

    这个函数跟repr()函数一样,返回一个可打印的对象字符串方式表示.当遇到非ASCII码时,就会输出\x,\u或\U等字符来表示. 与Python 2版本号里的repr()是等效的函数. 样例: #a ...

随机推荐

  1. Golang之fmt格式“占位符”

    golang的fmt包实现了格式化I/O函数: package main import "fmt" type Human struct { Name string } func m ...

  2. PKUWC2019 真·游记

    由于我这个大傻逼考试结果实在是没法看,所以这篇游记将尽可能略去和考试有关的内容,变成一篇真正的游记…… 接下来的内容中将会出现各种旅游攻略,寻求干货的同学可以提前左转了. Day -7 学考终于结束了 ...

  3. android studio快捷键大全

    ----常用快捷键 1.Ctrl+E,可以显示最近编辑的文件列表 2.Shift+Click可以关闭文件 3.Ctrl+[或]可以跳到大括号的开头结尾 4.Ctrl+Shift+Backspace可以 ...

  4. Docker添加官方加速源(必须)

    在国内使用Docker必须用加速镜像不然的话无论是pull 官方的还是私有的镜像都会WAIT TIME EXCEED 下面给出macos的添加方式,非常简单 macOS 对于使用 macOS 的用户, ...

  5. C#使用Log4Net记录日志(转)

    出处:http://www.cnblogs.com/wangsaiming/archive/2013/01/11/2856253.html 第一步:下载Log4Net 下载地址:http://logg ...

  6. C# Redis Server分布式缓存编程(二)(转)

    出处;http://www.cnblogs.com/davidgu/p/3263485.html 在Redis编程中, 实体和集合类型则更加有趣和实用 namespace Zeus.Cache.Red ...

  7. python3 二叉树的存储和三种遍历

    #coding:utf-8 class node(): def __init__(self,k=None,l=None,r=None): self.key=k; self.left=l; self.r ...

  8. 关于SQLServer无法对数据库'XXX'执行删除,因为它正用于复制。错误:'3724' 的解决方案

    关于这个错误,是因为在服务器上想把数据库复制到本地,使用了“发布.订阅”方案,结果后来没成功,删除本地数据库的时候出现了这个错误,说“无法对数据库'XXX'执行删除,因为它正用于复制”. 解决方案:只 ...

  9. ZOJ2208 To and Fro 2017-04-16 19:30 45人阅读 评论(0) 收藏

    To and Fro Time Limit: 2 Seconds      Memory Limit: 65536 KB Mo and Larry have devised a way of encr ...

  10. SQL Server查询所有存储过程信息、触发器、索引

    1. [代码]查询所有存储过程      01 select Pr_Name as [存储过程], [参数]=stuff((select ','+[Parameter] 02 from ( 03 se ...