Python是一种面向对象的、解释型的计算机高级程序设计语言,由Guido van Rossum于1989年开始开发,并于1991年发布第一个公开发布第一个公开发行版。Python是纯粹的开源自由软件,其源代码和解释器均遵循GPL(GUN General Public License)协议。Python具有语法简介、易于学习、功能强大、可扩展性强、跨平台等诸多特点,逐渐成为最受欢迎的程序设计语言之一。
本章重点
- Python的发展
- Python的特点
- Python 的运行方式
- Python 开发工具
1.1 认识Python
欢迎来到Python的世界。本节将从Python的发展、引用、特点和版本等内容开始,带领读者了解和认识Python。
1.1.1 Python的发展
1989年圣诞节,Guido在阿姆斯特丹开始准备开发一种新的程序设计语言。作为Monty Python喜剧团体的粉丝,Guido将这门新语言命名为Python。Python的灵感来自ABC语言------Guido参与开发的一种适用于非专业程序开发人员的教学语言。Python认为ABC语言有没、功能强大,ABC未获得成功主要是非开放造成的,所以,Guido一开始将Python主要目标之一定位在开放性。同时,Guido还想在Python中实现一些在ABC中闪现过但未曾实现的东西。可以说,Python起源于ABC,并收到了Modual-3语言的影响,同时结合了UNIX Shell和C语言的习惯。
经过多年的发展,Python已经成为最受欢迎的程序设计语言之一。2011年1月,TIOBE将Python评为编程语言排行榜2010年度语言。TIOBE网站地址为:http://www.tiobe.com/tiobe_index.图1-1显示截止2018年2月的TIOBE程序设计语言排行榜,Python在众多的程序设计语言中排在java、C、C++之后,处于第4位,其影响力可见一斑。
图1-1 TIOBE程序设计语言排行榜
详细了解Python的现状,请访问Python官方网站:http://Python.org
1.1.2 Python的应用案例
目前,不少公司 Python开开发自己的产品.例如:
- 世界上最大的视频分享网站YouTube的视频分享服务大部分采用Python实现。
- 首个P2P文件分享软件BitTorrent也采用Python实现。
- 大型多人在线游戏EVE Online广泛使用了Python。
- Autodesk旗下的著名三维建模和动画软件Maya,为Python提供了API(Application Programming Interface,应用程序编程接口)。
- Intel、Cisco、HP、Seagate、Qualcomm和IBM等公司使用Python进行硬件测试。
- Pixar、Industrial Light & Magic等电影公司使用Python制作动画电影。
- JPMorgan Chase、UBS、GETCO、Citadel等公司使用Python做市场预测。
- NASA、Los Alamos、Fermilab、JPL等使用Python执行科学计算。
- iRobot使用Python开发了机器人真空吸尘器。
- ESRI使用Python为终端定制GIS地图产品。
- NSA应用Python实现加密和智能分析。
- IronPort使用Python实现电子邮件服务器产品。
- Google、Yahoo、搜狐邮箱、知乎、果壳等也广泛使用了Python。
在Python官方网站的Python Success Stories(http://Python.org/about/success/)
1.1.3 Python的特点
1.Python是免费的开源自由软件
Python具有下列显著特点。
Python遵循GPL协议,也是免费的,不管是用于个人还是商业用途,开发人员都无须支付任何费用,也不勇担心版权问题。
作为开源软件,程序员可以获得Python源代码,以研究其内部细节,并可加以修改使其针对目标更加适用。也可以将Python嵌入系统或随产品一起发布,甚至于销售Python的源代码,都没有任何限制。
2 Python是面向对象的语言
面向对(Object Oriented,OO)是现代高级程序设计语言的一个重要特种。多态、运算符重载、继承和多重继承等面向对象编程(Object Oriented Programming OOP)的主要特征也在Python的类模式中得到很好的支持。得益于Python简洁的语法和数据类型系统,Python中的OOP也变得极为简单,比其他语言容易。
OOP是Python的一个重要特征,初学者不必为此感到担心。Python同样支持传统的面向过程的编程模式,完全可以在具有一定的基础之后在深入学习Python的OOP。
3 Python具有良好的跨平台特征
Python是用ANSI C实现的。C语言因为跨平台和良好的额一致性成为经典的程序设计语言。这意味着Python也具有良好的跨平台特性,可在目前所有的主流平台上编译和运行。所以,在Windows下编程的Python程序,可以轻松在Lunix等其他系统中运行。
因为Python是开源的,可以轻松将其移植到各种不同平台,包括Lunix、Windows、FreeBSD、BeOS和iOS等平台。
4 Python功能强大
Python既属于脚本语言,也属于高级程序语言,所以,Python具有脚本语言(如Perl、Tcl和Scheme等)的简单、易用特点,也具有高级程序语言(如C、C++和Java等)的强大功能
Python具有一些强大的功能如下:
动态数据类型:Python在代码运行过程中跟踪变量的数据类型,不需要在代码中声明变量的类型,也不要求在使用之前对变量进行类型的声明。
自动内存管理:良好的内存管理机制以为这程序运行具有更高的性能。Python程序员无须关心内存的使用和管理,Python自动分配和回收内存。
大型程序支持:通过子模块、类和异常等工具,允许Python应用大于程序开发。
内置数据结构:Python提供常用数据结构支持。例如,列表、字段、字符串等都属于Python内置对象。同时,Python也实现了各种数据结构的标准操作,如合并、分片、排序和映射等。
内置库:Python提供丰富的标准库,从正则表达式匹配到网络等,使Python可以实现多种应用。
第三方工具集成:Python很容易集成第三方工具,通过各种扩展包将其应用到各种不同领域
5.Python简单易学
Python的设计理念是“优雅”“明确”“简单”,提倡“用一种方法,最好只有一种方法来做一件事”,所以,Python语言语法简洁、代码易读。在国外一些知名大学,开始采用Python作为程序设计课程的编程语言。例如,卡耐基梅隆大学的编程基础、麻省理工学院的计算机科学及编程导论均使用Python语言讲授。
Python不强调数据类型,变量在使用之前无须定义其数据类型,同一个变量可存储不同类型的数据。
图1-2 Python开发人员的设计理念
1.1.4 Python的版本
Phthon发展到现在,经历了多个版本,如表 1-1所示。
表1-1 Python版本历史
版本号 | 年份 | 拥有者 | GPL兼容 |
0.9.0~1.2 | 1991-1995 | CWI | 是 |
1.3~1.5.2 | 1995-1999 | CNRI | 是 |
1.6 | 2000 | CNRI | 否 |
2.0 | 2000 | BeOpen.com | 否 |
1.6.1 | 2001 | CNRI | 否 |
2.1 | 2001 | PSF | 否 |
2.0.1 | 2001 | PSF | 是 |
2.1.1 | 2001 | PSF | 是 |
2.1.2 | 2002 | PSF | 是 |
2.1.3 | 2002 | PSF | 是 |
2.2~2.7 | 2001-2015 | PSF | 是 |
3.X | 2008至今 | PSF | 是 |
作为一个开源软件,Python拥有一个参与者众多的开发社区,它保持的不断更新和改进。Python的开发者通过一个在线的源代码控制系统协同工作,所有对Python的修改必须遵循PEP(Python Enhancement Proposals)协议,并通过Python扩展回归测试系统的测试。目前,由一个非正式的组织PSF(Python Software Foundation,Python软件基金)负责组织会议并处理Python的知识产权问题。
1.1.5 Python 3.x 与2.x的区别
1.Python 3.x默认使用UTF-8编码
Python 3.x 源代码中的字符默认使用UTF-8编码,可以很好地支持中文或其他非英文字符。例如,在Python 3.x 中可以使用汉字作为变量名。
>>>长度=100 >>>print(长度) 100 |
在Python2.x中不能使用汉字作为变量名,否则会出错。例如:
>>>速度=100 File”<stdin>”,line 1 速度=100 ^ SyntaxError:invalid syntax |
2. print()函数替代了print语句
在Python3.x 中,调用print()函数来输出数据。例如:
>>>x=100 >>>print(10,’abc’,x) 10 abc 100 |
在Python 2.x中则使用print语句。例如:
>>>x = 100 >>>print 10,’abc’,x 10 abc 100 >>>print(10,’abc’,x) (10,’abc’,100) |
3.完全面向对象
在Python2.x中的各种数据类型,在3.x中全面升级为类(class)。例如,在Python2.x中输出数据类型结果如下。
>>> int,float,str (<class 'int'>, <class 'float'>, <class 'str'>) |
4.用视图和迭代器替换了列表
下面的常用方法或函数在Python2.x中返回列表,在3.x中有很多变化。
- 3.x中,字典的keys()、items()和values()方法用返回视图代替了列表,不再支持2.x中的iterkeys()、iteritems()和itervalues()。
- 在3.x中,map()、filter()和zip()函数用返回迭代器替代了列表。
5.比较运算中的改变
- 比较运算的主要改变如下。
- 用!=替代了<>。
- 比较运算<=、<=、>=、和>在无法比较两个数据大小顺序时,会产生TypeError异常。
- 在Python2.x中,1<”、0>None、len<=len等运算符返回False,而在3.x中则成圣了TypeError异常。
- 在==和!=中,不兼容类型的数据视为不相等.
- 6. 整数类型的改变
- 整数类型的主要改变如下。
-
- 取消了long类型,整数类型只有int一种。不再支持用后缀l或L表示长整形。
- 在Python3.x中,/(除法)运算符返回浮点数(float类型)。2.x中两个整数的/运算符返回整数(截断了小数部分)。
- 整数不再限制大小,删除sys模块中的maxint(最大整数)常量。
- 不再支持以数字0开头的八进制常量(如012),二改成用前缀”Oo”表示(如Oo12)。
-
7 字符串改变
在Python2.x中,字符串中的字符默认为单字节(8位),字符串的类型可分为str和unicode两种。带前缀”u”或者”U”的字符串为unicode类型,其他的字符(包括带前缀”b” ”B” “r”或”R”的字符串)为str类型。所有的字符串在输出时会将包含的字符直接输出。
例如:
>>>print type(‘\\abc’),type(b’abc’),type(r’\\abc’),type(u’abc’) <type ‘str’><type ‘str’><type ‘str’><type ‘unicode’> >>>print ‘\\abc’,b’abc’,r’\\abc’,u’abc’ \abc abc \\abc abc |
在Python3.x中,字符默认为unicode字符,即双字节符。字符串的数据类型分为str和bytes两种。仍可使用字符串前缀”u”或者”U”,但会被忽略。
在Python3.x中,字符串前缀”b”或”B” 表示二进制字符串,其类型为bytes。例如:
>>> print(type('\\abc'),type(b'abc'),type(r'\\abc'),type(u'abc')) <class 'str'> <class 'bytes'> <class 'str'> <class 'str'> >>> print('\\abc',b'abc',r'\\abc',u'abc') \abc b'abc' \\abc abc |
8.取消了file数据类型
Python3.x 取消了2.x中的file数据类型。使用open()函数打开文件时,返回的是_io.TextIOWrapper类的实力对象。例如:
>>>f=open(‘d:/text.txt’,’w’) >>>type(f) <class ‘_io.TextIOWrapper’> >>>f=open(‘d:/test.txt’,’w’) >>>type(f) <type ‘file’> |
9. 异常处理
在Python3.x中,异常处理的改变主要如下。
- 所有异常都从BaseException继承,并删除了StandardError异常。
- 取消了异常类的序列行为和.message属性。
- 用raise Exception(args)代替raise Exception,args语法。
- 捕获异常的语法改变,引入了as关键字。
在Python2.x中,用下面的代码捕获和处理异常。
>>> try: … raise TypeError,’类型错误’ … except TypeError,err: … print err.message 类型错误 |
在Python3.x中,用下面的代码捕获和处理异常。
>>>try: … raise TypeError(‘类型错误’) … except TypeError as err: … print(err) … 类型错误 |
10.其他主要语法错误改变
其他主要的语法改变如下。
- 加入了关键字”as”和“with”。
- 增加了常量”True” “Flase” 和”None”。
- 加入nonlocal语句。使用nonlocal x 声明x为函数外部的变量。
- 删除了raw_input(),用input()代替。
- 去除元祖参数解包。不能像def(a,(b,c)):pass这样定义函数了。
- 增加了二进制字面量,如’0b110110110’。bin()函数可返回整数的二进制字符串。
- 扩展了可迭代解包。在Python3.x里,”a,b *x=seq”和”X,a=seq”都是合法的,只要求两点”x”是list。
- 对象和“seq”是可迭代的。
- 面向对象引入了抽象基类。
- 类的迭代器方法next()改名为_next_(),并增加内置函数next(),用以调用迭代器的_next_()方法。