列表推导式
了解 Python 中的列表推导式。
列表推导式:一种传统方法
Python 的一个重要特性是列表推导式。在网上的各种示例中,它会反复出现,因此我们单独来学习它。虽然列表推导式在技术上不属于 NumPy 的一部分,但为了更好地解释本课内容,我们在这里进行补充说明。
以下是列表推导式的传统写法。我们先看代码,再详细讨论。
1#!/usr/bin/python 2 3import numpy as np 4 5def main(): 6 x = [5, 10, 15, 20, 25] 7 # 将 y 声明为空列表 8 y = [] 9 10 # 传统方式(不够理想) 11 for counter in x: 12 y.append(counter / 5) 13 14 print("\n传统方式:x = {} y = {}\n".format(x, y)) 15 16 # Python 式写法 17 # 使用列表推导式 18 z = [n / 5 for n in x] 19 print("列表推导式:x = {} z = {}\n".format(x, z)) 20 21 # 最后,使用 NumPy 22 try: 23 a = x / 5 24 except: 25 print("不,你不能对普通的 Python 列表直接做除法\n") 26 27 a = np.array(x) 28 b = a / 5 29 30 print("使用 NumPy:a = {} b = {}\n".format(a, b)) 31 32 return "使用 NumPy:a = {} b = {}\n".format(a, b) 33 34if __name__ == "__main__": 35 main()
我们在第 3 行导入 numpy,并将其简写为 np(这意味着我们无需每次都输入 numpy,这是 Python 中常见的命名习惯)。
接下来,在上面代码块的第 6–8 行中,我们将 x 初始化为五个值,并将 y 初始化为空列表。
我们的目标是将 x 中每个元素除以 5 后的结果存入 y。对于有 C 或 C++ 背景的人来说,最可能采用的方法如下面代码块的第 8–9 行所示:
我们遍历 x,对其中每一个值都除以 5,并将其添加到 y 中。
然后我们打印结果。这里唯一的新内容是第 11 行代码中的 format() 方法。要打印的内容放在 {} 中,实际值则传入 format() 函数中。
以下是运行结果:
1#!/usr/bin/python 2import numpy as np 3 4x = [5, 10, 15, 20, 25] 5# 将 y 声明为空列表 6y = [] 7for counter in x: 8 y.append(counter / 5) 9 10print("\n传统方式:x = {} y = {}\n".format(x, y))
如今,Python 提供了一种更简便的方法,称为 列表推导式。当我们处理列表时,通常会用到它。最常见的任务之一就是创建一个列表,对其进行操作,然后生成一个新的列表。由于这种模式非常常见,Python 开发者为此设计了简洁高效的语法。
列表推导式的基本格式
1[ <对每个元素的操作> for value in list ]
在我们的例子中,我们要将 x 中的每个元素除以 5。
1z = [n / 5 for n in x] 2print("列表推导式:x = {} z = {}\n".format(x, z))
我们使用了一个新变量 z。让我们拆解这个列表推导式:
1[for n in x]
这部分相当于标准的 for 循环,我们将遍历列表 x 中的所有值。
1[n / 5 for n in x]
对于 x 中的每个值 n,将其除以 5。方括号 [] 会将结果自动转换为列表。
与之前的写法相比,我们用一行代码替代了三行。这是一个非常简单的例子。作为一个基本规则:只要涉及列表操作,我们建议优先使用列表推导式。
使用 NumPy 的列表推导式
但为什么我们不能直接对 x 做除以 5 的操作呢?我们来尝试一下:
1try: 2 a = x / 5 3except: 4 print("不,你不能对普通的 Python 列表直接做除法\n")
上述代码使用了 Python 的 try 与 except 语句块。它尝试执行代码,如果发生异常,则进入 except 块。在此例中,无法对普通列表进行除法运算,因此会触发异常。但如果我们使用 NumPy 数组,就可以实现这一点,如下面代码块的第 17–18 行所示。
我们将 x 转换为 NumPy 数组,使用 np.array 命令。现在,我们可以直接对数组 a 进行除以 5 的操作。现在请运行下面的代码,查看结果。
1#!/usr/bin/python 2 3import numpy as np 4 5def main(): 6 x = [5, 10, 15, 20, 25] 7 8 # 将 y 声明为空列表 9 y = [] 10 11 # Python 式写法 12 # 使用列表推导式 13 z = [n / 5 for n in x] 14 print("列表推导式:x = {} z = {}\n".format(x, z)) 15 16 a = np.array(x) 17 b = a / 5 18 19 print("使用 NumPy:a = {} b = {}\n".format(a, b)) 20 21 return "使用 NumPy:a = {} b = {}\n".format(a, b) 22 23if __name__ == "__main__": 24 main()
总结:NumPy 和列表推导式各有优势。本课的目的并非推崇某一种方法优于另一种,而是帮助大家理解两种方式的特点,从而根据实际情况自由选择。希望这些内容对你有所帮助,让你能够自信地做出合适的选择!