python中itertools模块介绍---02

chain(*iterables):

源代码:

def chain(*iterables):
    for it in iterables:
        for element in it:
            yield element

chain函数接收多个参数(iterables),并且对iterables进行遍历,返回每个iterable中的元素。最终结果就像返回的所有元素均来自同一个单一的序列,例如:

>>>a=chain(‘ab‘,‘cd‘)
>>>a.next()
a
>>>a.next()
b
>>>a.next()
c
>>>a.next()
d

izip(*iterables):

源代码:

def izip(*iterables):
    iterators=map(iter,iterables)
    while iterators:
        yield tuple(map(next,iterators))

首先调用map函数,将iterables变为迭代器列表。当列表不为空时,再次调用map函数,对iterators中的每一个迭代器进行next,形成列表,然后变为元组返回。例如:

>>>a=izip("abc","cd")
>>>a.next()
(‘a‘,‘c‘)
>>>a.next()
(b,d)

compress(data,selectors):

源代码:

def compress(data,selectors):
    return (d for d,s in izip(data,selector) if s)

compress函数的实现借助了izip函数。采用生成器表达式,当izip返回的元组的第1个(从0开始)元素为真时,取该元组的第0个元素。例如:

>>>a=compress(‘abc‘,[0,1,2])
>>>a.next()
b
>>>a.next()
c

dropwhile(predicate,iterable):

源代码:

def dropwhile(predicate,iterable):
    iterable=iter(iterable)
    for x in iterable:
        if not predicate(x):
            yield x
            break
    for x in iterable:
        yield x

对iterable中的每一个元素都调用predicate函数,直到predicate(x)函数返回False时,才会将该项及后续项返回。例如:

>>>a=dropwhile(lambda x:x>3,[5,7,6,1,1,4])
>>>a.next()
1
>>>a.next()
1
>>>a.next()
4

groupby(iterable[,key]):

源代码:

class groupby(object):
    def __init__(self,iterable,key=None):
        if key is None:
            key=lambda x:x
        self.keyfunc=key
        self.it=iter(iterable)
        self.tgtkey=self.currkey=self.currvalue=object()
    def __iter__(self):
        return self
    def next(self):
        while self.currkey==self.tgtkey:
            self.currvalue=next(self.it)
            self.currkey=self.keyfunc(self.currvalue)
        self.tgtkey=self.currkey
        return (self.currkey,self._grouper(self.tgtkey))
    def _grouper(self,tgtkey):
        while self.currvalue==tgtkey:
            yield self.currvalue
            self.currvalue=next(self.it)
            self.currkey=self.keyfunc(self.currvalue)

groupby函数的作用是依据key对iterable进行分组。当没有指定key时,key赋值为一个匿名函数,该匿名函数返回对象本身。此时,将相邻的、且相同的元素分为一组。如"aabbcdb"将分为"aaa","bb","c","d","b"这几组。当指定key时,则按key的规则进行分组。例如key=len,那么将长度相同的元素分为一组。如a=["12","23","123","1234"]分为["12","23"],["123"],["1234"]这几组。最后返回的是一个元组(self.currkey,self._grouper(self.tgtkey))。元组的第0个元素是分组的键值,第1个元素是一个迭代器(该组中具体包含的内容)。例如:

>>>a=groupby("aaabbcde")
>>>a.next()
(‘a‘,迭代器)
>>>a.next()
(‘b‘,迭代器)
>>>a=groupby(["abc","bcd","ab","bc"],len)
>>>a.next()
(3,迭代器)
>>>a.next()
(2,迭代器)

ifilter(predicate,iterable):

源代码:

def ifilter(predicate,iterable):
    if predicate is None:
        predicate=bool
    for x in iterable:
        if predicate(x):
            yield x

当predicate(x)为真时,返回x。例如:

>>>a=ifilter(lambda x:x>2,[1,2,3,4])
>>>a.next()
3
>>>a.next()
4

iflterfalse(predicate,iterable):

与iflter函数相反,当predicate(x)为假时,x被返回。源代码和具体的实例略。

时间: 2024-10-11 12:52:13

python中itertools模块介绍---02的相关文章

python中itertools模块介绍---01

itertools模块中包含了很多函数,这些函数最终都生成一个或多个迭代器,下面对这些函数进行介绍: 为了能够使用itertools中的函数,需要将该模块导入: >>>from itertools import * count(start=0,step=1): 源代码为: def count(start=0,step=1):     n=start     while True:         yield n         n+=step 从源代码可以看出,count函数产生一个生成

python中itertools模块介绍---03

product(*iterables[,repeat]): 源代码: def product(*args,**kwds):     pools=map(tuple,args)*kwds.get("repeat",1)     result=[[]]     for pool in pools:         result=[x+[y] for x in result for y in pool]     for prod in result:         yield tuple(

Python中的模块介绍和使用

在Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一下Python中的模块. 说的通俗点:模块就好比是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块 1.import 在Python中用关键字import来引入某个模块,比如要引用模块math,就可以在文件最开始的地方用import math来引入. 形如: importmodu

python中itertools模块zip_longest函数实现逻辑

最近在看流畅的python,在看第14章节的itertools模块,对其itertools中的相关函数实现的逻辑的实现 其中在zip_longest(it_obj1, ..., it_objN, fillvalue=None)时,其函数实现的功能和内置zip函数大致相同(实现一一对应), 不过内置的zip函数是已元素最少对象为基准,而zip_longest函数是已元素最多对象为基准,使用fillvalue的值来填充 以下是自己总结此函数的大致实现方法,和官方方法不同: 思路大致如此: 找出元素个

Python中fileinput模块介绍

fileinput模块可以对一个或多个文件中的内容进行迭代.遍历等操作. 该模块的input()函数有点类似文件readlines()方法,区别在于: 前者是一个迭代对象,即每次只生成一行,需要用for循环迭代. 后者是一次性读取所有行.在碰到大文件的读取时,前者无疑效率更高效. 用fileinput对文件进行循环遍历,格式化输出,查找.替换等操作,非常方便. [典型用法] import fileinput for line in fileinput.input(): process(line)

python 中 urlparse 模块介绍

urlparse模块主要是用于解析url中的参数  对url按照一定格式进行 拆分或拼接 1.urlparse.urlparse 将url分为6个部分,返回一个包含6个字符串项目的元组:协议.位置.路径.参数.查询.片段. import urlparse url_change = urlparse.urlparse('https://i.cnblogs.com/EditPosts.aspx?opt=1') print url_change 输出结果为: ParseResult(scheme='h

python 之 itertools模块

官方:https://yiyibooks.cn/xx/python_352/library/itertools.html 参考: https://blog.csdn.net/neweastsun/article/details/51965226 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143200162233153835cfdd1a541a18ddc15059e3d

Python中time模块详解

在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. 在开始之前,首先要说明这几点: 在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素.由于Python的time模块实现主要调用C库,所以各个平台可能有所不同. UTC(Coordinated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时间.在中国为UTC+8.DST

Python学习笔记-模块介绍(三)-模块包和搜索路径

一个python文件就是一个模块,使用独立的命名空间,但实际使用过程中单单用模块来定义python功能显然还不够.因为一个大型的系统几千上万个模块是很正常的事情,如果都聚集在一起显然不好管理并且有命名冲突的可能,因此python中也出现了一个包的概念. 一.python中的包介绍 包是通过使用"点模块名称"创建Python模块命名空间的一种方法.列如,模块名称 A.B 表示一个在名为 A的包下的名为B的子模块.就像使用模块让不同模块的作者无需担心彼此全局变量名称(冲突)一样,点模块名称