7. 函数式编程库
本库主要提供了支持函数式编程的函数和类,以及提供通用调用对象。
本模块主要提供了迭代器方面的操作函数,跟语言API,Haskell和SML一样的操作函数。同时针对这些函数进行高效优化,提高内存效率。比如在语言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 深圳