(一)Python编程基础

一、编程语言是什么

正式学习 Python 之前,我们有必要先搞清楚【编程语言】这个概念。

在我们很小的时候,父母就教我们开口说话,也教我们如何理解别人讲话的意思。经过长时间的熏陶和自我学习,我们在不知不觉中学会了说话,也能听懂其他小朋友说话的意思,于是我们开始用语言与他人交流。

世界上存在许多种语言,包括汉语、英语、日语、俄语等等,每种语言都有固定的格式,比如汉语(中国话),每个汉字代表着不同的意思,我们必须正确的表达,才能让对方理解。例如让父母给你10元零花钱,你会说“爸爸给我10元钱,我要买零食”,如果说“10元爸爸给钱我零食买我要”,父母就会觉得很奇怪,听不懂我们的意思,甚至引来他们的责备。

通过有固定格式和固定词汇的“语言”来与父母沟通,让父母满足你的心愿,从而达到“控制”父母的目的,这就是语言的作用。同样,我们也可以通过“语言”来控制计算机,让计算机为我们做事情,这样的语言就叫做编程语言(Programming Language)。

和人类的语言一样,编程语言也有很多种,据不完全统计,全世界大概有 600 多种编程语言,其中比较流行的语言有 20 多种,比如 C语言、C++、Java、Python、PHP、C#、JavaScript 等,这些语言各有千秋,都有自己擅长的方面:

表1:编程语言

编程语言 主要用途
C/C++ C++ 是在C语言的基础上发展起来的,C++ 包含了C语言的所有内容,C语言是C++的一个部分,它们往往混合在一起使用,所以统称为 C/C++。C/C++主要用于 PC软件开发、Linux 开发、游戏开发、单片机和嵌入式系统。
Python Python 主要用于自动化运维、网站开发、数据分析、人工智能、云计算等技术领域,近年来势头强劲,备受开发者青睐。
Java Java 可以用于网站后台开发、Android 开发、PC软件开发,近年来又涉足了大数据领域(这主要归功于 Hadoop 框架的流行)。
PHP PHP 主要用来开发网站后台程序。
C# C# 的实现机制和 Java 类似,目前主要用于 Windows 平台的软件开发,以及少量的网站后台开发。
JavaScript JavaScript 最初只能用于网站前端开发,是前端开发的唯一语言。近年来由于 Node.js 的流行,JavaScript 在网站后台开发中也占有了一席之地,并且在迅速增长。

可以将不同的编程语言比喻成各国语言,为了表达同一个意思,可能使用不同的语句。例如,表达“世界你好”:

  • 汉语:世界你好
  • 英语:Hello World
  • 日语:世界こんにちは

对于编程语言来说,执行同一个操作,也需要使用不同的语句。举个简单的例子,在屏幕上显示 "Hello,C语言中文网":

  • C语言:printf("Hello,C语言中文网");
  • PHP:echo "Hello,C语言中文网";
  • Python:print("Hello,C语言中文网")

通过例子可以看出,编程语言和人类语言类似,都由直观的词汇组成,我们很容易理解它的意思。比如在 Python 中,我们使用print()让计算机在屏幕上显示文字,print 英文原意为打印、输出的意思,我们能够轻易地理解它;同时,我们还要注意语句格式,把待显示的内容Hello, C语言中文网加上英文状态的引号""放在括号内,这是 Python 语言规定的格式,我们必须这样写。

每一种编程语言都有固定的词汇和格式,学习一门编程语言,本质上就是学习如何使用这些词汇和格式。

总结:编程语言是用来控制计算机的一系列指令(Instruction),它有固定的格式和词汇(不同编程语言的格式和词汇不一样),必须遵守,否则就会出错,达不到我们的目的。习惯上,我们将这一条条指令称为代码,这些代码共同组成一个计算机程序,而用编程语言来编写程序的过程称为编码

【表1】中提到的编程语言,都是高级计算机语言,设计它们的目的是为了方便程序员理解和使用。但严格意义上来说,计算机只能理解一种非常低级的编程语言,也就是机器语言

举个简单的例子,计算 2 个数的和,机器语言需要控制计算机依次完成以下操作:

  • 将位于内存空间位置在 0x0001 的数加载到 CPU 中;
  • 再把位于内存空间位置在 0x0010 的数也加载到 CPU中;
  • 在 CPU 中,对这 2 个数做求和操作;
  • 将结果存储在位置为 0x0011 的内存空间。

CPU(Central Processing Unit,简称 CPU) 即中央处理器,是计算机的运算和控制核心,相当于计算机的大脑,所有的机器指令都是由 CPU 负责执行的。

可以看到,对 2 个数执行求和操作需要做这么多工作,这还只是笼统地描述,实际上会更加复杂。而使用 Python 这样的高级语言,对 2 个数求和可以直接用 a + b  的形式表示。下面使用 Python 进行演示:

>>>2 + 3
5

这种方式虽然轻便快捷,但同时也带来了问题,我们需要设计一种方法,将高级语言翻译成计算机可以执行的机器语言。目前,有两种方法可以实现,分别是编译器解释器

使用编译器将自身转换成机器语言的高级语言,通常称为编译型语言;而使用解释器将自身转换成机器语言的高级语言,称为解释型语言,Python 就是一种解释型编程语言。

关于编译型语言和解释型语言的含义和区别,后续章节会进行详细介绍。

二、编程型语言和解释型语言的区别

通过高级语言编写的源码,我们能够轻松理解,但对于计算机来说,它只认识二进制指令,源码就是天书,根本无法识别。源码要想执行,必须先转换成二进制指令。

所谓二进制指令,也就是由 0 和 1 组成的机器码,能被计算机直接识别并执行。

然而,究竟在什么时候将源代码转换成二进制指令呢?不同的编程语言有不同的规定:

  • 有的编程语言要求必须提前将所有源代码一次性转换成二进制指令,也就是生成一个可执行程序(比如 Windows 下的 .exe 文件),比如C语言、C++、Golang、汇编语言等,它们都属于编译型语言,使用的转换工具称为编译器
  • 有的编程语言可以一边执行一边转换,需要哪些源代码就转换哪些源代码,不会生成可执行程序,比如 Python、JavaScript、PHP、Shell 等,这类编程语言称为解释型语言,使用的转换工具称为解释器

简单地理解,编译器和解释器其实就是一个“翻译工具”,对源代码进行“翻译”是一个很复杂的过程,大致包括词法分析、语法分析、语义分析、性能优化、生成可执行文件等五个步骤,期间涉及到复杂的算法和硬件架构,有兴趣的读者请参考《编译原理》一书,这里不再赘述。

编译型语言和解释型语言的执行流程如下所示:

(一)Python编程基础_第1张图片

图1:编译型语言和解释型语言的执行流程


总结:对于编译型语言来说,在执行之前先要经过编译器将源码转换成 CPU 可识别的机器码文件(比如 Windows 下的 .exe 文件);解释型语言无需预先编译,而是由解释器逐行对源码进行解释,一边解释一边执行。

除编译型和解释型语言外,还有一种半编译半解释型语言,比如 Java 和 C# 等,这类语言将源代码先转换成一种中间文件(字节码文件),然后再将中间文件拿到虚拟机中执行。

那么,编译型语言和解释型语言各有什么特点呢?它们之间又有什么区别?

1、编译型语言

对于编译型语言,开发完成以后需要将所有的源代码都转换成可执行程序,比如 Windows 下的.exe文件就是一个可执行程序,它里面包含的就是机器码,只要拥有这个可执行程序,就可以随时运行,不需要再重新编译,也就是“一次编译,无限次运行”。

在运行的时候,我们只需要编译生成的可执行程序,此时就不再需要源代码和编译器,所以编译型语言可以脱离开发环境运行。

编译型语言通常是不能跨平台的,也就是不能在不同的操作系统之间随意切换。

编译型语言不能跨平台表现在两个方面:

1) 可执行程序不能跨平台

可执行程序不能跨平台很容易理解,因为不同操作系统对可执行文件的内部结构有着截然不同的要求,彼此之间也不能兼容。不能跨平台是天经地义,能跨平台反而才是奇葩。

比如,你不能将 Windows 下的可执行程序拿到 Linux 下使用,也不能将 Linux 下的可执行程序拿到 macOS 下使用(虽然它们都是类 Unix 系统)。

