Python 函数式编程 map/reduce、filter函数、匿名函数lambda、装饰器

本文介绍了Python中的函数式编程概念,包括如何使用map函数对列表进行操作,如将数字转换为字符串;reduce函数的累积计算功能,如序列求和;filter函数用于筛选序列,如删除列表中的偶数;以及lambda表达式的简洁函数定义。此外,还展示了装饰器的使用,用于在函数调用前后添加日志打印。
摘要由CSDN通过智能技术生成

1 介绍

https://docs.python.org/zh-cn/3/howto/functional.html

函数式 编程将一个问题分解成一系列函数。

理想情况下,函数只接受输入并输出结果,对一个给定的输入也不会有英系那个输出内部状态。著名的函数式语言有ML家族和Haskell。

2 高阶函数

2.1 map/reduce

Python内建了map()reduce函数。
该函数的思想同Google发布的“MapReduce: Simplified Data Processing on Large Clusters”相同。

2.1.1 map方法

eg. f(x)=x^2

(1)用map方式实现

def f(x):
    return x * x

r = map(f, [1, 2, 3])
print(list(r))  # 输出:[1, 4, 9]

(2)传统方式
这种方法将 f(x)作用到了list的每一个元素,结果在新的list

def f(x):
    return x * x

L = []
for n in [1, 2, 3]:
    L.append(f(n))
print(L)  # 输出:[1, 4, 9]

eg. 将list所有数字转为字符串

print(list(map(str, [1, 2, 3])))  
# 输出:['1', '2', '3']
2.1.1 reduce方法

reduce 把一个函数作用在以下序列 [x1, x2, x3,…] 上,这个函数必须介绍2个参数, reduce 把结果继续和序列的下一个元素做积累计算,其效果为

reduce(f,[x1, x2, x3]) = f(f(f(f(x1, x2),x3),x4)

序列求和

# 1 reduce方法
from functools import reduce

def add(x, y):
    print(x, y)
    return x + y
    # 输出
    # 1 2
    # 3 3

print(reduce(add, [1, 2, 3]))
# 输出:6

# 2 直接sum方法
print(sum([1, 2, 3]))

把序列[1, 3, 5, 7, 9]变换成整数13579

# 把序列[1, 3, 5, 7, 9]变换成整数13579
from functools import reduce

def fn(x, y):
    return x * 10 + y

print(reduce(fn, [1, 3, 5, 7, 9]))

2.2 filter(筛选)

Python内包含filter()函数用于过滤序列。
map()不同的是filter()把传入的函数依次作用于每个元素,然后根据返回值值TrueFalse保留或删除元素。

filter返回的是一个Iterator, 是个惰性序列,所以要转为list

eg. 删除list中偶数,保留奇数

def is_odd(n):
    return n % 2 == 1

print(list(filter(is_odd, [1, 2, 3, 4, 5, 6])))
# 输出:[1, 3, 5]

eg. 删除序列中的空字符串

def not_empty(s):
    return s and s.strip()

print(list(filter(not_empty, ['A', '', 'C', None, '  '])))
# 输出:['A', 'C']

3 匿名函数 lambda

lambda:表示匿名函数,冒号前表示参数,冒号后为表达式(只能有一个)

eg. 求解f(x)=x^2

(1) map()函数

def f(x):
    return x * x

r = map(f, [1, 2, 3])
print(list(r))  # 输出:[1, 4, 9]

(2)lambda 方法

print(list(map(lambda x: x * x, [1, 2, 3])))
# 输出:[1, 4, 9]

4 装饰器

def use_logging(func):
    def wrapper(*args, **kwargs):
        print(">>>>>>>>>>>>>>>")
        print("%s 正在运行" % func.__name__)
        print(*args)
        print(args[0])
        print(args[1])
        print(">>>>>>>>>>>>>>>")

        return func(*args)

    return wrapper


@use_logging
def getInfo(name, age):
    print("-------")
    print(name, age)


getInfo("有勇气的牛排", "20")

参考地址:
https://docs.python.org/zh-cn/3/howto/functional.html
https://www.liaoxuefeng.com/wiki/1016959663602400/1017328525009056

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有勇气的牛排

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值