zoukankan      html  css  js  c++  java
  • 7.1 itertools--高效循环的创建函数

    7. 函数式编程库

    本库主要提供了支持函数式编程的函数和类,以及提供通用调用对象。

    7.1 itertools--高效循环的创建函数

    本模块主要提供了迭代器方面的操作函数,跟语言APIHaskellSML一样的操作函数。同一时候针对这些函数进行高效优化,提高内存效率。

    比方在语言SML提供一个制表函数:

    tabulate(f),它产生一系列值:f(0)f(1)...。在Python能够使用map()count()来实现:map(f, count())

    itertools.accumulate(iterable[, func]) 

    对一个迭代序列进行累加操作。其他操作能够通过改动參数func来解决。

    样例:

    #python 3.4

    from itertools import *

    import operator

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

    r = list(accumulate(l))

    print(r)

    r = list(accumulate(l, operator.mul))

    print(r)

    r = list(accumulate(l, max))

    print(r)

    r = list(accumulate(l, lambda bal, pmt: bal*1.05 + pmt))

    print(r)

    结果输出例如以下:

    [1, 3, 6, 10, 15]

    [1, 2, 6, 24, 120]

    [1, 2, 3, 4, 5]

    [1, 3.05, 6.202500000000001, 10.512625, 16.03825625]

    itertools.chain(*iterables) 

    合多个迭代序列为一个序列。

    样例:

    #python 3.4

    from itertools import *

    import operator

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

    x = ['a', 'b']

    r = list(chain(l, x))

    print(r)

    结果输出例如以下:

    [1, 2, 3, 4, 5, 'a', 'b']

    classmethod chain.from_iterable(iterable) 

    从序列中包含的序列进行合并返回。与chain()的差别,就是仅仅接收一个參数,參数是包含多个序列的。假设不包含会抛出异常。

    样例:

    #python 3.4

    from itertools import *

    import operator

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

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

    x = [l1, l2]

    r = list(chain.from_iterable(x))

    print(r)

    结果输出例如以下:

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

    itertools.combinations(iterable, r) 

    从一个序列里按指定r个元素生成组合元组返回。产生组合数是按位置来进行组合,假设排序序列,产生结果也是排序的。

    样例:

    #python 3.4

    from itertools import *

    import operator

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

    r = list(combinations(l, 3))

    print(r)

    结果输出例如以下:

    [(1, 3, 2), (1, 3, 4), (1, 3, 5), (1, 2, 4), (1, 2, 5), (1, 4, 5), (3, 2, 4), (3, 2, 5), (3, 4, 5), (2, 4, 5)]

    itertools.combinations_with_replacement(iterable, r) 

    同意序列中每一个单独的元素进行反复使用,再组合成元组返回。

    样例:

    #python 3.4

    from itertools import *

    import operator

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

    r = list(combinations(l, 3))

    print(r)

    r = list(combinations_with_replacement(l, 3))

    print(r)

    结果输出例如以下:

    [(1, 3, 2), (1, 3, 4), (1, 3, 5), (1, 2, 4), (1, 2, 5), (1, 4, 5), (3, 2, 4), (3, 2, 5), (3, 4, 5), (2, 4, 5)]

    [(1, 1, 1), (1, 1, 3), (1, 1, 2), (1, 1, 4), (1, 1, 5), (1, 3, 3), (1, 3, 2), (1, 3, 4), (1, 3, 5), (1, 2, 2), (1, 2, 4), (1, 2, 5), (1, 4, 4), (1, 4, 5), (1, 5, 5), (3, 3, 3), (3, 3, 2), (3, 3, 4), (3, 3, 5), (3, 2, 2), (3, 2, 4), (3, 2, 5), (3, 4, 4), (3, 4, 5), (3, 5, 5), (2, 2, 2), (2, 2, 4), (2, 2, 5), (2, 4, 4), (2, 4, 5), (2, 5, 5), (4, 4, 4), (4, 4, 5), (4, 5, 5), (5, 5, 5)]

    itertools.compress(data, selectors) 

    从序列selectors取元素出来推断是否为True。假设为True就把序列data里相应位置的元素保留。假设不为True,则删除此元素。

    样例:

    #python 3.4

    from itertools import *

    import operator

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

    r = list(compress(l, [1, 0, 0, 1, 1]))

    print(r)

    结果输出例如以下:

    [1, 4, 5]

    itertools.count(start=0, step=1) 

    通过指定開始參数start和添加间隔值step,无限地产生数的迭代器。

    样例:

    #python 3.4

    from itertools import *

    import operator

    cnt = 10

    for i in count(2, 2):

        print(i)

        if cnt < 0:

            break

        cnt = cnt - 1

    结果输出例如以下:

    2

    4

    6

    8

    10

    12

    14

    16

    18

    20

    22

    24

    itertools.cycle(iterable) 

    把一个序列转换为循环无限输出的迭代器。

    样例:

    #python 3.4

    from itertools import *

    import operator

    cnt = 10

    l = [1, 2, 3]

    for i in cycle(l):

        print(i, end=',')

        if cnt < 0:

            break

        cnt = cnt - 1

    结果输出例如以下:

    1,2,3,1,2,3,1,2,3,1,2,3,

    itertools.dropwhile(predicate, iterable) 

    从条件predicate不满足起開始输出iterable后面全部元素。

    样例:

    #python 3.4

    from itertools import *

    import operator

    l = [1, 1, 3, 1, 1, 2, 5]

    r = list(dropwhile(lambda x : x < 2, l))

    print(r)

    结果输出例如以下:

    [3, 1, 1, 2, 5]

    itertools.filterfalse(predicate, iterable) 

    返回iterable里全部predicate条件为False的元素。

    样例:

    #python 3.4

    from itertools import *

    import operator

    l = [1, 1, 3, 1, 1, 2, 5]

    r = list(filterfalse(lambda x : x < 2, l))

    print(r)

    结果输出例如以下:

    [3, 2, 5]

    itertools.groupby(iterable, key=None) 

    对序列iterable进行分组操作,能够设置參数key来选择分组条件,默认使用identity函数来分组。

    样例:

    #python 3.4

    from itertools import *

    import operator

    r = list(groupby('aaaaabbbbccccddddaaaeee'))

    print(r)

    r = [k for k, g in groupby('aaaaabbbbccccddddaaaeee')]

    print(r)

    r = [list(g) for k, g in groupby('aaaaabbbbccccddddaaaeee')]

    print(r)

    结果输出例如以下:

    [('a', <itertools._grouper object at 0x02DD0870>), ('b', <itertools._grouper object at 0x02DD0890>), ('c', <itertools._grouper object at 0x02DD08B0>), ('d', <itertools._grouper object at 0x02DD08F0>), ('a', <itertools._grouper object at 0x02DD0910>), ('e', <itertools._grouper object at 0x02DD0930>)]

    ['a', 'b', 'c', 'd', 'a', 'e']

    [['a', 'a', 'a', 'a', 'a'], ['b', 'b', 'b', 'b'], ['c', 'c', 'c', 'c'], ['d', 'd', 'd', 'd'], ['a', 'a', 'a'], ['e', 'e', 'e']]

    itertools.islice(iterable, stop) 

    itertools.islice(iterable, start, stop[, step]) 

    依据開始start和结束stop条件来切取须要的元素。

    start表示開始位置,整数表示。stop表示结束位置,整数表示。step表示步长,整数表示。

    样例:

    #python 3.4

    from itertools import *

    import operator

    r = list(islice('ABCDEFGHIJK', 2))

    print(r)

    r = list(islice('ABCDEFGHIJK', 2, 4))

    print(r)

    r = list(islice('ABCDEFGHIJK', 2, None))

    print(r)

    r = list(islice('ABCDEFGHIJK', 2, None, 2))

    print(r)

    结果输出例如以下:

    ['A', 'B']

    ['C', 'D']

    ['C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K']

    ['C', 'E', 'G', 'I', 'K']

    itertools.permutations(iterable, r=None) 

    对序列iterable的元素按长度r个元素进排列组合。

    样例:

    #python 3.4

    from itertools import *

    import operator

    r = list(permutations('ABCD', 2))

    print(r)

    结果输出例如以下:

    [('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'A'), ('B', 'C'), ('B', 'D'), ('C', 'A'), ('C', 'B'), ('C', 'D'), ('D', 'A'), ('D', 'B'), ('D', 'C')]

    itertools.product(*iterables, repeat=1) 

    计算序列的笛卡尔乘积。

    样例:

    #python 3.4

    from itertools import *

    import operator

    r = list(product('ABCD', '12'))

    print(r)

    结果输出例如以下:

    [('A', '1'), ('A', '2'), ('B', '1'), ('B', '2'), ('C', '1'), ('C', '2'), ('D', '1'), ('D', '2')]

    itertools.repeat(object[, times]) 

    除非指定时间,否则一直产生对象object返回。

    样例:

    #python 3.4

    from itertools import *

    import operator

    r = list(map(pow, range(10), repeat(2)))

    print(r)

    结果输出例如以下:

    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

    itertools.starmap(function, iterable) 

    从序列里取得元组进行function运算。

    样例:

    #python 3.4

    from itertools import *

    import operator

    r = list(starmap(pow, [(2, 5), (3, 2)]))

    print(r)

    结果输出例如以下:

    [32, 9]

    itertools.takewhile(predicate, iterable)

    返回iterable的元素当条件predicate推断为True时。

    样例:

    #python 3.4

    from itertools import *

    import operator

    r = list(takewhile(lambda x: x < 5, [1, 2, 3, 6, 3, 2]))

    print(r)

    结果输出例如以下:

    [1, 2, 3]

    itertools.tee(iterable, n=2) 

    能够把一个序列生成n个同样的序列返回。

    样例:

    #python 3.4

    from itertools import *

    import operator

    l = [2, 3, 5, 7]

    r = list(tee(l, 2))

    print(r)

    for i in r:

        for x in i:

            print(x, end=',')

    结果输出例如以下:

    [<itertools._tee object at 0x02E0A738>, <itertools._tee object at 0x02E0A788>]

    2,3,5,7,2,3,5,7,

    itertools.zip_longest(*iterables, fillvalue=None) 

    对每一个序列都取出一个元素组成一个元素,假设某个序列已经取完。使用fillvalue来取代。

    样例:

    #python 3.4

    from itertools import *

    import operator

    l = [2, 3, 5, 7]

    x = ['a', 'b']

    r = list(zip_longest(l,x, fillvalue = '-'))

    print(r)

    结果输出例如以下:

    [(2, 'a'), (3, 'b'), (5, '-'), (7, '-')]


    蔡军生  QQ;9073204  深圳

  • 相关阅读:
    2017年软件工程基础-个人项目作业
    [2017BUAA软工]第1次个人作业
    [2017BUAA软工]第0次个人作业
    个人作业——软件工程实践总结&个人技术博客
    个人作业——软件评测
    结对第二次作业
    软件工程结对作业
    寒假作业(2/2)
    软件工程寒假快乐作业
    技术总结——Vue页面刷新的方法
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7150895.html
Copyright © 2011-2022 走看看