注意:相同操作系统的不同版本之间也不一定兼容,比如不能将 x64 程序(Windows 64 位程序)拿到 x86 平台上(Windows 32 位平台)运行。但反之一般可行,因为 64 位 Windows 对 32 位程序做了很好的兼容性处理。

2) 源代码不能跨平台

不同平台支持的函数、类型、变量等都可能不同,基于某个平台编写的源代码一般不能拿到另一个平台直接运行。下面以C语言为例进行说明。

【实例1】在C语言中,要想让程序暂停,我们可以使用“睡眠”函数。在 Windows 平台下该函数是 Sleep() ,并以毫秒为时间单位,而在 Linux 平台下则是 sleep(), 以秒为单位。可以看出,首先两个函数的首字母大小写不同,再者 Sleep() 的参数是毫秒,而 sleep() 的参数是秒,单位也不一样。

以上两个原因导致具有暂停功能的C语言程序不能跨平台,除非在代码层面对平台的兼容性做出处理,但这非常麻烦。

【实例2】虽然不同平台的C语言都支持 long 类型,但不同平台下 long 类型所占用的字节长度却不相同。例如 Windows 64 位平台下的 long 占用 4 个字节,Linux 64 位平台下的 long 却占用 8 个字节。

如果在 Linux 64 位平台下编写代码时,将 8 字节的值赋值给 long 类型的变量,这是完全没有问题的,但如果是在 Windows 平台下就会导致数值溢出,让程序产生错误的运行结果。

2、解释型语言

对于解释型语言,每次执行程序都需要一边转换一边执行,用到哪些源代码就将哪些源代码转换成机器码,用不到的则不进行任何处理。

由于每次执行程序都需要重新转换源代码,所以解释型语言的执行效率天生就低于编译型语言,甚至是数量级的差距。因此计算机的一些底层功能,或者关键算法,一般都使用 C/C++ 实现,只有在应用层面(比如网站开发、批处理、小工具等)才会使用解释型语言。

在运行解释型语言的时候,我们始终都需要源代码和解释器,所以说它无法脱离开发环境。

例如,当我们说“下载一个程序(软件)”时,不同类型的语言有不同的含义:

  • 对于编译型语言,我们下载到的是可执行文件,源代码被作者保留,所以编译型语言的程序一般是闭源的
  • 对于解释型语言,我们下载到的是所有的源代码,因为作者不给源代码就没法运行,所以解释型语言的程序一般是开源的

相比于编译型语言,解释型语言几乎都能跨平台,“一次编写,到处运行”是真实存在的,而且比比皆是。那么,为什么解释型语言就能跨平台呢?

其实,这一切都要归功于解释器!

这里所说的跨平台,是指源代码跨平台,而非解释器跨平台。解释器用来将源代码转换成机器码,它本质上就是一个可执行程序,是绝对不能跨平台的。

我们以 Python 为例,Python 官方针对不同平台(比如 Windows、macOS、Linux )开发了不同的解释器,这些解释器必须要遵守同样的语法,识别同样的函数,完成同样的功能。只有这样,同一份代码才能在不同平台上拥有相同的执行结果。

你看,解释型语言之所以能够跨平台,是因为有了解释器这个中间层。在不同的平台下,解释器会将相同的源代码转换成不同的机器码,解释器帮助我们屏蔽了不同平台之间的差异性。

关于Python

Python 属于典型的解释型语言,所以运行 Python 程序需要解释器的支持,只要你在不同的平台安装了不同的解释器,你的代码就可以随时随地运行,不用担心任何兼容性问题,真正实现了“一次编写,到处运行”。

Python 几乎支持所有常见的平台,比如 Linux、Windows、macOS、Android、FreeBSD、Solaris、PocketPC 等,我们所写的 Python 代码无需修改就能直接在这些平台上正确运行。也就是说,Python 的可移植性是很强的。

3、总结

下表对编译型语言和解释型语言的差异进行了总结:

类型 原理 优点 缺点
编译型语言 通过专门的编译器,将所有源代码一次性转换成特定平台(Windows、Linux、macOS等)的机器码(以可执行文件的形式存在)。 编译一次后,脱离了编译器也能运行,并且运行效率高。 可移植性差,不够灵活。
解释型语言 通过专门的解释器,根据需要可以将部分或全部源代码转换成特定平台(Windos、Linux、macOS等)的机器码。 跨平台性好,通过不同的解释器,将相同的源代码解释成不同平台下的机器码。 一边执行一边转换,效率较低。

三、Python是什么

Python 是荷兰人 Guido van Rossum (吉多·范罗苏姆,中国程序员称其为“龟叔”)在 1990 年初开发的一种解释型编程语言。

我们已经在《编译型语言和解释型语言的区别》一文中讲解什么是解释型语言。

Python Logo

图1:Python 的标志(Logo)

Python 的诞生是极具戏曲性的,据 Guido 自述记载,Python 语言是在圣诞节期间为了打发无聊的时间而开发的,之所以会选择 Python 作为该编程语言的名字,是因为 Guido 是 Monty Python 戏剧团的忠实粉丝。

(一)Python编程基础_第2张图片

图2:Python之父——吉多·范罗苏姆

Python 语言是在 ABC 语言的基础上发展而来,其设计的初衷是成为 ABC 语言的替代品。ABC 语言虽然是一款功能强大的高级语言,遗憾的是,由于 ABC 语言不开放的原因,导致它没有得到普及应用。基于这个考虑,Guido 在开发 Python 之初就决定将其开源。

Python 中不仅添加了许多 ABC 语言没有的功能,同时,还为其设计了各种丰富而强大的库,利用这些 Python 库,程序员可以把使用其它语言制作的各类模块(尤其是C语言和 C++)很轻松地“黏连”在一起,因此 Python 又常被称为“胶水”语言。

注意:这里所说的库和模块,简单地理解就是一个个的源文件,每个文件中都包含可实现各种功能的方法(也可称为函数)。

从整体上看,Python 语言最大的特点就是简单,该特点主要体现在以下两个方面:

  • Python 的语法非常简洁明了,即便是非软件专业的初学者,也很容易上手。
  • 和其它编程语言相比,实现同一个功能,Python 语言的实现代码往往是最短的。

网络上一直流传着“人生苦短,我用 Python”的说法,此言非虚!

看似 Python 是“不经意间”开发出来的,但丝毫不比其它编程语言差。事实也是如此,自 1991 年 Python 第一个公开发行版问世后,Python 从一名默默无闻的小卒开始成长,终于厚积薄发,一鸣惊人:

  • 2004 年,Python 的使用率呈线性增长,不断受到编程者的欢迎和喜爱;
  • 2010 年,Python 荣膺 TIOBE 『2010 年度最佳编程语言』桂冠;
  • 2017 年,IEEE Spectrum 发布的 『2017 年度编程语言』排行榜中,Python 位居第 1 位;
  • 2018 年,Python 斩获 TIOBE『2018 年度最佳编程语言』第 1 名;
  • 2020 年和 2021年,Python 更是连续两年摘得 TIOBE『年度最佳编程语』言桂冠。

直至现在(2022 年 7 月份),根据 TIOBE 排行榜的显示,Python 依然占据第 1 名的位置,并且市场份额仍在持续提升(如表 2 所示)。

表 1 TIOBE 2022 年 7 月份编程语言排行榜(前 20 名)

2022年7月 2021年7月 编程语言 市场份额 变化
1 3

最佳编程语言

Python

13.44%

 +2.48%

2 1 C 13.13%

 +1.50%

3 2 Java 11.59%

 +0.40%

4 4 C++ 10.00%

 +1.98%

5 5 C# 5.65%

 +0.82%

6 6 Visual Basic 4.97%

 +0.47%

7 7 JavaScript 1.78%

 -0.93%

8 9 Assembly language 1.65%

 -0.76%

9 10 SQL 1.64%

 +0.11%

10 16 Swift 1.27%

 +0.20%

11 8 PHP 1.20%

 -1.38%

12 13 Go 1.14%

 -0.03%

13 11 Classic Visual Basic 1.07%

 -0.32%

14 20 Delphi/Object Pascal 1.06%

 +0.21%

15 17 Ruby 0.99%

 +0.04%

16 21 Objective-C 0.94%

 +0.17%

17 18 Perl 0.78%

 -0.12%

