【30天玩转python】函数式编程

函数式编程

函数式编程(Functional Programming,简称 FP)是一种编程范式,主要特征是使用函数进行计算,避免可变状态和数据副作用。Python 虽然是一门多范式编程语言,但它支持许多函数式编程的特性,比如高阶函数、匿名函数(lambda)、闭包、递归等。


1. 高阶函数

高阶函数是指可以接受其他函数作为参数或返回一个函数的函数。在 Python 中,函数可以像变量一样被传递和返回。

1.1 函数作为参数

Python 的函数可以作为参数传递给其他函数,这使得代码更加灵活和简洁。

示例:函数作为参数

python 复制代码
def apply_func(func, value):
    return func(value)

def square(x):
    return x * x

result = apply_func(square, 5)
print(result)  # 输出: 25

在这个例子中,apply_func 接受了 square 作为参数,并应用于值 5,返回结果 25

1.2 返回函数

函数也可以作为返回值,Python 中可以定义一个函数返回另一个函数,形成函数工厂模式。

示例:返回函数

python 复制代码
def power(exponent):
    def inner(base):
        return base ** exponent
    return inner

square = power(2)
cube = power(3)

print(square(4))  # 输出: 16
print(cube(2))    # 输出: 8

在这个示例中,power 函数返回了一个根据 exponent 不同的函数,可以生成平方、立方等函数。


2. 匿名函数(lambda)

匿名函数是在定义时不需要命名的函数,通常用于实现一些简单的功能。Python 使用 lambda 关键字创建匿名函数。

2.1 使用 lambda 表达式

lambda 表达式的语法是 lambda 参数: 返回值,适合编写简短的函数。

示例:使用 lambda 表达式

python 复制代码
square = lambda x: x * x
print(square(5))  # 输出: 25

add = lambda x, y: x + y
print(add(3, 4))  # 输出: 7
2.2 与高阶函数结合

lambda 通常与高阶函数一起使用,比如 map()filter()reduce()

示例:与高阶函数结合

python 复制代码
numbers = [1, 2, 3, 4, 5]

squared = list(map(lambda x: x ** 2, numbers))
print(squared)  # 输出: [1, 4, 9, 16, 25]

filtered = list(filter(lambda x: x % 2 == 0, numbers))
print(filtered)  # 输出: [2, 4]

3. 闭包

闭包是指在一个函数内部定义的函数可以引用外部函数的变量,并且这些变量在函数外部依然可以被访问。闭包使得函数的行为依赖于外部环境。

3.1 闭包示例

示例:闭包

python 复制代码
def outer_func(message):
    def inner_func():
        print(message)
    return inner_func

closure = outer_func("Hello, World!")
closure()  # 输出: Hello, World!

在这个例子中,inner_func 引用了外部函数 outer_func 的变量 message,即使 outer_func 已经结束执行,message 依然能够被访问。


4. 递归

递归是函数调用自身的一种编程技术。通常递归函数包含一个基准情况(结束条件),以防止无限递归。

4.1 递归示例

示例:递归实现阶乘

python 复制代码
def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n - 1)

print(factorial(5))  # 输出: 120

在这个例子中,factorial 函数通过递归调用自身计算阶乘。


5. 常用的函数式编程函数

Python 提供了一些常用的内置函数,专门用于函数式编程风格,如 map()filter()reduce()

5.1 map() 函数

map() 函数会将指定的函数应用于可迭代对象的每个元素,并返回一个迭代器。

示例:使用 map()

python 复制代码
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x * x, numbers))
print(squared)  # 输出: [1, 4, 9, 16, 25]
5.2 filter() 函数

filter() 函数用于过滤可迭代对象中的元素,返回符合条件的元素。

示例:使用 filter()

python 复制代码
numbers = [1, 2, 3, 4, 5]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)  # 输出: [2, 4]
5.3 reduce() 函数

reduce() 函数来自 functools 模块,它将一个二元函数应用于可迭代对象的所有元素,并累积结果。

示例:使用 reduce()

python 复制代码
from functools import reduce

numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
print(product)  # 输出: 120

6. 函数柯里化(Currying)

柯里化是一种将多参数函数转换为一系列单参数函数的技术。通过柯里化,可以延迟参数传递,并在不同的时间传递部分参数。

示例:函数柯里化

python 复制代码
def curried_add(x):
    def add_y(y):
        return x + y
    return add_y

add_5 = curried_add(5)
print(add_5(3))  # 输出: 8

在这个例子中,curried_add 函数将 x 固定下来,并返回一个新的函数 add_y,该函数接受另一个参数 y 并返回两者之和。


7. 不可变性

在函数式编程中,不可变性是一个重要的概念。不可变对象在创建后不能被修改,保证了程序的状态不会因为意外的更改而发生变化。虽然 Python 中的大多数数据类型是可变的,但元组、字符串等是不可变的,可以用于函数式编程中的数据处理。

示例:使用不可变对象

python 复制代码
immutable_tuple = (1, 2, 3)
# immutable_tuple[0] = 5  # 会抛出错误,因为元组是不可变的

8. 小结

函数式编程提供了一种简洁、高效的编程风格。通过高阶函数、lambda 表达式、闭包和递归,开发者可以编写更具模块化、可读性和可维护性的代码。虽然 Python 并不是纯粹的函数式编程语言,但它提供了足够的支持,使得我们能够在实际项目中采用这种编程风格。

相关推荐
16月6日-晴14 分钟前
Java面向对象进阶—多态
java·开发语言
冯汉栩42 分钟前
Swift Control RollingCountdownView(动画倒计时)
开发语言·ios·swift
lisanmengmeng1 小时前
搭建elk环境并接入frostmourne,实现监控报警效果(五)
开发语言·elk·日志·日志监控
Groundwork Explorer1 小时前
W5500 网卡编程初始化与使用指南
python·单片机
oh,huoyuyan1 小时前
JS 动态网页抓不到?试试火车采集器网页抓取工具
开发语言·javascript·ecmascript
风流 少年2 小时前
hutool
java·服务器·开发语言
逸Y 仙X2 小时前
MCP(模型控制协议)完全指南:从核心概念到实战开发
python·大模型·llm·ai编程·mcp
一木 之林2 小时前
四、STL容器与数据结构
开发语言·数据结构·c++
QX_hao2 小时前
【Go】--Cobra-cli的用法
开发语言·后端·golang
艾醒(AiXing-w)2 小时前
LangChain 1.0 入门(三):稳定性双核心——重试机制+速率限速器参数详解与实战
开发语言·langchain·php