第1章 认识Python
1.1 Python简介
当下,Python是一种在数据科学领域较为流行的程序设计语言。使用Python可以使我们更加关注要解决的问题,而不用花费太多精力处理计算机运行的复杂性方面的问题。Python 3是相对于已经结束官方支持的Python 2的更新版本。在使用Python编程的用户群体里流传着这样一则“笑话”:有人会两种语言,一种是Python 2,另一种是Python 3。虽然是一则“笑话”,但这也让我们意识到,尽管Python从版本2升级到版本3并没有造成整个程序语言的变化,但升级产生的改变还是带来了一定程度的用户迁移门槛和程序兼容性问题。大多数科学计算包的新版本只支持Python 3,因此本书以Python 3进行讲解。
Python是一种解释型语言,在Python中可以立即运行代码并获得结果,而不需要编译。与解释型语言相对的是编译型语言,例如C/C++、Fortran等。解释型语言需要一种名为解释器的程序作为运行载体。这里我们使用的Python解释器是由官方(Python软件基金会)负责开发的名为CPython的解释器(因为这个解释器由C语言编写,所以叫CPython),它是使用广泛且兼容性强的Python解释器(Python解释器有多种开源实现,但是兼容性和性能有所差异,后文的Python解释器在未额外声明的情况下均指CPython解释器)。本书建议通过Miniconda来安装CPython。Miniconda仅包含CPython和conda(一个相当优秀的包管理工具),对于其他软件包则可根据需要下载并安装。
实际上CPython的代码执行性能并不出色,但是得益于CPython与C语言良好的互操作性,需要计算性能的部分可以用编译型语言编写,在Python代码中进行调用,以达到运行性能与编写效率的最优化。本书还会介绍几种Python代码的运行优化办法。
1.1.1 Python与气象
现阶段Python已经有不少功能完善的关于地球科学的库,在科学计算和机器学习方面也拥有相当丰富的开源工具支持,气象研究人员使用Python将获得多个领域强大工具的帮助。
Python开源社区创造了一种基于Web的Jupyter Notebook工具,使用户通过Python编写代码可获得交互式体验。得益于Web技术,Jupyter可以做到“一处部署,到处运行”,更加适合科研。后文将会详细讲述Jupyter。
1.1.2 Python与NCL
由于Python在地球科学领域的广泛应用,美国国家大气研究中心(National Center for Atmospheric Research,NCAR)已经决定停止为NCL(NCAR Command Language)开发新功能且将其已有功能逐步迁移到Python。NCL开发组为此创建了一个名为GeoCAT(地球科学社区分析工具包)的项目,其中包含4个子项目:PyNGL、PyNIO、wrf-python和GeoCAT-comp。这4个子项目中只有wrf-python支持Windows操作系统。
PyNGL是基于NCL绘图组件的Python接口。但是对Jupyter没有原生支持,而且不支持Windows操作系统,所以后文将使用应用更为广泛的“Matplotlib+cartopy”作为绘图工具进行讲解。
PyNIO是基于NCL的文件读写Python接口,不支持Windows操作系统。
wrf-python是天气研究与预报(Weather Research and Forecasting,WRF)模式的处理库,支持Windows操作系统。
GeoCAT-comp是NCL语言中计算函数的迁移,不支持Windows操作系统。
1.1.3 为什么使用Miniconda
Miniconda是一种轻量级的发行版Python运行环境,它只包含conda和Python。后文我们会根据实际的需求手动安装新的第三方包。
有些读者可能听说过Anaconda,这是由Anaconda公司出品的发行版Python运行环境。Anaconda除了包含conda和Python,还预置了大量用于科学计算的包。Anaconda的缺点是安装包体积巨大,如Anaconda3-5.3.1的安装包体积已经超过600MB,安装后将占据超过3GB的磁盘空间。同时由于预置环境中安装包依赖复杂,在安装新的第三方包时容易出现依赖冲突而导致安装失败。
而Miniconda和Anaconda的一个共同点就是包含conda。conda是一个运行在Windows、macOS和Linux上的跨平台开源包管理器,虽然它是用Python编写的,但是它可以管理其他任何语言的包和运行库。在conda中可以设置完全独立的环境来运行不同版本的Python,且不影响系统原生的Python环境。pip也是Python中应用较为广泛的包管理器。与conda不同的是,pip只能管理Python的包,对Python本身和其他语言的二进制包没有管理能力,但是pip与conda并不冲突,我们在后文中会优先使用conda,在少数情况(例如某个包只在pip中分发,conda中没有)下才会使用pip。