18 14 Fortran 0.76%

 -0.36%

19 12 R 0.76%

 -0.57%

20 19 MATLAB 0.73%

 -0.15%

由于人工智能、大数据等行业的发展,使得 Python 近几年增姿迅猛,甚至把 C 语言、C++ 和 Java 甩在身后 ,成为编程语言排行榜冠军。

最后,我们不妨再看一下 Python 历年来的市场份额变化曲线(浅蓝色曲线表示 Python)。

(一)Python编程基础_第3张图片

图3:Python 历年来市场份额变化曲线(点击查看详情)

可以看出,Python 已然站在风口之上。

错过了 C/C++ 的 PC 时代,又错过了 Java 的互联网和智能手机时代,你还想错过 Python 的人工智能和大数据时代吗?Python 正位于软件产业的第四次风口之上,把握好风口,你就能飞起来。

四、Python的特点(优点和缺点)

Python 是一种开源的解释型脚本编程语言,它之所以非常流行,主要有三点原因:

  • Python 简单易用,学习成本低,看起来非常优雅干净;
  • Python 标准库和第三库众多,功能强大,既可以开发小工具,也可以开发企业级应用;
  • Python 站在了人工智能和大数据的风口上,站在风口上,猪都能飞起来。

举个简单的例子来说明一下 Python 的简单:比如要实现某个功能,C语言可能需要 100 行代码,而 Python 可能只需要几行代码,因为C语言什么都要得从头开始,而 Python 已经内置了很多常见功能,我们只需要导入包,然后调用一个函数即可。

简单就是 Python 的巨大魅力之一,是它的杀手锏,用惯了 Python 再用C语言简直不能忍受。

本文就来汇总一下 Python 的特性,综合对比一下它的优缺点。

1、Python的优点

(1)语法简单

和传统的 C/C++、Java、C# 等语言相比,Python 对代码格式的要求没有那么严格,这种宽松使得用户在编写代码时比较舒服,不用在细枝末节上花费太多精力。我来举两个典型的例子:

  • Python 不要求在每个语句的最后写上分号,当然写也没错;
  • 定义变量时不需要指明类型,甚至可以给同一个变量赋值不同类型的数据。

上述两点也是 PHP、JavaScript、MATLAB 等常见脚本语言都具备的特性。

Python 是一种代表极简主义的编程语言,阅读一段排版优美的 Python 代码,就像在阅读一个英文段落,非常贴近人类语言,所以人们常说,Python 是一种具有伪代码特点的编程语言。

伪代码(Pseudo Code)是一种算法描述语言,它介于自然语言和编程语言之间。编写伪代码的目的是为了使被描述的算法可以更容易地以任何一种编程语言实现,比如 C、C++、Java 等。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似于自然语言。如果你学过数据结构,阅读过严蔚敏的书籍,那你一定知道什么是伪代码。

为什么说简单就是杀手锏?一旦简单了,一件事情就会变得很纯粹;我们在开发 Python 程序时,可以专注于解决问题本身,而不用顾虑语法的细枝末节。在简单的环境中做一件纯粹的事情,那简直是一种享受。

(2)Python 是开源的

开源,也即开放源代码,意思是所有用户都可以看到源代码。

Python 的开源体现在两方面:

① 程序员使用 Python 编写的代码是开源的。
比如我们开发了一个 BBS 系统(即网络论坛),放在互联网上让用户下载,那么用户下载到的就是该系统的所有源代码,并且可以随意修改。这也是解释型语言本身的特性,想要运行程序就必须有源代码。

② Python 解释器和模块是开源的。
官方将 Python 解释器和模块的代码开源,是希望所有 Python 用户都参与进来,一起改进 Python 的性能,弥补 Python 的漏洞,代码被研究的越多也就越健壮。

这个世界上总有那么一小撮人,他们或者不慕名利,或者为了达到某种目的,会不断地加强和改善 Python。千万不要认为所有人都是只图眼前利益的,总有一些精英会放长线钓大鱼,总有一些极客会做一些炫酷的事情。

(3)Python 是免费的

开源并不等于免费,开源软件和免费软件是两个概念,只不过大多数的开源软件也是免费软件;Python 就是这样一种语言,它既开源又免费。

如果你想区分开源和免费的概念,请猛击:开源就等于免费吗?用事实来说话

用户使用 Python 进行开发或者发布自己的程序,不需要支付任何费用,也不用担心版权问题,即使作为商业用途,Python 也是免费的。

(4)Python 是高级语言

这里所说的高级,是指 Python 封装较深,屏蔽了很多底层细节,比如 Python 会自动管理内存(需要时自动分配,不需要时自动释放)。

高级语言的优点是使用方便,不用顾虑细枝末节;缺点是容易让人浅尝辄止,知其然不知其所以然。

(5)Python 是解释型语言,能跨平台

解释型语言一般都是跨平台的(可移植性好),Python 也不例外,我们已经在《编译型语言和解释型语言的区别》中进行了讲解,这里不再赘述。

(6)Python 是面向对象的编程语言

面向对象(Object Oriented)是大多数“现代”语言(即第三代编程语言)都具备的特性,否则在开发中大型程序时会捉襟见肘。

Python 虽然支持面向对象,但它并不强制你使用这种特性。Java 是典型的面向对象的编程语言,它强制必须以类和对象的形式来组织代码。除 Python 和 Java 外,C++、C#、PHP、RuBy、Perl 等,也都支持面向对象的特性。

除了面向对象的编程语言外,还有一种面向过程的编程语言,其中最典型的代表就是 C 语言。

(7)Python 功能强大(模块众多)

Python 的模块众多,基本实现了所有的常见的功能,从简单的字符串处理,到复杂的 3D 图形绘制,借助 Python 模块都可以轻松完成。

Python 社区发展良好,除了 Python 官方提供的核心模块,很多第三方机构也会参与到模块的开发中,这其中就有 Google(谷歌)、Facebook(脸书)、Microsoft(微软) 等软件巨头。

在 Python 中,即使是一些小众的功能,它往往也有对应的开源模块,甚至有可能不止一个。

(8)Python 可扩展性强

Python 的可扩展性体现在它的模块,Python 具有脚本语言中最丰富、强大的库或模块,这些库或模块覆盖了文件操作、图形界面编程、网络编程、数据库访问等绝大部分应用场景。

值得注意的是,这些类库的底层代码不一定都是 Python,还有很多 C/C++ 的身影。

比如当需要一段关键代码运行速度更快时,就可以使用 C/C++ 语言实现,然后在 Python 中调用它们。Python 能把其它语言“粘”在一起,所以被称为“胶水语言”。

Python 依靠其良好的扩展性,在一定程度上弥补了运行效率慢的缺点。

2、Python 的缺点

除了上面提到的各种优点,Python 也是有缺点的。

(1)运行速度慢

运行速度慢是解释型语言的通病,Python 也不例外。

Python 速度慢不仅仅是因为一边运行一边“翻译”源代码,还因为 Python 是高级语言,屏蔽了很多底层细节。这个代价也是很大的,Python 要多做很多工作,有些工作是很消耗资源的,比如管理内存。

Python 的运行速度几乎是最慢的,不但远远慢于 C/C++,还慢于 Java。

但是速度慢的缺点往往也不会带来什么大问题。首先是计算机的硬件速度运来越快,多花钱就可以堆出高性能的硬件,硬件性能的提升可以弥补软件性能的不足。

其次是有些应用场景可以容忍速度慢,比如网站,用户打开一个网页的大部分时间是在等待网络请求,而不是等待服务器执行网页程序。服务器花 1ms 执行程序,和花 20ms 执行程序,对用户来说是毫无感觉的,因为网络连接时间往往需要 500ms 甚至 2000ms。

(2)代码加密困难

不像编译型语言那样,源代码会被编译成可执行程序(这个编译过程就相当于对源码加密),对于 Python 来说是直接运行源代码,因此对源码加密是比较困难的。

开源是未来软件产业的大趋势,传统程序员需要转变观念。

五、没有编程基础可以学Python吗

“编程零基础,可以学习 Python 吗”,这是很多初学者经常问我的一个问题。当然,在计算机方面的基础越好,对学习任何一门新的编程语言越有利。但如果你是零基础,也不用担心,因为无论用哪门语言作为学习编程的入门语言,总是要有一个开始。

1、我真的能学会吗?

