7. 函数式编程库

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

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

本模块主要提供了迭代器方面的操作函数,跟语言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  深圳

7.1 itertools--高效循环的创建函数的更多相关文章

  1. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...

  2. for循环的运算 改变循环的控制流 死循环 遍历数组 定义方法 有名函数匿名函数 定义函数的方法取值 与 自己创建函数取值 局部与全局变量 次幂/随机数/取绝对值/向上取整/平方根

    今天学习的是for循环,对for循环的运算有了理解. document.write(" ")里的内容在网页上展示出来 有名函数非常重要!!!!!!!!!!!!!!!!!!!!!并且 ...

  3. JavaScript的控制语句和循环语句和函数的总结

    10.控制语句---if语句 10_1:if-else语句 if(表达式){ 语句1: .... }else{ 语句1: .... }; 示例: var a = 1; if (a > 0){ a ...

  4. MySql创建函数与过程,触发器, shell脚本与sql的相互调用。

    一:函数 1:创建数据库和表deptartment, mysql> use DBSC; Database changed mysql), ), )); Query OK, rows affect ...

  5. 前端面试题:不使用loop循环,创建一个长度为100的数组,并且每个元素的值等于它的下标,,怎么实现好?

    昨天,看这道题,脑子锈住了,就是没有思路,没看明白是什么意思?⊙﹏⊙|∣今天早上起床,想到需要思考一下这个问题. 当然,我没想明白为什么要这样做?(创建一个长度为100的数组,并且每个元素的值等于它的 ...

  6. Sql Server创建函数

    在使用数据库的过程中,往往我们需要对有的数据先进行计算,然后再查询出来,所以我们就需要创建函数来完成这项任务,在数据库的Programmability(如图1)下面的Function中创建函数(如图2 ...

  7. Python 动态创建函数【转】

    知乎上也有相似的问题 偶然碰到一个问题,初想是通过动态创建Python函数的方式来解决,于是调研了动态创建Python函数的方法. 定义lambda函数 在Python中定义lambda函数的写法很简 ...

  8. 从new Function创建函数联想到MVC模式

    我们知道任何一个自定义函数都是Function构造器的实例,所以我们可以通过new Function的方式来创建函数,使用语法很简单, new Function(形参1, 形参2, ..., 形参N, ...

  9. 进程创建函数fork()、vfork() ,以及excel()函数

    一.进程的创建步骤以及创建函数的介绍 1.使用fork()或者vfork()函数创建新的进程 2.条用exec函数族修改创建的进程.使用fork()创建出来的进程是当前进程的完全复制,然而我们创建进程 ...

随机推荐

  1. java web开发中常用的协议的使用和java-web 常见的缓冲技术

    一.DNS协议 作用将域名解析为IP   类似于我们只需要知道中央一台,中央二台,而不需要知道它的频率,方便记忆. java dns 域名解析协议实现 1 域名解析,将域名可转换为ip地址InetAd ...

  2. java中等待所有线程都执行结束

    转自:http://blog.csdn.net/liweisnake/article/details/12966761 今天看到一篇文章,是关于java中如何等待所有线程都执行结束,文章总结得很好,原 ...

  3. Java 一些常见问题(持续更新)

    1. Java 内部类 内部类有四种常见的类型:成员内部类.局部内部类.匿名内部类和静态内部类. 1.成员内部类:定义为另一个类的里面如下: class Circle { double radius ...

  4. mysql单实例多库与多实例单库

    一.单实例多库: 一个mysql实例,创建多个数据目录. 规划: 实例路径:/usr/local/mysql 数据目录路径: (1)/usr/local/mysql/data (2)/usr/loca ...

  5. docker的网络(基础)

    Docker的网络子系统是可插拔的,使用驱动程序.默认情况下存在多个驱动程序,并提供核心网络功能: bridge:docker默认的网络驱动.如果未指定驱动程序,则这是需要创建的网络类型.当应用程序在 ...

  6. transformer模型解读

    最近在关注谷歌发布关于BERT模型,它是以Transformer的双向编码器表示.顺便回顾了<Attention is all you need>这篇文章主要讲解Transformer编码 ...

  7. sql通配符+sql中查询条件包含下划线等通配符的写法

    一.SQL 通配符 在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符. SQL 通配符必须与 LIKE 运算符一起使用. 在 SQL 中,可使用以下通配符: 通配符 描述 % 替代一个或多 ...

  8. [codevs2495]水叮当的舞步

    [codevs2495]水叮当的舞步 试题描述 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈 ...

  9. BZOJ4551 - [TJOI2016]树

    Portal Description 给出一棵\(n(n\leq10^5)\)个点的以\(1\)为根的有根树,进行\(Q(Q\leq10^5)\)次操作: 标记一个点\(x\). 询问\(x\)的祖先 ...

  10. 【数学+枚举】OpenJ_POJ - C17J Pairs

    https://vjudge.net/contest/171652#problem/J [题意] 问有多少个正整数对(x,y),使得存在正整数p,q满足 1 <= T <= 15 1 &l ...