python3入门与实践(六):函数式编程

匿名函数

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
复制代码

装饰器场景

flask

猜你喜欢

转载自juejin.im/post/5c10a0aae51d4564012eafbf