就我个人的观点,Python 作为学习编程的入门语言是再合适不过的。

凡是学习过 C 语言的同学都感同身受,认为 C 语言不是很好的入门语言,很多曾经立志学习编程的读者,在学习了 C 语言之后,就决心不再学习编程。因此,是否学会 C 语言,好像成为了进入编程行业的筛选标准。

但是,如果将 Python 作为编程入门语言,就不会遭遇类似 C 语言的窘境。目前,逐渐有高校开始使用 Python 作为软件专业大学生(甚至包含非软件专业)的入门编程语言。

2017 年,浙江省信息技术课程改革方案出台,Python 被纳入浙江省信息技术高考;同年 12 月,山东省在其最新的出版的小学信息技术六年级教材中,也加入了 Python 相关内容。可以看出,Python 逐渐地在中小学生群体中得到普及。

本教程始终贯彻的思想就是零基础也能学 Python,教程的目标就是和初学者一起,从零基础开始学习 Python。因此,编程零基础的你,无需犹豫,不用担心,中小学生都在学,你肯定也能学!

2、编码能力差怎么办?

除此之外,很多初学者还面临这样一个问题,那就是教程已经学完啦,教程中的代码也都已经亲自编写并运行通过了,但还是不知道如何开发一个真正的应用程序,面对问题还是不知道如何下手解决。

如果你深有同感,只能说明你缺乏练习,代码编辑量太少。

从编程零基础到专业程序员的过程,除了要大量学习各类基础知识,还要注重培养自己的编程思维,这没有捷径,只有靠不断积累自己的代码量。

(1)三人行必有我师

当然,增加代码量并不是要我们去盲目地编写代码,如果找不到增加代码量的方向,可以从阅读别人的代码开始。

需要注意的是,在阅读他人编写的代码时,要边阅读边思考,多问几个为什么,例如代码为什么要这么写,有什么意图,有没有更简单的方法可以实现等等,必要情况下还可以给代码进行必要的注释。不仅如此,在完全理解他人代码的前提下,还可以试图对代码做修改,实现一些自己的想法。做到这些,才能说明你汲取了他人的思维养分,消化了他人的代码。

(2)遇到问题别心慌

初学者在写代码或者调试代码的过程中,肯定会遇到很多问题,怎么办呢?最好的方法就是借助网络寻找答案,看看类似的问题别人是如何解决的,千万不要总是局限在自己的思维范围中。在这里,给大家推荐一个专门针对编程答疑解惑的网站 Stack OverFlow。

六、Python能干什么,Python的应用领域

Python 作为一种功能强大的编程语言,因其简单易学而受到很多开发者的青睐。那么,Python 的应用领域有哪些呢?

Python 有着非广泛的应用,几乎所有大中型互联网公司都在使用 Python,例如国外的 Google、Youtube、Dropbox,国内的百度、新浪、搜狐、腾讯、阿里、网易、淘宝、知乎、豆瓣、汽车之家、美团等等,Python 帮助它们完成了各种各样的任务。

概括起来,Python 的应用领域主要有如下几个。

1、Web应用开发

在 Web 开发领域,Python 绝对是一颗冉冉升起的新星。尽管 PHP、JS 目前依然是 Web 开发的主流语言,但 Python 上升势头非常猛劲。尤其随着 Python 的 Web 开发框架逐渐成熟(比如 Django、Flask、Tornado、Web2py 等等),程序员可以更轻松地开发、管理复杂的 Web 程序。

(一)Python编程基础_第4张图片

图1:Python Web 开发框架

举个最直观的例子,全球最大的搜索引擎 Google,在其网络搜索系统中就广泛地使用了 Python 语言。另外,我们经常访问的集电影、读书、音乐于一体的豆瓣网(如图 2 所示),也是使用 Python 开发的。

(一)Python编程基础_第5张图片

图2:用 Python 实现的豆瓣网

不仅如此,全球最大的视频网站 Youtube 以及 Dropbox(一款网络文件同步工具)也都是用 Python 实现的。

2、自动化运维

所谓自动化运维,实际上就是利用一些开源的自动化工具来管理服务器,比如业界流行的 Ansible(基于Python开发),它能帮助运维工程师解决重复性的工作。

Python 作为一种脚本语言,提供了诸多方便与服务器交互的软件包,比如 Python 标准库中包含了多个可用来调用操作系统功能的库。

例如,通过 pywin32 这个软件包,我们能访问 Windows 的 COM 服务以及其他 Windows API;使用 IronPython,我们能够直接调用 .Net Framework。

一般来说,Python 编写的系统管理脚本,无论是可读性,性能、还是代码重度和扩展性等方面,都要优于 shell 语言编写的脚本。

3、人工智能领域

人工智能是当前非常火的一个研究方向,如果要评选当前最热门、工资最高的 IT 职位,那么一定非人工智领域的工程师莫属。

人工智能的核心是机器学习,机器学习的研究可分为传统机器学习和深度学习,它们两者被广泛的应用于图像识别、智能驾驶、智能推荐、自然语言处理等应用方向。

在众多编程语言中 Python 绝对是人工智能的首选语言,这是因为 Python 在机器学习和深度学习方面有着非常出众的优势。可以这么说,人工智能已经无法离开 Python 的支持,总结原因大致有以下几点:

  • 目前世界上优秀的人工智能学习框架,比如 Google 的 TransorFlow(神经网络框架)、FaceBook 的 PyTorch(神经网络框架)以及开源社区的 Karas 神经网络库等,都是用 Python 实现的;
  • 微软的 CNTK(认知工具包)也完全支持 Python,并且该公司开发的 VS Code,也已经把 Python 作为第一级语言进行支持;
  • Python 擅长进行科学计算和数据分析,支持各种数学运算,可以绘制出更高质量的 2D 和 3D 图像。

VS Code 是微软推出的一款代码编辑工具(IDE),有关它的下载、安装和使用,后续章节会做详细介绍。

总之,AI 时代的来临,使得 Python 脱颖而出,Python 作为 AI 时代头牌语言的位置,基本无人可撼动!

4、网路爬虫

Python 语言很早就用来编写网络爬虫。Google 等搜索引擎公司大量地使用 Python 语言编写网络爬虫。

从技术层面上将,Python 提供有很多服务于编写网络爬虫的工具,例如 urllib、Selenium 和 BeautifulSoup 等,还提供了一个网络爬虫框架 Scrapy。

5、科学计算

自 1997 年,NASA 就大量使用 Python 进行各种复杂的科学运算。

并且,和其它解释型语言(如 Shell、JS、PHP)相比,Python 在数据分析、可视化方面有相当完善和优秀的库,例如 NumPy、SciPy、Matplotlib、pandas 等,这可以满足 Python 程序员编写科学计算程序的需求。

6、游戏开发

很多游戏使用 C++ 编写图形显示等高性能模块,而使用 Python 或 Lua 编写游戏的逻辑。与 Python 相比,Lua 的功能更简单,体积更小;而 Python 则支持更多的特性和数据类型。

比如说,较为出名的游戏 Sid Meier's Civilization(文明,如图 3 所示)和 EVE(星战前夜)就是使用 Python 开发的。

(一)Python编程基础_第6张图片

图3:用 Python 做游戏开发

除此之外,Python 可以直接调用 Open GL 实现 3D 绘制,这是高性能游戏引擎的技术基础。事实上,有很多 Python 语言实现的游戏引擎,例如 Pygame、Pyglet 以及 Cocos 2d 等。

以上也仅是介绍了 Python 应用领域的“冰山一角”,其实,我们还可以用 PIL 和其他的一些工具进行图像处理;用 PyRo 工具包进行机器人控制编程等等。有兴趣的读者,可自行搜索资料进行详细了解。

七、怎样学习Python才能成为高手?

在学习过程中,很多小伙伴经常抱怨,计算机编程语言种类太多,根本学不过来。比如说,你能够熟练的使用 Java,但公司最近的项目却要用 Python,你就感到不知所措,压力山大。

再举个例子,Facebook 的主流语言是 Hack(PHP 的进化版本),但对于刚刚入职的工程师而言,100 个里至少有 95 个之前根本没有用过 Hack。不过,这些人上手都特别快,基本上只需要 1~2 周,日常编程就变得毫无压力。

那么,他们是怎么做到的呢?

1、编程语言都是相通的

