您在这里:首页 > 深入 Python > 函数式编程 > 以数据为中心的编程 | << >> | ||||
深入 Python从 Python 新手到专家 |
现在,您可能在挠头,想知道为什么这比使用 for 循环和直接函数调用更好。这是一个完全有效的问题。大多数情况下,这是一个视角问题。使用 map 和 filter 会迫使您将思考中心放在数据上。
在这种情况下,您一开始根本没有数据;您做的第一件事是 获取当前脚本的目录路径,并获取该目录中的文件列表。这是引导程序,它为您提供了可以使用的真实数据:文件名列表。
但是,您知道您并不关心所有这些文件,只关心那些实际上是测试套件的文件。您有 太多数据,因此您需要对其进行 filter 过滤。您怎么知道要保留哪些数据?您需要一个测试来决定,因此您定义了一个测试并将其传递给 filter 函数。在这种情况下,您使用正则表达式来决定,但无论您如何构建测试,概念都是相同的。
现在您有了每个测试套件的文件名(并且只有测试套件,因为其他所有内容都已被过滤掉),但您实际上想要的是模块名称。您有正确数量的数据,但它是 错误的格式。因此,您定义了一个函数,该函数将单个文件名转换为模块名称,并将该函数映射到整个列表。从一个文件名,您可以获得一个模块名称;从文件名列表中,您可以获得模块名称列表。
您可以使用带有 if 语句的 for 循环来代替 filter。您可以使用带有函数调用的 for 循环来代替 map。但是像这样使用 for 循环是繁琐的工作。往好了说,它只是浪费时间;往坏了说,它会引入难以察觉的错误。例如,您需要弄清楚如何测试条件“此文件是测试套件吗?”;这是特定于应用程序的逻辑,任何语言都不能为我们编写。但是,一旦您弄清楚了这一点,您真的想费心定义一个新的空列表,编写一个 for 循环和一个 if 语句,并手动调用 append 将每个元素添加到新列表中(如果它通过了条件),然后跟踪哪个变量保存新的过滤数据,哪个变量保存旧的未过滤数据吗?为什么不定义测试条件,然后让 Python 为我们完成剩下的工作呢?
哦,当然,您可以尝试花哨一点,在不创建新列表的情况下就地删除元素。但你以前就被这个烫伤过。尝试修改正在循环遍历的数据结构可能会很棘手。您删除了一个元素,然后循环到下一个元素,突然您跳过了一个元素。 Python 是以这种方式工作的语言之一吗?您需要多长时间才能弄清楚?下次尝试时,您是否会确定记住它是否安全?程序员花费了如此多的时间,并在处理此类纯粹的技术问题上犯了如此多的错误,而这一切都是毫无意义的。它根本不会推进您的程序;这只是繁琐的工作。
当我第一次学习 Python 时,我拒绝使用列表推导式,并且我抵制 filter 和 map 的时间更长。我坚持让自己的生活更加艰难,坚持使用熟悉的 for 循环、if 语句和循序渐进的以代码为中心的编程方式。我的 Python 程序看起来很像 Visual Basic 程序,详细说明了每个函数中每个操作的每个步骤。它们都有相同类型的小问题和难以察觉的错误。而这一切都是毫无意义的。
让这一切都过去吧。繁琐的代码并不重要。数据很重要。数据并不难。它只是数据。如果您的数据太多,请对其进行过滤。如果它不是您想要的,请对其进行映射。专注于数据;将繁琐的工作抛在脑后。
<< 重新审视列表映射 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
动态导入模块 >> |