Python系列(五)函数式编程

Posted by YaPi on December 16, 2018

函数式编程

匿名函数

定义

使用lambda关键字 lambda parameter_list: expression

# 正常函数
def add(x, y):
    return x + y

# 匿名函数
f = lambda x, y: x + y

print(f(1,2))

三元表达式

条件为真时返回的结果 if 条件判断 else 条件为假时返回结果

x = 2
y = 1 

r = x if x > y else y

map

list_x = [1, 2, 3, 4, 5, 6]


def base(x):
    return x // 2

# map函数传入操作函数和序列
r = map(base, list_x)

# 使用list函数,把返回的map转成list
print(list(r))


# 或者使用lambda
list_x = (1, 2, 3, 4, 5, 6)
r = map(lambda x: x*2, list_x)


# lambada多参数
list_x = [1, 2, 3, 4, 5, 6]
list_y = [1, 2, 3, 4, 5, 6]

r = map(lambda x, y: x * x + y, list_x, list_y)

print(list(r))

返回得到的结果个数,取决于传入列表的个数

reduce

reduce函数在python3中不在默认空间,需要先导入才能使用

reduce(function, sequence, initial=_initial_missing)

原理: 首次使用前两个元素,做操作后,将返回值及后续一个数继续做处理 initial是一个初始值,会优先计算

from functools import reduce

list_x = [1, 2, 3, 4, 5, 6]
r = reduce(lambda x, y: x + y, list_x)
print(r) = > 36

# 初始值
# 先计算10 + 1,然后再做后续运算
r = reduce(lambda x, y: x + y, list_x,10)
print(r) = > 46

filter

list_x = [1, 0, 1, 0, 2, 0]

# 不一定是True或False,只要可以判断真假就行,比如 1,0
r = filter(lambda x: True if x == 1 else False, list_x)
print(list(r))

装饰器

简单例子

import time


def decorator(func):
    def wrapper():
        print(time.time())
        func()

    return wrapper


def f1():
    print("This is a function")


f = decorator(f1)
f()

私用 @ 符号语法糖

#调用 不用改变f1的调用方式
@decorator
def f1():
    print("This is a function")

完整装饰器例:

import time


def decorator(func):
    # 在python当中,*param + **kw可以指代任意参数
    # 当你定义一个函数不明确参数时,可以使用此方式
    def wrapper(*param, **kw):
        print(time.time())
        func(*param, **kw)

    return wrapper


@decorator
def f1(name):
    print("This is a function " + name)


@decorator
def f2(name, age, **kw):
    print("This is a function " + name + age)
    print(type(kw))


f1("wangerwa")
f2("wangerwa", "123", c='345', d='456')