標籤:
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被返回。原始碼和具體的執行個體略。
python中itertools模組介紹---02