您的位置:首页 > 编程语言 > Python开发

python自学笔记(6)--Python函数式编程、函数的装饰器、递归

2017-12-04 17:14 501 查看
python自学笔记(6)--Python函数式编程、函数的装饰器、递归

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.每个函数的功能都应该相对简单。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: