python3入门与实践(六):函数式编程
2018-04-01 本文已影响43人
9c0ddf06559c
匿名函数
lambda
# 1.parameter_list 参数列表
# 2.expression 函数体,只能是有一些简单的,注意不是代码块,比如不能写赋值语句
# 3.不需要return
lambda parameter_list: expression
def add(x,y):
return x+y;
用lambda标示
lambda x,y: x+y
调用lambda
复制给变量
f = lambda x,y: x+y
print(f(1,2))
三元表达式
# x,y x大于y x 否则 y
x > y ? x : y
# 条件为真时返回的结果 if 条件判断 else 条件为假时的返回结果
r = x if x > y else y
map 内置类
帮助文档将原来集合中的每一个集合的元素,都通过函数映射到新的集合里面来
假设有很多个抛物线的点,已知每个点的x坐标,y坐标需要用平方函数求出
list_x = [1,2,3,4,5,6,7,8]
def square(x):
return x*x
循环方式解决
for x in list_x:
square(x)
map方式解决
r = map(square,list_x)
print(list(r))
# 输出:[1, 4, 9, 16, 25, 36, 49, 64]
map结合lambda表达式
r = map(lambda x:x*x,list_x)
多参数的lambda表达式
list_x = [1,2,3,4,5,6,7,8]
list_y = [1,2,3,4,5,6,7,8]
# 可传入多个参数列表,返回的结果元素个数与参数列表集合里元素数较小的个数
r = map(lambda x,y:x*x+y,list_x,list_y)
reduce
使用
from functools import reduce
帮助文档
运算原理:连续调用lambda表达式,
# 第一次运行,取参数列表的前2个元素(2为lambda参数个数)
# 第二次运行,取上一次运算结果和下一个元素
r = reduce(lambda x,y:x+y,list_x)
print(list(r))
# 输出 36
# 注意,10是初始值,不是最后运算
r = reduce(lambda x,y:x+y,list_x,10)
print(list(r))
# 输出 46
filter
帮助文档过滤掉不符合规则的元素
# 要求传入函数必须返回能够代表真和假的值(True/False)(1/0)
r = filter(lambda x: True if x==1 else False,list_x)
print(list(r))
# 输出[1, 1, 1]
函数式编程与命令式编程
命令式编程:
- def 方法定义
- if else 流程控制
- for 循环
函数式编程:
- map reduce filter
- lambda 算子
一定程度下lambda可以替换命令式编程的函数,reduce可以替换命令式编程的循环
装饰器
类似于C#的特性,java的注解
体现了AOP的编程思想
def f1():
print('This is a function')
# 现在需要在方法上添加打印时间
## 方案1:不推荐,没有体现出对原来函数的扩展,调用也变化了)
def print_current_time(func):
print(time.time())
func()
print_current_time(f1)
## 方案2:通过wrapper外面分装了一层decorator,实现不改变原有函数实现过程,但是仍然改变了方法调用,不推荐
# 装饰器
def decorator(func):
# 包装
def wrapper():
print(time.time())
func()
return wrapper
f = decorator(f1)
f()
## 方案3:语法糖 @符号,可以不改变方法调用,推荐!
@decorator
def f1():
print('This is a function')
f1()
带参数的方法的装饰器的使用
def f1(name):
print('This is a function named '+name)
## 方案1:不推荐,无法为多个函数提供增强支持
def decorator(func):
# 包装
def wrapper(func_name):
print(time.time())
func(func_name)
return wrapper
## 方案2:可变参数列表,不支持关键字参数
def decorator(func):
# 包装
def wrapper(*args):
print(time.time())
func(*args)
return wrapper
## 方案3:推荐
@decorator
def f2(func_name1,func_name2,**kw):
print('This is a function named '+func_name1)
print('This is a function named '+func_name2)
print(kw)
def decorator(func):
# 包装 args 参数,kw key word
def wrapper(*args,**kw):
print(time.time())
func(*args, **kw)
return wrapper
小技巧
# 可以处理任何参数列表
def fun1(*args,**kw):
pass