首先,如果你具有一定的编程基础,接触一门新的编程语言时会发现,不同的编程语言之间其实是相通的,因为编程语言本就是人类控制计算机的一系列指令,即便是不同的编程语言,它们在语法规则方面也大同小异。

因此,在原有编程基础上再学习一门新的编程语言,并没有那么难。

在学习过程中,首先要做到的就是明确区别。例如,学习 Python 的条件和循环语句时,可以比对 C 语言或者 C++ 语言的语法是怎样的;学习 Python 中的字符串相加时,可以对比 Java 语言中字符串相加的语法。

除了能够明确区分各种编程语言的不同点,还要能将它们联系起来灵活运用。

比如说,Python 语言最大特点是擅长科学计算,因此它广泛应用于数据分析、人工智能(AI)等领域,但是涉及到底层的矩阵运算等操作时,就需要依赖 C++ 语言,因为它的运行速度更快,效率也更高。

在实际开发中要根据不同的需求选择不同的编程语言进行开发,对于要求执行效率的场景,可以选择 C/C++,对于要求开发效率、快速交付的场景,可选择 Java、Python 等。

2、Python对初学者很友好

如果 Python 是你接触的第一门编程语言,那也不必担心。我们知道,编程语言都可以实现人机交互,但相比来说,Python 比 C/C++、Java 等语言更简洁,也更接近英语,对初学者非常友好,这也是 Python 语言的一个显著特点。

对于初学者来说,要做的就是专注于 Python 这一门语言,明确学习的重点,把握好学习节奏,由浅入深循序渐进地学习。根据本人多年的学习工作经验,把编程语言的学习分为以下 3 步,无论你是否有编程基础,都可以对照着来做。

(1)多实践,积累代码量

任何一门编程语言,其囊括的知识面都是非常广泛的,从基本的变量赋值、条件循环、到文件操作、并发编程等,千万不要等到把所有知识点都学完了才开始练习,因为到那时你会发现,前面好不容易记住的知识都忘记了。

学习编程,是十分讲究实战的,没有捷径可走,越早练习,练得越多越勤,学习效果就越好。

(2)时刻注意代码规范

学习编程语言,在追求快和高效的同时,每一种编程语言都有必要的编码规范,一定不能忽略。

要想成为一名优秀的程序员,从起步阶段就要刻意地去培养自己的编程规范。例如,在刚开始编写代码时,不要将原本多行的代码全部写到一行,也不要随便用 a、b、c 等字母作为变量的名称。

(3)开发经验是必不可少的

要想真正熟练地掌握 Python(或者其它编程语言),拥有大中型产品的开发经验是必不可少的,它会让你站得更高,望得更远。

例如,我们几乎每天都会用搜索引擎,但你了解一个搜索引擎的服务器端实现吗?这是一个典型的面向对象设计,需要定义一系列相关的类和函数,还要从产品需求、代码复杂度、效率以及可读性等多个方面综合考量,同时在上线后还要进行各种优化等。

本教程也许无法让你完成一个上亿用户级产品的实践,但设置有一些小项目,可以帮你掌握必要的开发知识。最后,我们为你准备了 Python 学习的知识图谱,涵盖了 Python 核心知识,其中的大部分内容本教程都会做详细讲解。

(一)Python编程基础_第7张图片

图1:Python知识体系框架

八、Python版本区别,Python 3和Python 2区别详解

Python 版本分为两大流派,一个是 Python 2.x 版本,另外一个是 Python 3.x 版本,Python 官方同时提供了对这两个版本的支持和维护。

2020 年 1 月 1 日,Python 官方终止了对 Python 2.7 版本(最后一个 Python 2.x 版本) 的支持,这意味着开发者不会在接收到任何来自 Python 2.7 的错误修复或安全更新。自此 Python 2 完全退休,Python 3 时代正式来临。

尽管 Python 2 已退出历史舞台 ,但国内外一些互联网公司仍在使用 Python 2.7 开发程序,同时为了让大家更好地了解 Python 3 ,我们非常有必要知道这两个版本间存在区别。

你也许会问,为什么终止支持了,还会有公司再使用?其实,版本的更换是一项庞大、复杂的工作,一些小型的互联网公司在人力、财力不足的情况下,只能要继续使用低版本的 Python,只有万不得已时才会更新版本。

和 Python 2.x 版本相比,Python 3.x 版本在语句输出、编码、运算和异常等方面做出了一些调整,本节就对这些调整逐一地做简单介绍。

注意:本节适合有 Python 基础的学员阅读,初学者可先跳过本节,建议整体学完 Python 后,再回过头来阅读本文。

1、Python 3.x print()函数代替了print语句

在 Python 2.x 中,输出数据使用的是 print 语句:

>>> print "3,4"
3,4
或者
>>> print(3,4)
(3,4)

但是在 Python 3.x 中,print 语句没有了,取而代之的是 print() 函数,例如:

>>> print(3,4)
3 4

如果还像 Python 2.x 中那样使用 print 语句,Python 编译器就会报错,例如:

>>> print "3,4"
  File "", line 1
    print "3,4"
              ^
SyntaxError: Missing parentheses in call to 'print'

2、Python 3.x 默认使用 UTF-8 编码

Python 2.x 默认采用的 ASCII 编码,而 Python 3.x 默认使用 UTF-8 编码,相比来说,UTF-8 编码可以很好地支持中文或其它非英文字符。

例如,输出一句中文,使用 Python 2.x 和 Python 3.x 的区别如下:

#Python 2.x
>>>str ="C语言中文网"
>>>str
'C\xe8\xaf\xad\xe8\xa8\x80\xe4\xb8\xad\xe6\x96\x87\xe7\xbd\x91'

#Python 3.x
>>>str ="C语言中文网"
>>>str
'C语言中文网'

不仅如此,在 Python 3.x 中,下面的代码也是合法的:

>>>中国="China"
>>>print(中国)
China

3、Python 3.x 除法运算

和其他语言相比,Python 的除法运算要高端很多,它的除法运算包含 2 个运算符,分别是 / 和 //,这 2 个运算符在 Python 2.x 和 Python 3.x 的使用方法如下:

(1) / 运算符

在 Python 2.x 中,使用运算符 / 进行除法运算的方式和 Java、C 语言类似,整数相除的结果仍是一个整数,浮点数除法会保留小数点部分,例如:

>>>1/2
0
>>>1.0/2
0.5

但是在 Python 3.x 中使用 / 运算符,整数之间做除法运算,结果也会是浮点数。例如:

>>>1/2
0.5

(2)运算符 //

使用运算符 // 进行的除法运算叫做 floor 除法(“地板除”),也就是输出不大于结果值的一个最大的整数(向下取整)。此运算符的用法在 Python 2.x 和Python 3.x 中是一样的,举个例子:

#Python 2.x
>>> -1//2
-1

#Python 3.x
>>> -1//2
-1

4、Python 3.x 异常

在 Python 3.x 版本中,异常处理改变的地方主要在以下几个方面:

  • 在 Python 2.x 版本中,所有类型的对象都是直接被抛出的,但是在 Python 3.x 版本中,只有继承 BaseException 的对象才可以被抛出。
  • 在 Python 2.x 版本中,捕获异常的语法是“except Exception,var:”;但在 Python 3.x 版本中,引入了 as 关键字,捕获异常的语法变更为 “except Exception as var:”。
  • 在 Python 3.x 版本中,处理异常用 “raise Exception(args)”代替了“raise Exception,args”。
  • Python 3.x 版本中,取消了异常类的序列行为和 .message 属性。

有关 Python 2.x 版本和 Python 3.x 版本处理异常的示例代码如下所示:

#Python 2.x
>>> try:
...  raise TypeError,"类型错误"
... except TypeError,err:
...  print err.message
...
类型错误

#Python 3.x
>>> try:
...     raise TypeError("类型错误")
... except TypeError as err:
...     print(err)
...
类型错误

5、Python 3.x 八进制字面量表示

在 Python 3.x 中,表示八进制字面量的方式只有一种,并且必须写成“0o1000”这样的方式,原来“01000”的方式不能使用了。举个例子:

#Python 2.x
>>> 0o1000
512
>>> 01000
512

#Python 3.x
>>> 01000
  File "", line 1
    01000
        ^
SyntaxError: invalid token
>>> 0o1000
512

