Python:itertools 和 functools 总结

itertools

函数 解释
itertools.dropwhile(predicate,it) 处理的是it,跳过predicate为真时的值,然后在第一个不为真的时候不再检查输出剩余内容
filter(predicate,it) 当predicate为真时输出相应的it,如果predicate为None时只输出真值内容。
itertools.filterfalse(predicate,it) 与filter相反的效果
itertools.compress(it,selector_it) 当selector_it 为真时,输出相应的it(两个都是迭代器)
itertools.islice(it,start,stop,step=1) 惰性操作的切片
itertools.islice(it,stop) 惰性操作的切片
itertools.accumulate(it[,func]) 前两个元素计算结果后与接下来的一个求和,以此类推得出结果。
itertools.starmap(func,it) it 的每个元素 itt 是可迭代的,每个元素以func(*it) 形式调用。例如 list(itertools.starmap(lambda a,b:a+b , enumerate(itertools.accumulate(range(3)),1))) --> [1,3,6]
enumerate(it,start=0) 输出 (index,item) 元组组成的列表
map(func,it[,it2,...itn]) 将参数的it传给func,有多个it则需要func支持n个参数,一个it结束则计算结束。例如list(map(lambda a,b:(a,b) , range(100) , [1,2,3] )) --> [(0, 1), (1, 2), (2, 3)]
itertools.chain(it1,...itn) 将参数里的所有元素连接起来
itertools.chain.from_iterable(it) 将参数里的所有元素连接起来 list ( itertools.chain.from_iterable(enumerate('XYZ',1)) ) --> [1, 'X', 2, 'Y', 3, 'Z']
itertools.product(it1,...itn,repeat=1) 计算笛卡尔积,repeat表示重复处理次数 , list ( itertools.product([1,2],repeat=2) ) --> [(1, 1), (1, 2), (2, 1), (2, 2)] , list ( itertools.product([1,2],[3,4],repeat=1) ) --> [(1, 3), (1, 4), (2, 3), (2, 4)]
zip(it1,it2,...itn) 输出n个元素组成的元组,其中一个it 结束,全部计算结束
itertools..zip_longest(it1,it2,...itn,fillvalue=None) 类似zip ,但是遇到一个it 结束则补充fillvalue继续运算,直到所有 it 都结束
itertools.combinations(it,len) **(不包含相同元素) **在it所有的元素中选len个,输出所有的组合可能性 list( itertools.combinations([1,2,3,3],2) ) --》 [(1, 2), (1, 3), (1, 3), (2, 3), (2, 3), (3, 3)]
itertools.combinations_with_replacement(it,len) (包含相同元素) 同itertools.combinations(it,len)
itertools.permutations(it,len=None) 输出排列,len 默认为len(it)
itertools.conut(start,step) 计数
itertools.cycle(it) 循环输出it里的元素,到了最后一个元素则下一次输出第一个
itertools.repeat(item[,time]) 重复输出元素 item ,除非指定次数
itertools.groupby(it,key=None) 输出(k,g) 形式的元组,key 为分组标准,g 为相应的生成器 . for len,group initertools.groupby(['a','aa','aaa'],len): print(len,list(group)) --> 1 ['a'] 2 ['aa'] 3 ['aaa']
itertools.tee(it,n=2) 产出由 n 个生成器组成的元组,每个生成器用于单独输出序列。 list( zip( *itertools.tee('XYZ',3) ) ) -- > [('X', 'X', 'X'), ('Y', 'Y', 'Y'), ('Z', 'Z', 'Z')]
reversed(seq) seq需要是序列或者是实现了``` reversed `` 的对象

functools

函数 解释
functools.partial(func, *args, **keywords) 偏函数,冻结位置函数或关键字参数
functools.update_wrapper(wrapper, wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES) __module__, __name__, __qualname__, __annotations__and __doc__ 同步到新的函数,参数是包装的函数、被包装的函数
functools.warps(function) 等于 partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated)
functools.reduce(function, iterable[, initializer]) 相当于 reduce()
functools.cmp_to_key(function) 用于 sorted() python3 sorted() 没有cmp 参数,sorted(iterable, key=cmp_to_key(locale.strcoll))
functools.total_ordering 某个类如果定义了ltlegtge这些方法中的至少一个,使用该装饰器,则会自动的把其他几个比较函数也实现在该类中,用在类上
functools.lru_cache(maxsize=128, typed=False) 将运行结果缓存下来,maxsize 为缓存大小,2 的幂,typed 为真则分类型存储。

functools 示例

基本装饰器的例子

def w(function):
    def call_it(*args,**kwargs):
        print("before")
        function()
        print("after")
    return call_it

@w
def hello():
    print("hello")

hello()

functools.partial

urlunquote = functools.partial(urlunquote, encoding='latin1')
# urlunquote(args, *kargs)
# 相当于 urlunquote(args, *kargs, encoding='latin1')

functools.update_wrapper

from functools import update_wrapper

def w(function):
    def call_it(*args,**kwargs):
        print("before")
        function(*args,**kwargs)
    return update_wrapper(call_it,function)

@w
def hello():
    print("hello")

hello()
print(hello.__name__)

functools.wrap


from functools import wraps

def w(function):
    @wraps(function)
    def call_it(*args,**kwargs):
        print("before")
        function(*args,**kwargs)
    return call_it

@w
def hello():
    print("hello")

hello()
print(hello.__name__)

functools.reduce

from functools import reduce

print( reduce(lambda x,y: x+y,[1,2,3,4]) )
# 10
print( reduce(lambda x,y: x+y,[1,2,3,4],10))
# 20

functools.total_ordering

@total_ordering
class Student:
    def __eq__(self, other):
        return ((self.lastname.lower(), self.firstname.lower()) ==
                (other.lastname.lower(), other.firstname.lower()))
    def __lt__(self, other):
        return ((self.lastname.lower(), self.firstname.lower()) <
                (other.lastname.lower(), other.firstname.lower()))
print dir(Student)

来自个人 Python 文集

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容