函数式编程(九)——map,filter,reduce

时间:2023-01-12 18:52:52

编程方法论

面向过程:按照一个固定的流程去模拟解决问题的流程

函数式:编程语言定义的函数 + 数学意义的函数

    y = 2*x + 1 函数用编程语言实现

    def fun(x):

      return 2*x + 1

面向对象

函数式编程

1. 不可变:不用变量保存状态,不可修改变量
# 函数式编程
# 1. 不可变:不用变量保存状态,不可修改变量

# 非函数式
a = 1
def test1():
    global a
    a += 1
    return a

# 函数式
n = 1
def test2():
    return n + 1

 

2.函数即“变量”

  a.函数可以当参数传递

  b.返回值可以式函数名

def foo(n):
    print(n)

def bar(name):
    print('my name is %s' % name)
    
foo(bar)
foo(bar('zhangsan'))

输出:

<function bar at 0x0000024E4B385C80>
my name is zhangsan
None

 

3.高阶函数 :1.函数接受的参数是一个函数名 2.返回值是函数名,两个条件满足一个就是高阶函数

# 把函数当中参数传给另外一个函数

def foo(n):
    print(n)


def bar(name):
    print('my name is %s' % name)


foo(bar)
foo(bar('zhangsan'))

# 返回值中包含函数


def test3():
    print('from test3')


def handle():
    print('from handle')
    return test3()


handle()

 

4.尾调用

  在函数的最后一步调用另外一个函数(最后一行不一定是最后一步),调用函数的栈状态不需要保存,可以用来优化递归函数,俗称:尾递归

 

map函数

# map函数

# num_l = [1, 2, 3, 4] #求平方
# ret = []
# for i in num_l:
#     ret.append(i**2)
# print(ret)

def add_one(x):
    return x + 1


def reduce_one(x):
    return x - 1


def pingfang(x):
    return x**2


def map_test(func, array):
    ret = []
    for i in array:
        res = func(i)
        ret.append(res)
    return ret


num_2 = [1, 2, 3, 4]
ret = map_test(add_one, num_2)
print(ret)
ret = map_test(reduce_one, num_2)
print(ret)
ret = map_test(pingfang, num_2)
print(ret)
ret = map_test(lambda x:x+2, num_2)     # lambda方式
print(ret)

res = map(lambda x: x + 2, num_2)       # 内置map函数 ,返回可迭代对象
print(res)      # <map object at 0x000001F62514BF60>
print(list(res))    # [3, 4, 5, 6]
print(list(map(reduce_one, num_2)))     # [0, 1, 2, 3]

msg = 'hello'
print(list(map(lambda x: x.upper(), msg)))

 

filter函数

# filter
people = ['sb_A', 'sb_B', 'C_sb', 'D_sb']


def end_with_sb(n):
    return n.endswith('sb')


def start_with_sb(n):
    return n.startswith('sb')


def filter_test1(array):
    res1 = []
    for p in array:
        if not p.startswith('sb'):
            res1.append(p)
    return res1


def filter_test2(fun, array):
    res1 = []
    for p in array:
        if not fun(p):
            res1.append(p)
    return res1


print(filter_test1(people))
print(filter_test2(start_with_sb, people))
print(filter_test2(end_with_sb, people))
print(filter_test2(lambda n1: n1.endswith('sb'), people))
print('*'*20)
ret2 = filter(lambda n2: n2.endswith('sb'), people)  # 内置函数,返回一个内存地址,保存了list地址
print(list(ret2)) # ['C_sb', 'D_sb']
ret3 = filter(lambda n2: not n2.endswith('sb'), people)
# lambda n2: n2.endswith('sb') 返回一个bool值,为true则保留
print(list(ret3)) # ['sb_A', 'sb_B']

 

info = [{'name': 'a', 'score': 80},
        {'name': 'b', 'score': 90},
        {'name': 'c', 'score': 90}]
res = filter(lambda i: i['score'] < 90, info)
print(list(res)) # [{'name': 'a', 'score': 80}

 

 

reduce函数

# reduce函数
num_3 = [1, 2, 3, 100]


def reduce_test(fun, array, init=None):
    if init is None:
        res = array.pop(0)
    else:
        res = init
    for num in array:
        res = fun(res,num)
    return res


res = reduce_test(lambda x, y: x*y, num_3)
print(res)  # 600
res = reduce_test(lambda x, y: x*y, num_3, 10)
print(res)  # 6000

from functools import reduce
num_4 = [1, 2, 3, 100]
res = reduce(lambda x, y: x+y, num_4, 10)
print(res) # 116