6、Python 3.x 不等于运算符

Python 2.x 中的不等于运算符有 2 种写法,分别为 != 和 <>,但在 Python 3.x 中去掉了 <>,只有 != 这一种写法,例如:

#Python 2.x
>>> 1!=2
True
>>> 1<>2
True

#Python 3.x
>>> 1!=2
True
>>> 1<>2
  File "", line 1
    1<>2
      ^
SyntaxError: invalid syntax

7、Python 3.x 输入差异

Python 2.x 中提供两种类型输入函数,分别是 input() 和 raw_input(),前者默认返回的 int(整数类型) 类型,而后者总是返回 str(字符串类型);Python 3.x 中只提供了一个输入函数 input(),该函数的使用方法与 raw_input() 相似,总是返回 str  类型。示例如下:

Python 2.x
a=input("请输出:")
请输出:123
>>> type(a)

b=input("请输入")
请输出:"C语言中文网"
>>> type(b)


c=raw_input("请输入:")
请输入:123
>>>type(c)



# Python3.x
>>> d=input("请输入:")
请输入:123
>>> d
'123'
>>> type(d)

8、Python 3.x 数据类型

Python 3.x 中对数据类型也做了改动,比如说:

  • Python 3.x 去除了 long 类型,现在只有一种整形 int,但它的行为就像是 Python 2.x 版本中的 long。
  • Python 3.x 新增了 bytes 类型,对应 Python 2.x 版本的八位串,定义 bytes 字面量的方法如下所示:
    >>>b=b'China'
    >>>type(b)
    
    字符串对象和 bytes 对象可以使用 .encode() 或者 .decode()方法相互转化,例如:
    >>>s=b.decode()
    >>>s
    'China'
    >>>b1=s.encode()
    >>>b1
    b'China'
  • Python 3.x 中,字典的 keys()、items() 和 values() 方法用返回迭代器,且之前的 iterkeys() 等函数都被废弃,同时去掉的还有 dict.has_key(),改为用 in 替代。

本节所介绍的只是 Python 3.x 的一部分改动,由于篇幅有限,这里不再具体指出,教程中涉及到时再给大家详细介绍。

九、Python 2.x和Python 3.x,初学者应如何选择?

Python 自发布以来,主要有 3 个版本,分别是:

  1. 1994 年发布的 Python 1.0 版本(已过时);
  2. 2000 年发布的 Python 2.0 版本,2020 年 4 月份,2.x 系列最终版本 2.7.18 发布;
  3. 2008 年发布的 Python 3.0 版本,截止到 2022 年 7 月份,已经更新到 3.10.5;

在 3 个版本中,Python 3.0 是一次重大的升级,为了避免引入历史包袱,Python 3.0 没有考虑与 Python 2.x 的兼容,这也就导致很长时间以来,Python 2.x 的用户不愿意升级到 Python 3.0。

除此之外,造成目前这种状况的另一个原因是,将现有应用从 Python 2.x 迁移到 Python 3.x 是一项不小的挑战。

(一)Python编程基础_第8张图片

图1:Python 2 和 Python 3

虽然有 2to3(后续会介绍)之类的工具可以进行代码的自动转换,但无法保证转换后的代码 100% 正确。而且,如果不做人工修改的话,转换后的代码性能可能还不如转换前。因此,将现有的复杂代码库迁移到 Python 3.x 上可能需要付出巨大的精力和成本,一些公司无法负担。

Python 官方对 150 多个国家/地区的 2.4 万名开发者进行调研,经统计显示,截止到 2019 年 11月,使用 Python 3.x 的开发者已经超过 90%,仅有不到 10% 的开发者仍然再使用 Python 2.x。由此可见,使用 Python 3.x 的用户已经占据即绝大多数。

那么,初学者应该选择什么版本来学习呢?本教程建议大家选择 Python 3.x 版本,理由有以下几点:

  • 使用 Python 3.x 已是大势所趋。
    目前,只有少部分公司仍在使用 Python 2.x,绝大多数公司都已转向 Python 3.x。另外 Python 2.x 已于 2020 年 1 月 1 日终止更新,Python 2.7.18 将作为 Python 2.x 系列的最后一个版本。在未来一些框架或库(如 Django、Flask 和 NumPy)会逐渐放弃对 2.x 的支持,仅支持 Python 3.x。因此,从长远来看,学习 Python 3.x 是一个非常明智的选择。
  • Python 3.x在 Python 2.x 的基础上做了功能升级。
    Python 3.x 对 Python 2.x 的标准库进行了一定程序的重新拆分和整合,比 Python 2.x 更容易理解,特别是在字符编码方面。Python 2.x 中对于中文字符串的支持性能不够好,需要编写单独的代码对中文进行处理,否则不能正确显示中文,而 Python 3.x 已经将该问题成功解决了。
  • Python 3.x 和 Python 2.x 思想基本是共通的。
    Python 3.x 和 Python 2.x 思想基本上是共通的,只有少量的语法差别,学会的 Python 3.x,只要稍微花点时间学习 Python 2.x 的语法,即可灵活运用这两个不同版本了。
     

当然,选择 Python 3.x 也不是没有弊端,很多 Python 第三方库的发行总是会滞后于 Python 的最新发行版本,甚至目前还有很多不支持 Python 3.x。比如深度学习框架 TensorFlow 仅支持 Python 3.6 版本,无法支持其他版本,再比如 PIL 图像处理库,只对 Python 2.x 提供了支持。

注意,本教程以 Python 3.x 来介绍 Python 语言,因此,为了小伙伴们能够更好的学习本教程,强烈建议您选择 Python 3.x。

因此,在选择 Python 时,一定要先考虑清楚自己的学习目的,比如说,打算做哪方面的开发,此方向需要用法哪些扩展库,以及这些扩展库支持的最高 Python 版本等,明确这些问题后,再选择适合自己的版本。

关于 Python 3.x 和 Python 2.x 具体的区别,可阅读《Python 3 和 Python 2 区别》一节。

十、Python 2to3:自动将Python 2.x代码转换成Python3.x代码

Python 3 和 Python 2 不兼容,导致大多数 Python 2.x 程序都无法在 Python 3.x 环境中运行。

针对上述问题,Python 官方提供了一个将 Python 2.x 代码自动转换为 Python 3.x 代码的小工具,起名为『2to3』,可以将绝大部分的 Python 2.x 代码自动转换成 Python 3.x 代码。

在 Windows 环境中,2to3 工具位于 Python 的安装包内,是一个后缀名为 .py 的源程序文件;在 Linux 环境中,2to3 工具通常需要单独安装。

下面是一段 Python 2.x 版本的代码(保存在 demo.py 中),该程序代码无法直接在 Python 3.x 环境中运行。

def my_strcmp(str1,str2):
    if str1 <> str2:
        print "str1 ≠ str2"
    else:
        print "str1 == str2"
str1 = "C语言中文网"
str2 = "http://c.biancheng.net/python/"
my_strcmp(str1,str2)

就以这段代码为例,教大家借助 2to3 工具在 Windows 和 Linux 环境中将 Python2.x 代码转换为 Python3.x 代码。

1、Windows环境下的转换

  1. 首先,要安装好 Python 环境,安装过程可以参考《Windows安装Python》一文。
  2. 在 Python 安装路径下的“Tools\scripts”文件夹里,可以找到 2to3.py 文件。例如,我的电脑上安装的是 Python 3.6.x 版本,它被安装到“G:\Python\Python36”文件夹中,那么 2to3.py 文件就保存在 “G:\Python\Python36\Tools\scripts ”文件夹内,如图 1 所示:

    (一)Python编程基础_第9张图片

    图 1 Python 2.x 转 Python 3.x 的工具

  3. 将 2to3.py 文件复制到 Python 2.x 程序所在的文件夹里。
  4. win+R组合键打开“运行”窗口,输入cmd后回车打开命令行窗口,将当前位置跳转到 Python 2.x 程序所在的文件夹。例如,程序保存在“E:\change\demo.py”文件中,命令行窗口中依次输入以下指令:
    C:\users\Demo>E:
    E:\>cd change
    E:\change>
  5. 执行如下指令,就可以将 demo.py 文件中的 Python 2.x 代码转换为符合 Python 3.x 语法要求的代码。
    Python 2to3.py -w demo.py
    执行完后,“E:\change” 文件夹中会生成一个 demo.py 文件的备份文件,名称为 demo.py.bak,里边存储的是 Python 2.x 版本的程序。同时,原 demo.py 文件的代码就转换成了符合 Python 3.x 语法要求的代码:
    def my_strcmp(str1,str2):
    if str1 != str2:
    print("str1 != str2")
    else:
    print("str1 == str2")
    str1 = "C语言中文网"
    str2 = "http://c.biancheng.net/python/"
    my_strcmp(str1,str2)

