Python函数式编程实战:字符串与元组的不可变性、函数分类及高阶函数详解

许南星
许南星
发布时间:2026-10-14 | 4人浏览过
原创

本文深入解析Python函数式编程核心概念,重点探讨字符串与元组的不可变性及其对编程风格的影响。详细分类标量与集合函数,并通过any、all、zip等内置函数演示规约与映射操作。最后详解map、filter、sorted等高阶函数的用法与性能对比,帮助开发者掌握函数式编程技巧。

函数式编程中的字符串处理

在函数式编程范式下,Python字符串因其不可变数据结构的特性而被频繁使用。

字符串作为对象拥有众多内置方法,其调用方式与传统函数式思维中的函数应用存在差异,例如以下代码展示了这种区别。


my_str = "xiangpica"
print(my_str.upper())
print(len(my_str.upper()))

其中 len() 的调用方式被称为前置写法,而 my_str.upper() 则属于后置写法,这种差异容易导致对函数式编程理念的理解偏差,因此需要系统性地进行规范。

若将上述代码重构为 len(upper(my_str)) 的形式,逻辑将变得更加直观且符合函数式编程的习惯。


# 类型 Text 是 str 的别名
from typing import Text
my_str = "xiangpica"
def upper(str: Text) -> Text:
    return str.upper()
print(upper(my_str))
print(len(upper(my_str)))

上述重构代码中重新定义了一个前置风格的函数 upper,旨在解决函数式编程中调用一致性的问题,该解决方案在后续代码示例中将被反复应用。

不变类型:元组的应用

除了字符串,Python中另一类重要的不可变数据类型是元组,它主要分为普通元组和命名元组两种形式。

普通元组的声明与访问方式

关于元组的基础知识在前文已有阐述,建议读者简要回顾后再继续深入本文内容。

首先观察以下代码,随后分析其可理解性。


from typing import Tuple, Text, Callable
LANGUAGE = Tuple[Text, Text, Text]
python: Callable[[LANGUAGE], Text] = lambda languages: languages[1]
items = ("c","python","js")
a = python(items)
print(a)

上述代码定义了一个新类型 LANGUAGE,该类型本质上是一个包含三个元素的元组。

python 的类型注解为 Callable[[LANGUAGE], Text],这意味着其接收的参数类型为 LANGUAGE,而返回值类型为字符串。

需注意,引入 typing 模块不会影响程序的实际运行,也不会引发运行时错误,它仅用于静态类型检查,以防止运行时出现参数或返回值类型不匹配的问题,供开发人员查阅参考。

除了上述方式,还可以利用命名元组来实现类似功能。


from collections import  namedtuple
Language = namedtuple("Language",("name1", "name2", "name3"))
l = Language("c", "python", "js")
print(l)
print(l.name1)

或者直接调用 typing 模块中的 NamedTuple 功能即可实现。


from typing import NamedTuple, Text
class Language(NamedTuple):
    name: Text
    description: Text
l = Language("C", "C语言")
print(l)
print(l.name)
print(l.description)

函数的分类体系

函数主要可分为两大类:

  • 标量函数:返回结果为单一数值或对象。
  • 集合函数:返回结果为可迭代的集合类型。

集合函数还可以进一步细分为:

  • 规约/累积函数:对集合内元素进行累积计算,最终返回一个单一值。
  • 映射函数:将标量函数应用于集合中的每个元素,生成一个与原集合长度相同的新集合。
  • 过滤函数:将标量函数应用于每个元素,保留满足条件的部分,生成一个子集。

掌握上述概念后,对函数式编程的理解将更加深入。

any()、all()、len()、sum() 对比学习

any 与 all 均属于规约函数,执行的操作称为布尔规约,即将集合元素归约为 True 或 False。其中 all 要求所有值均为 True,而 any 只要有一个值为 True 即可返回 True。

len 与 sum 同样属于归约函数,分别用于计算集合中元素的个数和汇总值。

zip()、reversed()、enumerate() 详解

zip 函数可将多个可迭代对象或序列的数据进行交叉组合,即将 n 个元素的可迭代对象转换为 n 元组,并返回一个生成器。

如果 zip 函数未传入任何参数,则返回一个空列表 []。


a = zip()
print(list(a))

reversed 函数用于改变序列顺序,即实现序列反转。

enumerate 函数用于获取序列或可迭代对象的下标值,概念上是将可迭代对象映射为二元组序列(包含序号),每个二元组的第一个元素是下标,第二个元素是原值。

高阶函数的应用

学习Python函数式编程无法绕过高阶函数,其定义为以函数作为参数或返回值为函数的函数。

max 和 min() 函数解析

上述两个函数属于规约函数,输入为集合,输出为单个值,主要用途是寻找极值。

在学习过程中,可将二者视为普通函数,也可用于高阶函数场景,主要区别在于参数的位置不同。

最简单的用法示例如下:


max_num = max(1, 2, 3, 4)
min_num = min(1, 2, 3, 4)
print(max_num)
print(min_num)

接下来展示其作为高阶函数的实现方式,通过自定义比较规则。


# 第一种写法,比较字符串长度
max_num = max("a", "abc", "ceda", "aaaaa", key=lambda x: len(x))
min_num = min("a", "abc", "ceda", "aaaaa", key=lambda x: len(x))
print(max_num)
print(min_num)
# 第二种写法,比较字符串长度
max_num = max(["a", "abc", "ceda", "aaaaa"], key=lambda x: len(x))
min_num = min(["a", "abc", "ceda", "aaaaa"], key=lambda x: len(x))
print(max_num)
print(min_num)

上述代码中的 key 为可选参数,默认值为 None。

map 函数详解

map 函数用于将一个集合映射到另一个集合,例如将字符串列表中的每一项转换为整数。


data = ["1", "2", "3"]
print(map(int, data))
print(list(map(int, data)))

代码 map(int, data) 的含义是将 int 函数作用于 data 中的每一项。

map 函数的第一个参数也可以使用 lambda 来替代。


data = ["1", "2", "3"]
print(map(lambda x: int(x), data))
print(list(map(int, data)))

filter 函数详解

filter 函数主要用于将一个判定函数(谓语函数)应用于集合的每个元素,最终得到满足判定条件的结果集,测试代码如下:


data = [1, 3, 5, 7, 9]
print(filter(lambda x: x > 3, data))
print(list(filter(lambda x: x > 3, data)))

sorted 函数详解

sorted 函数同样支持通过高阶函数 key 参数来定制排序规则。


result = sorted(["afghsss", "abc", "ceda", "aaaaa"], key=lambda x: len(x))
print(result)

同一需求的不同实现效率对比

通过 map 函数、生成器表达式以及存在迭代器的生成器函数,分别对一亿数据量的列表进行测试。


import time
def demo(x):
    return x * 2
def demo1(f, l):
    for x in l:
        yield f(x)
my_list = list(range(1, 10000000))
start = time.perf_counter()
# map(lambda x: x * 2, my_list) # 程序运行耗时 3.904999999998493e-06
# (demo(x) for x in my_list) # 程序运行耗时 6.310000000009364e-06
demo1(demo, my_list) # 程序运行耗时 5.1070000000041915e-06
cost_time = time.perf_counter() - start
print("程序运行耗时", cost_time)

测试结果表明 map 执行速度最快,因此在实际开发中优先使用该方法。

以上就是Python函数式编程中字符串、元组、函数分类及高阶函数的详细内容,更多关于Python函数式编程的资料请关注本站其他相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表