目录
1.函数式编程
2.被解放的函数
3.装饰器
4.高阶函数
5.生成器
1.函数式编程
本质:面向对象实现的封装
函数式编程强调函数的纯粹性,纯函数的运行不会影响其他函数(没有副作用)。非纯函数同时进行运算时,进程的先后顺序不确定从而会产生副作用,如
在这里,函数对全局变量的修改能被其他函数看到,因此有副作用,即由于运行函数的先后不确定而使结果可能是20,也可能是30。这种现象被成为竞跑条件,在编程中需要避免。
上面说到的两个并行的程序同时运行,这就是进程。计算机中,一个进程不会占用另一个进程的内存空间,但一个进程里面可以有多个线程,可以相互占用同一个进程的内存空间。
2.被解放的函数
在函数式编程中,函数是第一级对象,它可以作为参数使用,也可以作为返回值成为另一个函数的返回结果。
如果函数的定义中引用了外部变量(环境变量),就构成了闭包。闭包可以提高代码的复用性以及可以减少参数的使用,当参数的个数减少为1时对并行运算具有重大意义。
3.装饰器
装饰器是一种高级python语法,可以通过增加额外指令对函数、方法和类进行加工,也可以改用装饰器,定义功能拓展本身
除了上述的表示外,装饰器还可以自带参数,为装饰器的编写和使用提供了更大的灵活性
4.高阶函数
能接受其它函数作为参数的函数被称为高阶函数。
lambda语法:用来定义简短的匿名函数
map()函数:
filter()函数:
reduce()函数:
5.生成器
生成器的表达式(列表):list = [表达式 for x in range()if……],if可省略,词典等生成器注意符号跟表达。
如果不需要穷尽所有的数据元素计算时,运用迭代器的懒惰求值方法将比即时求值节省不少时间,如
除了用map()、filter()等函数外,Python中的itertools包还提供了丰富的操作迭代器的工具,下面是各生成器的简单介绍:
count(初始值, 步长) :从初始值开始的整数迭代器,每次增加步长单位。
cycle("序列"):重复序列的元素。
repeat(对象,次数) :重复对象多次,忽略次数则构成无穷迭代器。
chain(迭代器,迭代器) :连接两个迭代器成为一个。
product(迭代器, 迭代器) :多个迭代器集合的笛卡儿积(集合元素所有可能的组合方式),相当于嵌套循环
starmap(函数,对象) :将函数应用于对象中的每一个元素 。
permutations("abc", 2) :从序列中随机挑出2个元素进行排序,并将结果返回新的迭代器(区分顺序)。
combinations("abc", 2):从序列中随机挑出2个元素进行组合,并将结果返回新的迭代器(不区分顺序)。
combinations_with_replacement("abc", 2) :从序列中随机挑出2个元素进行组合,允许两次挑出的元素重复,并将结果返回新的迭代器(不区分顺序)。
takewhile(lambda x: x < 5, [1, 3, 6, 7, 1]) : 当函数返回True时,收集元素到迭代器。一旦函数返回False,则停止。结果为1, 3 。
dropwhile(lambda x: x < 5, [1, 3, 6, 7, 1]) :当函数返回False时,跳过元素。一旦函数返回True,则开始收集剩下的所有元素到迭代器。结果为6, 7, 1。
groupby(friends, key = height_class): 将一个key()函数作用于原迭代器的各个元素获得各个函数的键值。根据key()函数结果,将拥有元素分组。每个分组中的元素都保留了键值形成的返回结果。函数groupby()分出的组放在一个迭代器中返回。
compress("ABCD", [1, 1, 1, 0]) :根据[1, 1, 1, 0]的真假值情况,选择保留第一个参数中的元素。结果为A, B, C。
islice(开始值,结束值,步长) :切片函数,从开始值到结束值,每隔步长单位进行切片,并将结果返回迭代器。
izip(迭代器……):将各个迭代器中对应的元素打包成一个个元组,并且构成新的迭代器返回。