注意,在使用 2to3.py 转换 python 2.x 代码前,尽量不要把要转换的代码保存在 C 盘中,因为如果这样做,可能会因权限问题导致转换不能正常完成。

2、Linux环境下的转换

Linux 环境中,2to3 工具通常不位于 Python 安装包里,通常需要单独安装。

安装方法也很简单,以 Ubuntu 系统为例,打开命令行窗口(Terminal),执行sudo apt install 2to3安装命令即可:

$ sudo apt install 2to3
Reading package lists... Done
Building dependency tree      
Reading state information... Done
......

执行完成后,2to3 工具就安装成功了,大家可以执行2to3 -h命令验证是否安装成功。

在命令行终端输入2to3 -h命令:

$ 2to3 -h
Usage: 2to3 [options] file|dir ...

Options:
  -h, --help            show this help message and exit
  -d, --doctests_only   Fix up doctests only
  -f FIX, --fix=FIX     Each FIX specifies a transformation; default: all
  -j PROCESSES, --processes=PROCESSES
                        Run 2to3 concurrently
  -x NOFIX, --nofix=NOFIX
                        Prevent a transformation from being run
  ......

出现以上信息,证明当前环境已成功安装了 2to3 工具。

下面,假设 Python 2.x 代码存储在 /home/cyuyan/demo.py 文件中,依次执行如下命令:

$ cd /home/cyuyan/
$ 2to3 -w demo.py

执行完成后,在 /home/cyuyan/ 目录下也会生成一个名为 demo.py.bak 的备份文件,demo.py 文件中就变成了符合 Python 3.x 语法要求的程序。

十一、学习小妙招,及时掌握Python更新动态

截至到 2022 年 1 月份,Python 已经更新至 3.10.x 版本,每一次的迭代,Python 都会融入一些新元素,包括新的语法格式以及功能实用的新模块。然而,很多人对 Python 的认知还停留在 3.5 甚至更老的版本。

无论是刚刚接触 Python 的初学者,还是已经参加工作的 Python 程序员,及时了解 Python 发展的最新动态,掌握最新的 Python 知识,是非常有必要的。每个程序员都必须不断给自己充电,跟上行业发展的步伐,不让自己落伍。

掌握 Python 新版本的新特性,很多人都后知后觉,等新版本发布后才开始关注。接下来给大家分享一个小妙招,可以提前掌握新版本的新特性,还可以更深入地了解 Python。

1、PEP是什么

PEP 全称“Python Enhancement Proposal”,意思是“Python 增强提案”或者“Python 改进建议书”。

Python 是开源的,每一个志同道合的人都可以提出对 Python 的改进建议,包括新语法、新模块、Bug、编码规范、设计缺陷、发展方向等,只要和 Python 相关的都可以。

对于各种有建设性的提案,Python 社区会在官网上将它们公布出来,并给它们编好号,比如说:

  • 关于 PEP 的书写格式、提交方式、审核机制等,都在 PEP1 中有详细的说明;
  • 关于 Python 程序的书写风格,在 PEP8 中有详细的说明;
  • 体现 Python 设计理念的 "Python之禅",记录在 PEP20 中。

截至到目前,Python 官方已经公布了近 800 份 PEP,所有的 PEP 都记录在 PEP0 中,包括各个 PEP 的编号、审核状态、作者、具体内容等,我们可以根据编号,审核状态、提案类型来查看它们。

读PEP的好处

对于 Python 初学者而言,读 PEP 最大的好处就是可以实时了解 Python 的新特性。更重要得是,您不仅可以掌握新特性的语法,还能了解它背后的很多故事,比如为 Python 添加新特性的原因、新特性的设计原理、新特性的具体应用等等。

几乎所有 Python 教程的立足点,都是让读者快速地学会编写 Python 程序,所以这些教程只会一味地罗列 Python 语法,然后让读者死记硬背。而通过阅读 PEP,我们可以找到以下这些问题的答案:

  • 设计 A 功能的初衷是什么?
  • Python 官方为什么删除了 B 功能?
  • C 功能是怎样被设计出来的?

总之,随着阅读 PEP 数量的增加,你对 Python 的理解会越深入,编程思维会得到升华,编程水平也会提升。

此外对于有一定基础的读者,还可以参与热门话题的讨论,甚至提交新的 PEP,为 Python 社区贡献力量。

最后,给大家推荐一些 PEP 提案,阅读它们之后,相信你会喜欢上 PEP。

表 1 PEP 提案推荐

PEP 编号 说 明
PEP 8 Python 编程规范
PEP 285 Python 添加 bool 类型
PEP 202 列表推导式引入 Python
PEP 234 迭代器引入 Python
PEP 3105 从 Python 3.0 版本开始,用 print() 函数代替 print 语句
 

十二、Python解释器这么多,初学者该如何选择?

Python 是一门解释型语言,Python 代码要想运行,必须借助 Python 解释器。

本质上,Python 解释器就是一个程序,如果我们想执行 Python 代码,必须先运行 Python 解释器,由它读取我们写好的代码,再转换(翻译)成计算机能识别的机器指令。

Python 解释器是开源的,任何志同道合的组织或个人都可以根据自己需求修改它,做出自己的解释器。本套 Python 教程使用的是官方推荐的用 C 语言实现的 Python 解释器,又称 CPython。您可以在 Python 官方网站(Welcome to Python.org)免费下载它。

CPython 的使用范围是最广的,平时我们讨论的 Python 解释器指的就是 CPython,如果你刚刚接触 Python,我也建议你使用 CPython。

当然除了 CPython 外,还有很多款 Python 解释器,它们分别采用不同的编程语言实现,可以运行在不同的平台上,比如用 Java 语言实现的 Python(称为 Jython),用 .net 实现的 Python(称为 IronPython)等等。

相比于官方解释器 CPython 来说,这些解释器诞生较晚,它们旨在不同的生产环境中推广使用 Python。虽然有些解释器只是玩具项目或实验,但大部分是为了解决某些实际问题而创建的,这些问题要么使用 CPython 无法解决,要么需要耗费程序员巨大的精力,比如说:

  • 在嵌入式系统上运行 Python 代码;
  • 与运行框架(如 Java 或 .NET)或其他语言做代码集成;
  • 在 Web 浏览器上运行 Python 代码。


接下来,我就给大家介绍几种最常用的 Python 解释器以及它们各自的特点。

1、CPython

CPython 中的 "C" 指的就是 C 语言,意味着 CPython 解释器是完全用 C 语言编写实现的。

当我们从 Python 官网上下载并安装好 Python 3.x 后,除了会获得 CPython 解释器,还会获得 Python 程序运行所依赖的标准库模块。注意,CPython 解释器是用纯 C 语言编写的,但很多标准库模块是用纯 Python 语句编写的,还有一些是 C 和 Python 组合编写的。

CPython 是使用最广泛的一款 Python 解释器,关于 CPython 的下载和安装,我们会在第二章给大家做详细讲解。

2、Jython

Jython 是一款运行在 Java 平台上的 Python 解释器,可以将 Python 代码转换为 Java 字节码,让开发人员在 Python 模块中可以无缝衔接地使用 Java 类。

Jython 和 CPython 的主要区别有:

  • 采用 Java 垃圾回收机制,而不是引用计数。
  • 没有全局解释器锁(GlobakInterpreter Lock,GIL),在多线程应用中可以充分利用多个内核。

Jython 的主要缺点是缺少对 CPython 扩展 API 的支持,因此用 C 语言编写的 Python 扩展在 Jython 中无法运行。这种情况未来可能会发生改变,因为 Jython 3.x 计划支持 CPython 扩展 API。

(一)Python编程基础_第10张图片

图2:Jython 解释器


Jython 允许人们在复杂应用系统(比如 J2EE)中使用 Python 作为顶层脚本语言,它还将 Java 应用引入到 Python 中,比如说在 Python 程序中可以使用 Apache Jackrabbit(这是一个基于 JCR 的内容仓库 API)。

