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. 数位DP || Gym 101653R Ramp Number

    每一位都大于等于前一位的数叫Ramp Number 给一个数,如果不是Ramp Number输出-1,如果是Ramp Number输出比它小的Ramp Number的个数 只和每一位上的数字有关 #i ...

  2. sqlserver差异备份3117

    1.出现错误"3117" 2.完整备份/选项/不对数据库执行任何操作 3.数据库显示"正在还原" 4.差异备份/选项/回滚 5.数据库完整备份与差异备份成功

  3. Openjudge-百练-4013-踩方格

    这题目是一道深搜的题目,我们写一个递归函数叫Ways(int i, int j ,int n),i j就是当前所处的坐标,我们设置一个visited数组,简称 V . 对于这个数组,首先初始化为零,然 ...

  4. python 装饰器模拟京东登陆

    要求: 1.三个页面:主页面(home).书店(book).金融页面(finance)2.有两种登陆方式:主页面和书店页面使用京东账户登陆,金融页面使用微信账户登录2.输入:1 ,进入主页面,以此类推 ...

  5. 杭电 5326 Work (并查集求子结点为k的结点数)

    Description It’s an interesting experience to move from ICPC to work, end my college life and start ...

  6. Root of AVL Tree

    04-树5 Root of AVL Tree(25 分) An AVL tree is a self-balancing binary search tree. In an AVL tree, the ...

  7. SQL 一次插入多条记录

    本文介绍如何快速插入多条数据到数据表中,以满足sql语句学习或项目测试的需要. 本文非原创,是对移步原文的重新整理. 如有以下表格,如图: 1,原始添加记录的方式,sql语句如下: insert in ...

  8. 方便三菱PLC模块调用的FB功能块分享

    前言: 为方便 三菱 PLC 编程,可以将很多功能做成 FB 功能块的形式进行直接调用,可大大缩短编程时间, 本文所述的 FB功能块均以三菱 GX-Works2 软件为基础平台所写,本人所用版本为 G ...

  9. 今年把js总结了一下,ppt格式的

    本来想梳理成html,但是时间有限. 希望能够有所帮助. http://pan.baidu.com/s/1ntGAfED http://files.cnblogs.com/danghuijian/js ...

  10. Git上传的使用步骤

    Git上传的使用步骤 首先 git branch 查看当前的分支是否为本地自己分支 接着 git stash 保存本地自己的保存 git checkout earemote 查看本地共有开发分支 gi ...