《Python for Excel》读书笔记连载2:为什么为Excel选择Python?(续)

2021-11-26 14:54:19 浏览数 (1)

昨天发布第1篇连载后,受到了大家的热烈响应和鼓励。在此特别说明,这里发布的文章仅仅为学习笔记,略去了书中一些我认为无关紧要的文字,或者稍作修改,并且有些地方加上了我自己学习感悟,有兴趣的朋友可以对照原书研读。此外,如有侵权,留言告知,我会删除。

本节为《Chapter 1:Why Python for Excel?》的第二部分,讲解了Python的优势,使之成为Excel的最佳搭档。

Python for Excel

Excel便于存储、分析和可视化数据,而Python在科学计算领域特别强大,非常适合与Excel结合。同时,Python也是极少数对专业程序员和每几周编写几行代码的初学者都有吸引力的语言之一。一方面,专业程序员喜欢使用Python,因为它是一种通用编程语言,因此可以让你在不费吹灰之力的情况下实现几乎任何事情。另一方面,初学者喜欢Python,因为它比其他语言更容易学习。Python既可用于临时数据分析,也可用于较小的自动化任务,还可用于大型生产代码库,如Instagram的后端。

在本节中,将介绍Python的核心概念,并将它们与Excel和VBA进行比较。涉及代码可读性、Python的标准库和包管理器、科学计算堆栈、现代语言功能以及跨平台兼容性。

可读性和可维护性

如果你的代码是可读的,这意味着它很容易理解,特别是对于那些没有自己编写代码的局外人来说。这样可以更容易地发现错误并继续维护代码。这就是为什么Python之禅中有一行是“可读性很重要”。让我们看看VBA中的以下代码段:

If i < 5 Then

Debug.Print "i小于5"

ElseIf i <= 10 Then

Debug.Print "i在5与10之间"

Else

Debug.Print "i大于10"

End If

在VBA中,可以将代码段重新格式化为完全等效的以下格式:

If i < 5 Then

Debug.Print "i小于5"

ElseIf i <= 10 Then

Debug.Print "i在5与10之间"

Else

Debug.Print "i大于10"

End If

在第一个版本中,视觉缩进与代码的逻辑一致。这使得阅读和理解代码变得容易,也使得发现错误变得更容易。在第二个版本中,对代码不熟悉的开发人员在第一次浏览时可能看不到ElseIf和Else条件,如果代码是较大代码库的一部分,尤其如此。

Python不接受像第二个示例那样格式化的代码:它强制你将可视缩进与代码的逻辑对齐,从而防止可读性问题。Python依赖缩进来定义代码块,就像您在if语句或for循环中使用代码块一样。大多数其他语言使用大括号代替缩进,VBA使用诸如EndIf之类的关键字,正如我们刚才在代码段中看到的那样。拥有可读的代码有助于新程序员(或编写代码几个月后的你自己)回头去了解发生了什么。

标准库和包管理器

Python的标准库提供了一套丰富的内置功能。Python社区喜欢说Python附带了“电池”。无论你需要解压缩ZIP文件、读取CSV文件的值,还是想要从Internet获取数据,Python的标准库都有涵盖,通常只需几行代码就可以实现所有这些需求。而在VBA中的相同功能需要编写大量代码或安装加载项。

虽然Python的标准库涵盖了大量的功能,但当你仅依赖于标准库时,仍然存在编程繁琐或速度缓慢的任务。这就是PyPI的用武之地。PyPI代表Python包索引(PythonPackage Index),是一个巨大的存储库,每个人(包括你!)都可以在其中上传开源Python包,为Python添加额外的功能。

PyPI Vs. PyPy

PyPI发音为“pie pea eye”。这是为了区分PyPI和PyPy,PyPy发音为“pie pie”,是Python的一种快速替代实现。

例如,为了更容易从Internet上的源获取数据,可以安装Requests包来访问一组功能强大但易于使用的命令。要安装它,可以使用Python的包管理器pip,它可以在命令提示符或终端上运行。pip是pip installspackages的递归首字母缩略词。如果这听起来有点抽象,不要担心,下一章详细解释这是如何工作的。现在,更重要的是理解为什么包管理器如此重要。其中一个主要原因是,任何合理的包都不仅依赖于Python的标准库,而且还依赖于同样托管在PyPI上的其他开源包。这些依赖关系可能再次依赖于子依赖关系等等。pip递归地检查包的依赖项和子依赖项,并下载和安装它们。pip还可以方便地更新包,从而使依赖项保持最新。这使得坚持DRY原则变得更加容易,因为你不需要重新发明或复制/粘贴PyPI上已有的内容。使用pip和PyPI,还可以有一个可靠的机制来分发和安装这些依赖项,这是Excel传统加载项所缺乏的。

使用pip,你几乎可以为任何东西安装软件包,但是对于Excel用户来说,最有趣的软件包当然是用于科学计算的软件包。