Jython 最新可用的版本是 Jython 2.7,对应的是 Python 2.7 版,几乎实现了 Python 所有的核心标准库,Jython 3.x 版正在开发中。

3、IronPython

IronPython 是运行在 .Net 平台上的一款 Python 解释器,可以直接将 Python 代码转换为 .Net 的字节码。

IronPython 是将 Python 引入到 .NET 框架中,这个项目受到了微软的大力支持,因为 IronPython 的主要开发人员都在微软工作。

ironPython

图3:IronPython 解释器

同时,微软还提供了一套免费的开发工具,名为 PTVS(Python Tools for Visual Studio,用于Visual Studio 的 Python 工具),可以将 Visual Studio 转换为成熟的 Python IDE,是作为 Visual Studio 的插件发布的,在 GitHub 可以找到其开源代码。

除了 Java,.NET社区是最大的开发者社区之一。毫不夸张地说,IronPython 为推广 Python 语言做出了非常重要的贡献。

虽然 .NET 主要在微软 Windows 系统上运行,但是 IronPython 也可以在 Mac OS X 和 Linux 系统上运行,这一点要感谢 Mono,这是一个跨平台的开源 .NET 实现。

与 CPython 相比,IronPython 的主要区别或优点如下:

  • 与 Jython 类似,没有全局解释器锁(Global Interpreter Lock,GIL),在多线程应用中可以充分利用多个内核。
  • 用 C# 和其他 .NET 语言编写的代码可以轻松集成到 IronPython 中,反之亦然。
  • 通过微软 Silverlight 插件,在所有主流 Web 浏览器中都可以运行。

IronPython 的缺点和 Jython 非常类似,也不支持 C/Python 扩展 API。对于想要使用基于 C 扩展的 Python 包(如 NumPy)的开发人员来说,这一点很重要。

IronPython 最新的稳定版本是 2.7.12,能够与 Python 2.7 很好的兼容。2022 年 4 月末,IronPython 3.4 发布,实现了 Python 2 到 Python 3 版本的重大跨越。

4、PyPy

PyPy 是一款用 Python 编写的 Python 解释器,最大的特点就是执行 Python 代码的速度快。

pypy解释器

图4:PyPy 解释器

PyPy 采用了 JIT(Just-in-Time)技术,可以对 Python 代码进行动态编译,显著提高 Python 代码的执行效率,但在以下两种场景,JIT 技术的优势也很难得到展现:

  • 如果整个程序运行只有几秒钟,JIT 技术的加速效率不会很明显;
  • 如果大部分的运行时间都花费在执行标准库中的 C 语言代码上,而不是执行 Python 代码,JIT 技术也无济于事。

尤其在长时间执行 Python 代码的场景中,PyPy 执行速度快的特点会体现得淋漓尽致

PyPy 和 CPython 的主要区别有以下几个方面:

  • 使用垃圾回收,而不是引用计数。
  • 采用了 JIT 技术,可以显著提高性能。
  • 借鉴了 Stackless Python 在应用层的“无栈”特性。

和其它的 Python 解释器类似,PyPy 也缺乏对 C/Python 扩展 API 的完全官方支持。但它至少通过 CPyExt 子系统为 C 扩展提供了某种程度的支持,虽然文档不完整,功能也尚未完善。此外,社区正在努力将 NumPy 迁移到 PyPy 中。

目前,PyPy 兼容了 Python2.7.18 和 Python 3.7.10,支持大多数常用的 Python 标准库模块。绝大部分 Python 代码都可以在 PyPy 下运行,但是 PyPy 和 CPython 的差异可能会导致 Python 代码在两种解释器下的执行结果不一样。

5、Stackless Python

Stackless Python 是 CPython 的增强版,对 CPython 做了一些修改,添加了一些新的功能。

Stackless Python 可以直译为“无栈的 Python”“无栈”指的是不再用 "堆栈" 的思想运行 Python 代码,而是用 tasklet(微线程)代替堆栈。和普通线程相比,操作系统上下文切换和任务调度微线程的开销更小,既轻量化又节约资源。

所谓堆栈思想,以 C 语言为例,程序执行时会将函数逐个入栈,函数执行完后依次出栈,函数进出栈遵循“后进先出”的原则

Stackless Python 算不上是有名的 Python 解释器,但它的实现思想对编程语言社区有很大的影响。Stackless Python 最新可用的版本是 2.7.9 和 3.3.5,分别实现的是 Python 2.7 和 3.4。

6、总结

Python 解释器有很多版本,但使用最广泛的还是 CPython,本教程讲解 Python 使用的也是 CPython。

作为初学者,大家直接用 Python 官方推荐的 CPython 即可,丝毫不用迟疑,至于其它版本的 Python 解释器,简单了解一下即可。

十三、Anaconda:Python科学计算的必备神器

随着 Pillow、Numpy、Matplotlib、Pandas 等众多成熟模块(库)的诞生,Python 越来越适合在科学计算领域(包括数据分析、机器学习、神经网络等)深耕,开发者可以直接使用这些现成的库,没必要重复造轮子。

想要在程序中使用第三方库,必须先手动安装它们,可以借助 pip 包管理器,具体用法我会在《Python第三方库(模块)下载和安装》一节给大家讲解。但有些情况下,用 pip 安装库并不是很方便,比如说,一次性安装多个库时,pip 只能一个一个地安装,需要编写各种各样的 pip 命令,费时费力。再比如,使用 pip 安装不同版本的库时(例如不同版本的 Pandas),还要考虑两者的兼容性问题,否则很容易造成混乱甚至错误。

尤其是 Python 初学者,应该将更多的精力花费在学习知识上,而不是在这些第三方库的安装、配置、管理上,这些“脏活累活”可以全部交给 Anaconda 来完成。

1、Anaconda是什么

Anaconda 原意是“水蟒”,蟒蛇的一种,和 Python(蟒蛇)的本意非常接近。

(一)Python编程基础_第11张图片

图 1 Anaconda Logo

一些人觉得,Anaconda 的 Logo 像一条“咬自己尾巴”的蟒蛇,请大家自行脑补。

简单地理解,Anaconda 就是一个“Python 科学计算全家桶”,它为我们打包好了科学计算领域可能用到的大部分 Python 工具,包括 Python 解释器、常用的第三方库、包管理器、IDE 等。

Anaconda 提供有 600 多个与科学计算相关的第三方库,安装 Anaconda 的过程中,会顺带安装一些常用的库,比如 Pillow、Numpy、Matplotlib 等。根据需要,你可以对这些库做更新或者卸载等操作。

Anaconda 使用的包管理器叫做 conda,它和 pip 的不同之处有:

  • conda 是一款跨平台、不限语言的包管理器,不仅仅能管理 Python 的第三方库,还能管理其它语言的库(比如 R 语言)。
  • pip 可以操作(安装、更新和卸载)几乎所有的 Python 库,而 conda 只能操作 Anaconda 里包含的 Python 库。

您可以像使用 pip 一样,通过在命令行窗口中编写命令操作 conda,但这种方式需要掌握一些常用的 conda 命令。为了降低学习成本,Anaconda 还提供了一个名为 Anaconda Navigator 的可视化界面,通过鼠标和键盘就可以操作 conda。

(一)Python编程基础_第12张图片

图 2 Anaconda Navigator 管理第三方库

Anaconda Navigator 还提供了一些好用的 Python IDE,比如 Jupyter Notebook、Spyder、PyCharm 等,大家可以根据自己的喜好“一键安装”。  

Anaconda 可以安装在多个平台上,包括 Windows、Linux 和 Mac OS X。Anaconda 官方分别提供了个人版、商业版、团队版和企业版这四种版本的 Anaconda,只有个人版是免费的。对于初学者而言,个人版完全够用,在 Anaconda 官网就可以找到对应平台的个人版安装包。

2、总结

Anaconda 是 Python 科学计算领域的辅助学习工具,非常适合初学者。

Python 的应用领域有很多,如果你想学习数据处理、数据建模、神经网络、机器学习等,下载 Anaconda 是非常不错的选择。如果你研究的是其它领域(比如Web 应用开发),那么 Anaconda 对你帮助可能不会很大。

你可能感兴趣的:(Python语言学习,python,开发语言)