python自学笔记(6)--Python函数式编程、函数的装饰器、递归
2017-12-04 17:14
501 查看
python自学笔记(6)--Python函数式编程、函数的装饰器、递归
filter过滤器函数
为已知的序列的每个元素调用布尔函数,调用中返回值为非零值(True)的元素将被添加到一个新的列表中。Python2.x直接返回列表,而3.x返回的是一个obj对象,需要主动转换为list列表。
*********************
map()映射器 map(func,*list)
将两个列表中的对应元素映射成元组,可以对元素做一些处理后再映射。
python的reduce()函数
reduce()函数也是Python内置的一个高阶函数。
reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。
例如,编写一个f函数,接收x和y,返回x和y的和:
def f(x, y):
return x + y
调用 reduce(f, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:
先计算头两个元素:f(1, 3),结果为4;
再把结果和第3个元素计算:f(4, 5),结果为9;
再把结果和第4个元素计算:f(9, 7),结果为16;
再把结果和第5个元素计算:f(16, 9),结果为25;
由于没有更多的元素了,计算结束,返回结果25。
上述计算实际上是对 list 的所有元素求和。虽然Python内置了求和函数sum(),但是,利用reduce()求和也很简单。
reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100,计算:
reduce(f, [1, 3, 5, 7, 9], 100)
结果将变为125,因为第一轮计算是:
计算初始值和第一个元素:f(100, 1),结果为101。
可参考:http://python.jobbole.com/81683/
递归(据说python值允许递归998层):
函数的设计规范:
耦合性:
1. 通过参数接收输入,以及通过return产生输出以保证函数的独立性。
2. 尽量减少使用全局变量进行函数间通信。
3. 不要在函数中修改可变类型的参数。
4. 避免直接改变定义在另外一个模块中的变量。
聚合性:
1.每个函数都应该有一个单一的,统一的目标。
2.每个函数的功能都应该相对简单。
filter过滤器函数
为已知的序列的每个元素调用布尔函数,调用中返回值为非零值(True)的元素将被添加到一个新的列表中。Python2.x直接返回列表,而3.x返回的是一个obj对象,需要主动转换为list列表。
def f1(x) : if x >30: return True else: return False l1 = [1,23,45] print(list(filter(f1,l1)))#[45]
*********************
import os def f1(string) : '''查找内部含有'git'字符串''' if string.find('git') != -1: return True else: return False path = os.getcwd() l1 = os.listdir(path) if "test" in l1: os.chdir(path + '//' + 'test') l2 = os.listdir(os.getcwd()) print(list(filter(f1,l2)))#查找所有test文件夹中,名字含有git的所有文件['git rebase.txt', 'git命令大全.jpg']
map()映射器 map(func,*list)
将两个列表中的对应元素映射成元组,可以对元素做一些处理后再映射。
l1 = [0, 1, 2, 3, 4, 5, 6] l2 = ['S','M','T','W','T','F','S','ddd'] def f1(x,y): return str(x) + '-' + str(y) print(list(map(f1,l1,l2)))#['0-S', '1-M', '2-T', '3-W', '4-T', '5-F', '6-S']如果个数不等,多余的自动去除。
python的reduce()函数
reduce()函数也是Python内置的一个高阶函数。
reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。
例如,编写一个f函数,接收x和y,返回x和y的和:
def f(x, y):
return x + y
调用 reduce(f, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:
先计算头两个元素:f(1, 3),结果为4;
再把结果和第3个元素计算:f(4, 5),结果为9;
再把结果和第4个元素计算:f(9, 7),结果为16;
再把结果和第5个元素计算:f(16, 9),结果为25;
由于没有更多的元素了,计算结束,返回结果25。
上述计算实际上是对 list 的所有元素求和。虽然Python内置了求和函数sum(),但是,利用reduce()求和也很简单。
reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100,计算:
reduce(f, [1, 3, 5, 7, 9], 100)
结果将变为125,因为第一轮计算是:
计算初始值和第一个元素:f(100, 1),结果为101。
from functools import reduce#python3中将reduce移动至functools中 l1 =(i for i in range(1,101))#生成器表达式 f1 = lambda x,y:x+y#lambda运算符表达式 print(reduce(f1,l1)) #求1到100的和为5050
函数的装饰器(增强器) #装饰器其实就是一个以函数作为参数并返回一个替换函数可执行函数。 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。本质上,decorator就是一个返回函数的高阶函数。
可参考:http://python.jobbole.com/81683/
def outer(func): def inner(x): print('before!') func(x) print('after!') return inner @outer def show_name(x): print(x) show_name('jimmy')
#before! #jimmy #after!
递归(据说python值允许递归998层):
def f1(x): return (x * f1(x -1) if x > 0 else 1) print(f1(10))#3628800是10的阶乘 def f2(n): if n >= 2: return f2(n-1) + f2(n-2) elif n == 1: return 1 elif n <= 0: return 0 l1 = [f2(i) for i in range(0,10)] print(l1)#斐波那契数列[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
函数的设计规范:
耦合性:
1. 通过参数接收输入,以及通过return产生输出以保证函数的独立性。
2. 尽量减少使用全局变量进行函数间通信。
3. 不要在函数中修改可变类型的参数。
4. 避免直接改变定义在另外一个模块中的变量。
聚合性:
1.每个函数都应该有一个单一的,统一的目标。
2.每个函数的功能都应该相对简单。
相关文章推荐
- python 函数装饰器 来高速缓存递归
- python学习笔记3.4-函数装饰器
- python自学笔记6之库函数
- python学习笔记12(函数三): 参数类型、递归、lambda函数
- 学习笔记-小甲鱼Python3学习第二十二讲:函数:递归是神马
- python学习笔记,返回函数,匿名函数,装饰器
- python的函数装饰器学习笔记
- python学习笔记之函数总结--高阶函数以及装饰器
- Python自学笔记之函数式编程5——返回函数
- Python自学笔记之函数2——定义函数以及函数的参数
- python自学笔记(5)--python函数基础
- Python自学笔记之函数1——调用函数
- 【郝斌数据结构自学笔记】49-52_递归的定义和不同函数之间相互调程序举例_一个函数自己调自己程序举例
- python深入笔记--装饰函数
- python自学笔记之7编写函数、print、版本差距
- 小甲鱼Python教程第22讲--python函数:递归 笔记习题及答案
- 【郝斌数据结构自学笔记】53-56_一个函数为什么可以自己调用自己_递归必须满足三个条件_循环和递归的比较
- python学习笔记12(函数三): 参数类型、递归、lambda函数
- python学习笔记-Day05-第一部分(再谈装饰器)(递归)
- Python2.7自学笔记4――定义函数