《Python》第7章 函数式编程

 Python虽然不是纯粹的函数式编程,但包含了不少函数式编程的语法。


1、又见函数

    1)Python中的函数式

面向过程编程、面向对象编程、函数式编程本质都在于封存

函数式编程——因为变量不可变更,所以纯粹性

                         好处是调用不会影响其他函数、方便并行化运算(避免竞跑条件)

    2)并行运算

并行运算——多条指令同时执行

串行运算——每次执行一条指令

单机(分时复用)和集群(分布多机)都可以实现并行运算

start()——启动进程

join()——在主程序等待相应进程完成

多进程——每个进程有自己的内存空间

多线程——所有线程共享同一内存空间(一个进程可以包含多个线程)


2、被解放的函数

    1)函数作为参数和返回值

函数是“第一级对象”(first-class object)

第一级对象的特点:

①可以被赋值给一个变量        ②可以嵌入到数据结构中

③可以作为参数传递给函数    ④可以作为值被函数返回

    2)函数作为返回值

函数对象也有存活范围,也就是函数对象的作用域(作用域与它的def的缩进层级相同)

    3)闭包

一个函数和它的环境变量合在一起构成闭包——提高代码可复用性

                                                                     ——减少函数参数以便并行运算

.__closure__——环境变量取值被保存在函数对象的__closure__属性中,里面定义了一个元组用于存放所有的cell对象,每个cell对象一一保存了这个闭包中所有的外部变量


3、小女子的梳妆匣

    1)装饰器

装饰器从操作上入手,为函数增加额外的指令,实现代码的可复用性

定义——def形式

参数——可调用对象

返回——增加了额外指令的调用对象

调用——@语法

本质——名称绑定,让同一变量名指向新返回的函数对象

    2)带参装饰器

根据参数不同,带参装饰器会对函数进行不同的加工,进一步提高装饰器的作用

    3)装饰类

一个装饰器可以接受一个类,并返回一个类


4、高阶函数

    1)lambda与map    

能接受其他函数作为参数的函数,被称为高阶函数

lambda(参数:返回值)——定义匿名函数

map(函数对象:可循环对象)——把接受到的函数对象依次作用每个元素,能替代循环功能

                                                  其中参数和可循环对象数目一致

    2)filter函数

filter(函数对象:可循环对象)——把接受到的函数对象依次作用每个元素,并筛选数据

                                                  其中参数和可循环对象数目一致

    3)reduce函数

reduce(函数对象:可循环对象)——把累进的运用传给它的二参函数

                                                      函数对象必须能接受两个参数

    4)并行处理

在利用multiprocessing包的多进程条件下,使用多线程的map()方法,可以将运行时间缩短

Pool类——可以提供指定数量的进程供用户调用,当有新的请求提交到Pool中时,如果池还没有满,就会创建一个新的进程来执行请求。如果池满,请求就会告知先等待,直到池中有进程结束,才会创建新的进程来执行这些请求。


5、自上而下

    1)便捷表达式

生成器表达式——构建生成器的便捷方法——如(x for x in range())

列表解析——快速生成列表的方法——如[x for x in range()]

    2)懒惰求值

迭代器的工作方式是懒惰求值,除非通过某种方式调用迭代器元素或者把迭代器转换为列表,运算过程才开始,好处是节省运算资源节约内存空间,如map()、filter()等函数

    3)itertools包

itertools包提供了更加灵活的生成迭代器的工具,这些工具输入大都是已有的迭代器

返回无限循环的迭代器:

count(5,2)——从5开始的整数迭代器,每次增加2

cycle('abc')——重复序列的元素

repeat()既可以返回一个不断重复的迭代器,也可以是有次数限制的重复:

repeat(1,2)——重复1.2,构成无穷迭代器

repeat(10,5)——重复10,共重复5次

我们还能组合旧的迭代器,来生成新的迭代器:

chain([1,2,3],[4,5,6])——连接两个迭代器成为一个

product("abc",[1,2])——多个迭代器集合的笛卡尔积,相当于嵌套循环

笛卡尔积可以得出集合元素所有的组合方式:

permutations("abc",2)——从'abc'中挑选两个元素

                                         将上面所有结果排序,返回为新的迭代器

                                         上面的组合区分顺序,即ab,ba都返回

combinations("abc",2)——从'abc'中挑选两个元素

                                          将上面所有结果排序,返回为新的迭代器

                                          上面的组合不分顺序

combinations_with_replacement("abc",2)——与上面类似

                                                                        但允许两次选出的元素重复

还有许多高阶函数:

starmap(pow,[(1,1),(2,2),(3,3)])——pow将依次作用于表的每个tuple

takewhile(lambdax:x < 5,[1,3,6,7,1])——当函数返回True时,收集元素到迭代器,一旦函数返回False,则停止

dropwhile(lambdax:x < 5,[1,3,6,7,1])——跳过元素,一旦函数返回True,则开始收集剩下的所有元素到迭代器

groupby(可迭代对象, key()函数)——能将一个key()函数作用于原迭代器的各个元素, 从而获得各个函数的键值

compress('ABCD', [1,1,1,0])——根据[1,1,1,0]的真假值情况,选择保留第一个参数中的元素

islice()——创建一个迭代器,生成项的方式类似于切片返回值

izip()——把不同的迭代器的元素聚合到一个迭代器中

你可能感兴趣的:(《Python》第7章 函数式编程)