导入
列举
了解一个名为“enumerate”的转换函数,该函数用于转换可迭代的数据流。
函数式编程倾向于使用可迭代对象而非列表,因为这样可以减少副作用的风险。我们经常需要以某种方式转换一个可迭代的数据流,而 Python 提供了多种标准函数来实现这一目的。
示例:使用 enumerate 遍历元组
你可能见过在 for 循环中使用 enumerate 的写法如下:
1a = ('red', 'green', 'blue') 2for i, s in enumerate(a): 3 print(i, s)
这是一种常见用法,当你需要在循环内部访问循环计数器时就会用到。在这个例子中,循环执行三次,i 的值依次为 0、1 和 2。
你可能一直都在使用它,却从未思考过其背后的机制。如果这样,不妨深入理解一下它的原理。我们也可以用更传统的单变量循环方式来使用 enumerate,如下所示:
1a = ('red', 'green', 'blue') 2for t in enumerate(a): 3 print(t)
实际上,enumerate 返回的是一系列元组。在第一种写法中,我们只是将这些元组解包为 i, s,使得 i 分别取值 0、1、2,而 s 分别取值 'red'、'green'、'blue'。
在函数式编程的语境下,我们尽量避免使用循环,而 enumerate 正是将数据流进行转换的一个典型例子。例如,原始的数据流:
'red', 'green', 'blue'
被转换为一个新的数据流:
(0, 'red'), (1, 'green'), (2, 'blue')
这种转换通常非常有用。
可选的起始值
顺便提一下,enumerate 还支持一个可选的起始值参数,如果你不想从 0 开始计数的话。下面代码示例中的起始值为 15,效果如下:
1a = ('red', 'green', 'blue') 2for i, s in enumerate(a, 15): 3 print(i, s)