Python函数式编程指南(二):从函数开始

  

关于《Python函数式编程指南(二):从函数开始》的完整攻略,我这里来作一下详细的讲解。

一、前言

本篇攻略是该系列文章的第二篇,主要介绍如何使用 Python 实现函数式编程。本篇攻略需要大家对 Python 语言和基本的编程语言思维有一定的了解和掌握。

二、函数式编程

函数式编程(Functional Programming,简称 FP)是一种编程范式,它强调函数的应用和组合,通过应用和组合实现模块化的程序设计。函数式编程不会使用共享状态,避免了很多并发编程的问题。函数式编程具有较强的表达能力和可重用性,尤其适用于广泛的并行和分布式系统。

Python 支持函数式编程,因为它是一种多范式语言,特别是 Python2 和 Python3 都提供不少函数式编程的特征。

下面将介绍 Python 函数式编程的基本特点和应用。

1. 高阶函数

高阶函数是指接受一个或多个函数作为参数,并/或返回一个新的函数的函数。

Python 中的 map、filter 和 reduce 函数都是高阶函数。下面分别介绍这三个函数的应用。

1.1 map 函数

map 函数是 Python 内置的一个高阶函数,它将一个可遍历的序列作为参数,对序列中每个元素执行函数操作,最后返回一个迭代器。其语法如下:

map(function, iterable, ...)

其中,function 表示要对 iterable 中每个元素执行的函数,iterable 表示要遍历的序列。可迭代序列可以是列表、元组等。

下面是一个对列表中每个元素进行平方操作的示例:

mylist = [1, 2, 3, 4]
result = map(lambda x: x**2, mylist)
print(list(result))

输出结果如下:

[1, 4, 9, 16]

以上示例首先定义了一个列表 mylist,然后在 map 函数中使用 lambda 表达式对 mylist 中每个元素进行平方操作,最后用 list 函数将迭代器转换为列表并输出结果。

1.2 filter 函数

filter 函数是另一个 Python 内置的高阶函数,它用于筛选序列中符合条件的元素,并将它们返回。其语法如下:

filter(function, iterable)

其中,function 表示筛选用的函数,iterable 表示将function applied to的可迭代对象。

下面是一个筛选序列中偶数的示例:

mylist = [1, 2, 3, 4]
result = filter(lambda x: x%2 == 0, mylist)
print(list(result))

输出结果如下:

[2, 4]

以上示例首先定义了一个列表 mylist,然后在 filter 函数中使用 lambda 表达式筛选出 mylist 中的偶数,最后用 list 函数将迭代器转换为列表并输出结果。

1.3 reduce 函数

reduce 函数是 Python 内置的第三个高阶函数,它们也是编写函数式编程时经常使用的函数。reduce() 函数将一个可迭代序列归约为单个结果,可以使用自定义函数或匿名函数(lambda)进行归约。其语法如下:

reduce(function, iterable, initializer)

其中,function 表示自定义函数,iterable 表示要被处理的可迭代序列,initializer 表示初始化的值。

下面是一个计算累加和的示例:

from functools import reduce
mylist = [1, 2, 3, 4]
result = reduce(lambda x, y: x+y, mylist)
print(result)

输出结果如下:

10

以上示例首先从 functools 模块引入 reduce 函数,然后在 reduce 函数中使用 lambda 表达式计算 mylist 中所有元素的累加和,并输出结果。

2. 匿名函数

匿名函数(Lambda Functions)是 Python 中一种语法简洁的函数定义方式,通常只是针对某些函数式编程场景下需要构造的小型函数。Lambda 表达式的定义形如下:

lambda [arg1, [arg2, ...], argn]: expression

例如:

func = lambda x, y: x + y
print(func(1,2))

输出结果如下:

3

以上示例定义一个两个参数的匿名函数,用于计算两个参数的和,并调用该函数输出结果。

匿名函数常应用在 filter()、map()、reduce() 等函数中,具体应用请参见前面示例。

3. 装饰器

装饰器(Decorators)是 Python 中的一个强大特性,它提供了一种简单而优雅的方式来扩展已有函数的功能。装饰器本质上是一个 Python 函数或类,它可以添加额外的功能,例如向函数中添加日志记录、增加缓存能力、执行输入和输出的验证等。

具体来说,在 Python 中,一个装饰器就是一个函数,它接受另一个函数作为参数,然后返回一个新的函数,同时保留了原函数的基础功能。

下面是一个计算函数执行时间的装饰器例子:

import time
def time_it(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print("Time used: ", end - start)
        return result
    return wrapper

@time_it
def test(num):
    sum = 0
    for i in range(num):
        sum += i
    return sum

print(test(10000000))

输出结果如下:

Time used:  0.47280263900756836
49999995000000

以上示例定义了一个 time_it 装饰器,用于计算被装饰的函数 test 的执行时间。将此装饰器应用到 test 函数上时,可直接在函数定义前使用 @ 符号添加装饰器即可,使用装饰器后,每次调用 test 函数都会计算执行时间并输出。

4. 生成器

生成器(Generator)是一种特殊的迭代器,可以用来按需生成值,而不需要一次性生成所有值。使用生成器的好处是可以减小对内存的消耗,提高程序的运行效率。在代码中,生成器通常以函数的方式定义,通过 yield 语句产生值。

下面是一个斐波那契数列生成器例子:

def fibo(num):
    a, b = 0, 1
    while a < num:
        yield a
        a, b = b, a+b

for item in fibo(10):
    print(item)

输出结果如下:

0
1
1
2
3
5
8

以上示例定义了一个生成器函数 fibo,用于生成不大于 num 的斐波那契数列值。在 for 循环中,通过 yield 语句以生成器的方式一次一次地产生值并输出。

至此,本篇攻略就结束了,希望能帮助到大家。

相关文章