第1章 Python编程基础
1.1 Python基础知识
1.1.1 Python3.7的安装
使用Anaconda可以直接组合安装Python、Jupyter Notebook和Spyder。Anaconda是一个开源的Python发行版本,用于进行大规模的数据处理、预测分析、科学计算,致力于简化包的管理和部署。
读者可以通过搜索Anaconda,找到Anaconda官网,并下载。
需要注意的是:我们要根据电脑的系统(Windows、macOS和Linux)选择对应的Python版本。对于Windows系统,还需要根据系统的位数选择32位或64位。另外,笔者推荐使用Python 3.7版本。
Jupyter Notebook:Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。Jupyter Notebook是以网页形式打开的程序,可以在网页页面中直接编写代码和运行代码,代码的运行结果也会直接在代码块下显示。如在编程过程中需要编写说明文档,则可在同一个页面中直接编写,便于进行及时的说明和解释(见图1-1-1)。
图1-1-1 Jupyter Notebook的运行界面
Spyder:Spyder是Python(x,y)的作者为它开发的一个简单的集成开发环境。和其他的Python开发环境相比,它最大的优点就是可以模仿MATLAB的“工作空间”功能,可以很方便地观察和修改数组的值。Spyder的界面由许多窗格构成,用户可以根据自己的喜好调整它们的位置和大小。当多个窗格出现在同一个区域时,将使用标签页的形式显示。例如在图1-1-2中,可以看到Editor、Object inspector、Variable explorer、File explorer、Console、History log以及两个显示图像的窗格。在View菜单中可以设置是否显示这些窗格。
图1-1-2 Spyder运行界面
1.1.2 包的安装与使用
在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里的代码就会越来越长,越来越不容易维护。为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(module)。模块的名字就是该文件的名字(不包含后缀)。使用模块不仅可以大大提高代码的可维护性,而且编写代码也不必从零开始。
为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(package)。一个包就是一个文件夹(Python 2规定该文件夹必须包含一个__init__.py文件,Python 3没有要求),包名就是文件夹名。包的安装可以直接打开Anaconda 3文件夹中的Anaconda Prompt对话框,输入conda install<;package>;或者pip install<;package>;,就可以安装对应的包。也可以使用conda uninstall<;package>;和pip uninstall<;package>;卸载对应的包。模块和包的导入与使用方法没有本质区别。我们在使用这些包前,需要提前将这些包导入,使用import语句可以导入4种不同的对象类型。
Python借助外在的包和模块可以实现网络爬虫、数据分析与可视化、机器学习和深度学习等诸多功能(见图1-1-3)。其中,常用于数据分析处理与机器学习的包如下。
图1-1-3 常用的Python包
● NumPy、Pandas、DASK和Numba包可用于分析数据的可拓展性与性能;
● SciPy、StatsModel和scikit-learn可用于数据的处理与分析;
● matplotlib、Seaborn、plotnine、Bokeh、Datashader和HoloViews包可实现数据结果的可视化;
● scikit-learn、PyTorch、TensorFlow和theano包可构造并训练机器学习与深度学习模型。
1.1.3 Python基础操作
1.Python注释
注释的目的是让阅读人员能够轻松读懂每一行代码的意义,同时也为后期代码的维护提供便利。在Python中,单行注释是以#号开头的。而Python的多行注释是由两个三引号(''')包含起来的。
2.Python的行与缩进
与R、C++等语言相比,Python最具特色的就是使用缩进表示代码块,而不需要使用大括号。缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数。需要特别注意的是:不一致的代码块缩进会导致代码运行错误。
3.变量与对象
Python中的任何数值、字符串、数据结构、函数、类、模块等都是对象。每个对象都有标识符、类型(type)和值(value)。几乎所有的对象都有方法与属性,都可以通过“对象名.方法(参数1,参数2,…,参数n)”或者“对象名.属性”的方式访问该对象的内部数据结构。需要注意的是:对象之间的赋值并不是复制。
复制是指复制对象与原始对象不是同一个对象,原始对象发生任何变化都不会影响复制对象的变化,可以分为浅复制(copy)和深复制(deepcopy)。浅复制是复制了对象,但对于对象中的元素,依然使用原始的引用,即只复制指向对象的指针,并不复制对象本身。深复制是指完全地复制一个对象的所有元素及其子元素,可以理解为直接复制整个对象到另一块内存中。