科学计算

Python成功的一个重要原因是它被创建为一种通用编程语言。科学计算功能后来以第三方软件包的形式添加。这有一个独特的优势,即数据科学家可以使用与web开发人员相同的语言进行实验和研究,web开发人员可能最终围绕计算核心构建一个可用于生产的应用程序。能够用一种语言构建科学应用程序可以减少冲突、实现的时间和成本。NumPy、SciPy和pandas等科学软件包为我们提供了构建数学模型的非常简洁的方法。例如,让我们来看一个根据现代投资组合理论计算投资组合方差的更著名的金融公式:

投资组合方差用σ2表示,而w是单个资产的权重向量,C是投资组合的协方差矩阵。如果w和C是Excel单元格区域,你可以在VBA中计算投资组合方差,如下所示:

variance= Application.MMult(Application.MMult(Application.Transpose(w), C), w)

将其与Python中几乎数学化的表示法进行比较,假设w和C是pandas数据框架或NumPy数组(这将在第二部分中正式介绍):

Variance= w.T @ C @ w

但这不仅仅关乎美观和可读性:NumPy和pandas在后台使用编译好的Fortran和C代码,这与VBA相比,处理大型矩阵可以提高性能。

缺少对科学计算的支持是VBA的一个明显限制。但是,即使看看核心语言特性,VBA也落后了,这在下一节中会看到。

现代语言特征

自Excel 97以来,VBA语言在语言特性方面几乎没有任何重大变化。然而,这并不意味着VBA不再受支持:Microsoft在每一个新版本的Excel中都会提供更新,以便能够自动化该版本中引入的新Excel功能。例如,Excel2016增加了自动化PowerQuery的支持。一种在二十多年前就停止发展的语言正在失去过去几年在所有主要编程语言中引入的现代语言概念。例如,VBA中的错误处理确实显示了它的时代。如果你希望在VBA中优雅地处理错误,它是这样的:

Sub PrintReciprocal(number As Variant)

'如果number是0或字符串,则会产生错误

On Error GoTo ErrorHandler

result = 1 / number

On Error GoTo 0

Debug.Print "没有错误!"

Finally:

'无论错误是否发生都运行

If result = "" Then

result = "N/A"

End If

Debug.Print "倒数是: " & result

Exit Sub

ErrorHandler:

'仅发生错误时运行

Debug.Print "有错误: " & Err.Description

Resume Finally

End Sub

VBA错误处理涉及使用标签,如示例中的Finally和ErrorHandler。可以通过GoTo或Resume语句指示代码跳转到这些标签。早期,标签被认为是许多程序员称之为“意大利面”代码的原因:这是一种很好的说法,说明代码流很难遵循,因此很难维护。这就是为什么几乎所有积极开发的语言都引入了try/catch机制,在Python中称为try/except。如果你是一名精通VBA的开发人员,可能还喜欢Python支持类继承这一事实,这是VBA中缺少的面向对象编程功能。

除了现代语言特性外,现代编程语言还有另一个要求:跨平台兼容性。

跨平台兼容性

即使在运行Windows或macOS的本地计算机上开发代码,你也很可能希望在某个时候在服务器或云中运行程序。服务器允许你的代码按计划执行,并使你的应用程序可以从想要的任何地方访问,并具有你需要的计算能力。事实上,在下一章中,我将通过介绍托管的Jupyter笔记本,向你介绍如何在服务器上运行Python代码。绝大多数服务器都运行在Linux上,因为它是一个稳定、安全且经济高效的操作系统。而且,由于Python程序在所有主要操作系统上运行时都不需要修改,因此当从本地机器过渡到生产设置时,这将减轻很多转换的麻烦。

相比之下,即使Excel VBA在Windows和macOS上运行,也很容易引入仅在Windows上运行的功能。在官方VBA文档或论坛上,经常会看到这样的代码:

Set fso = CreateObject("Scripting.FileSystemObject")

无论何时调用CreateObject或被告知转到VBA编辑器中的“工具->引用”以添加引用,你几乎总是在处理仅在Windows上运行的代码。如果希望Excel文件在Windows和macOS上运行,则需要注意的另一个突出方面是ActiveX控件。ActiveX控件是可以放置在工作表上的按钮和下拉列表等元素,但它们只能在Windows上运行。如果希望工作簿也在macOS上运行,请确保避免使用它们!

小结

在本章中,我们初步了解了Python和Excel,这两种非常流行的技术已经存在了几十年,与我们今天使用的许多其他技术相比,这两种技术已经存在了很长时间。

Python具有Excel中缺少的令人信服的特性:标准库、包管理器、科学计算库和跨平台兼容性。通过学习如何将Excel与Python相结合,你可以在这两个方面都获得优势,并通过自动化节省时间,且因为遵循编程最佳实践更容易而犯更少的错误,此外,如果需要,将能够在Excel之外扩展应用程序。

0 人点赞