CH01_初识Python
CH01_初识Python
本章目标
- 掌握python特性
- 掌握python的优缺点
- 掌握python的应用领域
- 掌握python 2.x和 3.x的区别
python
Python简介
Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。
Python 由 Guido van Rossum (吉多·范罗苏姆) 于
1989
年底发明,第一个公开发行版发行于1991
年。像 Perl 语言一样, Python 源代码同样遵循 GPL(GNU General Public License) 协议。
官方宣布,2020 年 1 月 1 日, 停止 Python 2 的更新。
Python 2.7 被确定为最后一个 Python 2.x 版本。
编程语言是什么
其实,程序指的就是一系列指令,用来告诉计算机做什么,而编写程序的关键在于,我们需要用计算机可以理解的语言来提供这些指令。
为了有效避开所有影响给计算机传递指令的因素,计算机科学家设计了一些符号,这些符号各有其含义,且之间无二义性,通常称它们为编程语言。编程语言中的每个结构,都有固定的使用格式(称为语法)以及精确的含义(称为语义)。换句话说,编程语言指定了成套的规则,用来编写计算机可以理解的指令。习惯上,我们将这一条条指令称为计算机代码,而用编程语言来编写算法的过程称为编码。
本教程要讲解的 Python 就是一种编程语言,除此之外,你肯定也听说过其他一些编程语言,如 C、C++、Java、Ruby 等。至今,计算机科学家已经开发了成百上千种编程语言,且随着时间演变,这些编程语言又产生了多个不同的版本。但无论是哪个编程语言,也无论有多少个版本,虽然它们在细节上可能有所不同,无疑它们都有着固定的、无二义性的语法和语义。
以上提到的编程语言,都是高级计算机语言,设计它们的目的是为了方便程序员理解和使用。但严格来说,计算机硬件只能理解一种非常低级的编程语言,称为机器语言
比如说,让计算机对 2 个数做求和操作,那么 CPU 可能要执行以下指令:
- 将位于内存空间位置在 2001 的数加载到 CPU 中;
- 再将位于内存空间位置在 2002 的数也加载到 CPU中;
- 在 CPU中,对这 2 个数做求和操作;
- 将结果存储在位置为 2003 的内存空间。
而使用 Python 这样的高级语言,对 2 个数求和可以很自然地用 c = a + b 表示,但由此带来的问题是,我们需要设计一种方法,将高级语言翻译成计算机可以执行的机器语言,有两种方法可以实现,分别是使用编译器和解释器。
编译型语言和解释型语言的区别
我们编写的源代码是人类语言,我们自己能够轻松理解;但是对于计算机硬件(CPU),源代码就是天书,根本无法执行,计算机只能识别某些特定的二进制指令,在程序真正运行之前必须将源代码转换成二进制指令。
所谓的二进制指令,也就是机器码,是 CPU 能够识别的硬件层面的“代码”,简陋的硬件(比如古老的单片机)只能使用几十个指令,强大的硬件(PC 和智能手机)能使用成百上千个指令。
然而,究竟在什么时候将源代码转换成二进制指令呢?不同的编程语言有不同的规定:
- 有的编程语言要求必须提前将所有源代码一次性转换成二进制指令,也就是生成一个可执行程序(Windows 下的 .exe),比如C语言、C++、Golang、Pascal(Delphi)、汇编等,这种编程语言称为编译型语言,使用的转换工具称为编译器。
- 有的编程语言可以一边执行一边转换,需要哪些源代码就转换哪些源代码,不会生成可执行程序,比如 Python、JavaScript、PHP、Shell、MATLAB 等,这种编程语言称为解释型语言,使用的转换工具称为解释器。
简单理解,编译器就是一个“翻译工具”,类似于将中文翻译成英文、将英文翻译成俄文。但是,翻译源代码是一个复杂的过程,大致包括词法分析、语法分析、语义分析、性能优化、生成可执行文件等五个步骤,期间涉及到复杂的算法和硬件架构。解释器与此类似,有兴趣的读者请参考《编译原理》一书,本文不再赘述。
python是什么
编程语言有“高低”之分,而高级语言又有很多种,比如 C++、Java、C#、PHP、JavaScript 等,Python 也是其中之一。从本节开始,我们将正式开始学习 Python 这门高级编程语言,但是在此之前,我们有必要先讨论一下“Python 是什么”。
Python 英文原意为“蟒蛇”,直到 1989 年荷兰人 Guido van Rossum (简称 Guido)发明了一种面向对象的解释型编程语言,并将其命名为 Python,才赋予了它表示一门编程语言的含义。
说道 Python,它的诞生是极具戏曲性的,据 Guido 的自述记载,Python 语言是他在圣诞节期间为了打发时间开发出来的,之所以会选择 Python 作为该编程语言的名字,是因为他是一个叫 Monty Python 戏剧团体的忠实粉丝。
Python 语言是在 ABC 教学语言的基础上发展来的;遗憾的是,ABC 语言虽然非常强大,但却没有普及应用,Guido 认为是它不开放导致的。
基于这个考虑,Guido 在开发 Python 时,不仅为其添加了很多 ABC 没有的功能,还为其设计了各种丰富而强大的库,利用这些 Python 库,程序员可以把使用其它语言制作的各种模块(尤其是C语言和 C++)很轻松地联结在一起,因此 Python 又常被称为“胶水”语言。
这里的库和模块,简单理解就是一个个的源文件,每个文件中都包含可实现各种功能的方法(也可称为函数)。从整体上看,Python 语言最大的特点就是简单,该特点主要体现在以下 2 个方面:
- Python 语言的语法非常简洁明了,即便是非软件专业的初学者,也很容易上手。
- 和其它编程语言相比,实现同一个功能,Python 语言的实现代码往往是最短的。
看似 Python 是“不经意间”开发出来的,但丝毫不比其它编程语言差。事实也是如此,自 1991 年 Python 第一个公开发行版问世后:
- 2004 年起 Python 的使用率呈线性增长,不断受到编程者的欢迎和喜爱;
- 2010 年,Python 荣膺 TIOBE 2010 年度语言桂冠;
- 2017 年,IEEE Spectrum 发布的 2017 年度编程语言排行榜中,Python 位居第 1 位。
直至现在(2019 年 12 月份),根据 TIOBE 排行榜的显示,Python 也居于第 3 位,且有继续提升的态势(如表 2 所示)。
显然,Python 已经将 C++ 语言甩在了后边,直逼 C 语言和 Java,而且未来有可能超越它们,成为编程语言排行榜冠军。 我们不妨再看一下 Python 历年来的市场份额变化曲线,Python 的未来大势可期。
python的优缺点
优点
- 语法简单
- 开源的
- 免费的
- 高级语言
- 解释型语言,能跨平台
- 面向对象的编程语言
- 功能强大(模块众多)
- 可作扩展性强
缺点
1.运行速度慢
- 运行速度慢是解释型语言的通病,Python 也不例外。
- Python 速度慢不仅仅是因为一边运行一边“翻译”源代码,还因为 Python 是高级语言,屏蔽了很多底层细节。这个代价也是很大的,Python 要多做很多工作,有些工作是很消耗资源的,比如管理内存。
- Python 的运行速度几乎是最慢的,不但远远慢于 C/C++,还慢于 Java。
- 其次是有些应用场景可以容忍速度慢,比如网站,用户打开一个网页的大部分时间是在等待网络请求,而不是等待服务器执行网页程序。服务器花 1ms 执行程序,和花 20ms 执行程序,对用户来说是毫无感觉的,因为网络连接时间往往需要 500ms 甚至 2000ms。
2.代码加密困难
- 不像编译型语言的源代码会被编译成可执行程序,Python 是直接运行源代码,因此对源代码加密比较困难。
- 开源是软件产业的大趋势,传统程序员需要转变观念。
python的应用领域
web应用开发
Python 经常被用于 Web 开发,尽管目前 PHP、JS 依然是 Web 开发的主流语言,但 Python 上升势头更猛劲。尤其随着 Python 的 Web 开发框架逐渐成熟(比如 Django、flask、TurboGears、web2py 等等),程序员可以更轻松地开发和管理复杂的 Web 程序。
例如,通过 mod_wsgi 模块,Apache 可以运行用 Python 编写的 Web 程序。Python 定义了 WSGI 标准应用接口来协调 HTTP 服务器与基于 Python 的 Web 程序之间的通信。
举个最直观的例子,全球最大的搜索引擎 Google,在其网络搜索系统中就广泛使用 Python 语言。另外,我们经常访问的集电影、读书、音乐于一体的豆瓣网(如图 1 所示),也是使用 Python 实现的。
不仅如此,全球最大的视频网站 Youtube 以及 Dropbox(一款网络文件同步工具)也都是用 Python 开发的。
自动化运维
很多操作系统中,Python 是标准的系统组件,大多数 Linux 发行版以及 NetBSD、OpenBSD 和 Mac OS X 都集成了 Python,可以在终端下直接运行 Python。
有一些 Linux 发行版的安装器使用 Python 语言编写,例如 Ubuntu 的 Ubiquity 安装器、Red Hat Linux 和 Fedora 的 Anaconda 安装器等等。
另外,Python 标准库中包含了多个可用来调用操作系统功能的库。例如,通过 pywin32 这个软件包,我们能访问 Windows 的 COM 服务以及其他 Windows API;使用 IronPython,我们能够直接调用 .Net Framework。
通常情况下,Python 编写的系统管理脚本,无论是可读性,还是性能、代码重用度以及扩展性方面,都优于普通的 shell 脚本。
办公人员日常处理数据表格时,就可以基于这些操作实现办公自动化,Word和Excel作为工作中最常用的软件,实现自动化可以节省很多时间。
人工智能领域
人工智能是项目非常火的一个研究方向,如果要评选当前最热、工资最高的 IT 职位,那么人工智能领域的工程师最有话语权。而 Python 在人工智能领域内的
机器学习
、神经网络
、深度学习
等方面,都是主流的编程语言。可以这么说,基于大数据分析和深度学习发展而来的人工智能,其本质上已经无法离开 Python 的支持了,原因至少有以下几点:
- 目前世界上优秀的人工智能学习框架,比如 Google 的
TransorFlow
(神经网络框架)、FaceBook 的PyTorch
(神经网络框架)以及开源社区的Karas
神经网络库等,都是用 Python 实现的;- 微软的 CNTK(认知工具包)也完全支持 Python,并且该公司开发的 VS Code,也已经把 Python 作为第一级语言进行支持。
- Python 擅长进行科学计算和数据分析,支持各种数学运算,可以绘制出更高质量的 2D 和 3D 图像。
python案例实现打开图片,自动获取人脸。
网络爬虫领域
Python 语言很早就用来编写网络爬虫。Google 等搜索引擎公司大量地使用 Python 语言编写网络爬虫。
从技术层面上将,Python 提供有很多服务于编写网络爬虫的工具,例如 urllib、Selenium 和 BeautifulSoup 等,还提供了一个网络爬虫框架 Scrapy。
使用 Python3 抓取图片之家网站信息,完成一个图片之家工具。该项目练习 Python3 基础及网络编程,以及 docopt,requests,prettytable 等库的使用。
科学计算领域
自 1997 年,NASA 就大量使用 Python 进行各种复杂的科学运算。
并且,和其它解释型语言(如 shell、js、PHP)相比,Python 在数据分析、可视化方面有相当完善和优秀的库,例如 NumPy、SciPy、Matplotlib、pandas 等,这可以满足 Python 程序员编写科学计算程序。
游戏开发领域
很多游戏使用 C++ 编写图形显示等高性能模块,而使用 Python 或 Lua 编写游戏的逻辑。和 Python 相比,Lua 的功能更简单,体积更小;而 Python 则支持更多的特性和数据类型。
比如说,国际上指明的游戏 Sid Meier’s Civilization(文明,如图 2 所示)就是使用 Python 实现的。
除此之外,Python 可以直接调用 Open GL 实现 3D 绘制,这是高性能游戏引擎的技术基础。事实上,有很多 Python 语言实现的游戏引擎,例如 Pygame、Pyglet 以及 Cocos 2d 等。
以上也仅是介绍了 Python 应用领域的“冰山一角”,例如,还可以利用 Pygame 进行游戏编程;用 PIL 和其他的一些工具进行图像处理;用 PyRo 工具包进行机器人控制编程,等等。有兴趣的读者,可自行搜索资料进行详细了解。
python实现超级玛丽游戏。
python 3和python 2 的区别
python 3.x print函数代替了 print 语句
在 Python2.x 中,输出数据使用的是 Print 语句,例如:
1
2
3
4
5 >>>> print "3,4"
3,4
>或者
>>>> print(3,4)
(3,4)但是在 Python 3.x 中,print 语句没有了,取而代之的是 print 函数,例如:
1
2 >>>> print(3,4)
3 4
python 3.x默认使用UTF-8编码
相比 Python 2.x 默认采用的 ASCII 编码,Python 3.x 默认使用 UTF-8 编码,可以很好地支持中文或其它非英文字符。
1
2
3
4
5
6
7
8
9 >#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 中,下面的代码也是合法的:
1
2
3 >>>>中国="China"
>>>print(中国)
>China
python 3.x除法运算
和其他语言相比,Python 的除法运算要高端很多,它的除法运算包含 2 个运算符,分别是 / 和 //,这 2 个运算符在 Python 2.x 和 Python 3.x 的使用方法如下:
/ 运算符:
在 Python 2.x 中,使用运算符 / 进行除法运算的方式和 Java、C 语言类似,整数相除的结果仍是一个整数,浮点数除法会保留小数点部分,例如:
1
2
3
4 >>>>1/2
0
>>>1.0/2
0.5但是在 Python 3.x 中使用 / 运算符,整数之间做除法运算,结果也会是浮点数。例如:
1
2 >>>>1/2
0.5//运算符 :
使用运算符 // 进行的除法运算叫做 floor 除法,也就是输出不大于结果值的一个最大的整数(向下取整)。此运算符的用法在 Python 2.x 和Python 3.x 中是一样的,举个例子:
1
2
3
4
5
6
7 >#Python 2.x
1//2 -
-1
#Python 3.x
1//2 -
-1
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 版本处理异常的示例代码如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 >#Python 2.x
try:
raise TypeError,"类型错误"
>... except TypeError,err:
print err.message
...
>类型错误
>#Python 3.x
try:
raise TypeError("类型错误")
except TypeError as err:
print(err)
...
>类型错误
python 3.x 八进制字面量表示
在 Python 3.x 中,表示八进制字面量的方式只有一种,并且必须写成“0o1000”这样的方式,原来“01000”的方式不能使用了。举个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 >#Python 2.x
0o1000
512
01000
512
#Python 3.x
01000
File "<stdin>", line 1
01000
^
SyntaxError: invalid token
0o1000
512
python 3.x 不等于运算符
Python 2.x 中的不等于运算符有 2 种写法,分别为 != 和 <>,但在 Python 3.x 中去掉了 <>,只有 != 这一种写法,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 >#Python 2.x
1!=2
True
1<>2
True
#Python 3.x
1!=2
True
1<>2
File "<stdin>", line 1
1<>2
^
SyntaxError: invalid syntax
python 3.x 数据类型
Python 3.x 中对数据类型也做了改动,比如说:
Python 3.x 去除了 long 类型,现在只有一种整形 int,但它的行为就像是 Python 2.x 版本中的 long。
Python 3.x 新增了 bytes 类型,对应 Python 2.x 版本的八位串,定义 bytes 字面量的方法如下所示:
1
2
3 >>>>>b=b'China'
>>>type(b)
<type 'bytes'>字符串对象和 bytes 对象可以使用 .encode() 或者 .decode()方法相互转化,例如:
1
2
3
4
5
6 >>>>>s=b.decode()
>>>s
'China'
>>>b1=s.encode()
>>>b1
b'China'Python 3.x 中,字典的 keys()、items() 和 values() 方法用返回迭代器,且之前的 iterkeys() 等函数都被废弃。同时去掉的还有 dict.has_key(),改为用 in 替代。
课后作业
1.略