1989年的圣诞节期间, 吉多·范罗苏姆为了在 阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为 ABC语言的一种继承。之所以选中Python作为程序的名字,是因为他是一个 蒙提·派森的飞行马戏团的爱好者。ABC是由吉多参加设计的一种教学语言。就吉多本人看来,ABC这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,吉多认为是非开放造成的。吉多决心在Python中避免这一错误,并取得了非常好的效果,完美结合了如 CC++Java等其他语言。 [1]
就这样,Python在吉多手中诞生了。实际上,第一个实现是在 Mac机上。可以说,Python是从ABC发展起来,主要受到了 Modula-3(另一种相当优美且强大的语言,为小型团体所设计的)的影响。并且结合了 Unix shell和C的习惯。
目前吉多仍然是Python的主要开发者,决定整个Python语言的发展方向。Python社区经常称呼他是 仁慈的独裁者
Python 2.0于2000年10月16日发布,增加了实现完整的 垃圾回收,并且支持 Unicode。同时,整个开发过程更加透明,社区对开发进度的影响逐渐扩大。Python 3.0于2008年12月3日发布,此版不完全兼容之前的Python源代码。不过,很多新特性后来也被移植到旧的Python 2.6/2.7版本。
Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。Python支持重载运算符,因此Python也支持泛型设计。相对于Lisp这种传统的函数式编程语言,Python对 函数式设计只提供了有限的支持。有两个标准库(functools, itertools)提供了 HaskellStandard ML中久经考验的函数式程序设计工具。
虽然Python可能被粗略地分类为“ 脚本语言”(script language),但实际上一些大规模软件开发计划例如 Zope、Mnet及 BitTorrentGoogle也广泛地使用它。Python的支持者较喜欢称它为一种高级动态编程语言,原因是“脚本语言”泛指仅作简单程序设计任务的语言,如shell script、 VBScript等只能处理简单任务的编程语言,并不能与Python相提并论。
Python本身被设计为可扩充的。并非所有的特性和功能都集成到语言核心。Python提供了丰富的API和工具,以便程序员能够轻松地使用 C语言C++Cython来编写扩充模块。Python编译器本身也可以被集成到其它需要脚本语言的程序内。因此, 很多人 [谁?]还把Python作为一种“ 胶水语言”(glue language)使用。使用Python将其他语言编写的程序进行集成和封装。在 Google内部的很多项目,例如Google Engine使用 C++编写性能要求极高的部分,然后用Python或 Java/ Go调用相应的模块。 [2]《Python 技术手册》的作者马特利(Alex Martelli)说:“这很难讲,不过,2004 年,Python 已在 Google 内部使用,Google 召募许多 Python 高手,但在这之前就已决定使用Python,他们的目的是 Python where we can, C++ where we must,在操控硬件的场合使用 C++,在快速开发时候使用 Python。” [3]

设计哲学与定位

Python的设计哲学是“优雅”、“明确”、“简单”。因此其对手Perl语言中“总是有多种方法来做同一件事”的理念在Python开发者中通 常是难以忍受的。Python开发者的哲学是“用一种方法,最好是只有一种方法来做一件事”。在设计Python语言时,如果面临多种选择,Python 开发者一般会拒绝花俏的语法,而选择明确的没有或者很少有歧义的语法。由于这种设计观念的差异,Python源代码通常被认为比Perl具备更好的可读 性,并且能够支撑大规模的软件开发。这些准则被称为 Python格言。在Python解释器内运行 import this可以获得完整的列表。
Python开发人员尽量避开不成熟或者不重要的优化。一些针对非重要部位的加快运行速度的补丁通常不会被合并到Python内。所以 很多人 [谁?]认为Python很慢。不过,根据 二八定律,大多数程序对速度要求不高。在某些对运行速度要求很高的情况,Python设计师倾向于使用 JIT技术,或者用使用C/C++语言改写这部分程序。 [来源请求]目前可用的JIT技术是 PyPy

应用范围

Web程序

Python经常被用于Web开发。比如,通过 mod_wsgi模块, Apache可以运行用Python编写的Web程序。Python定义了 WSGI标准应用接口来协调Http服务器与基于Python的Web程序之间的沟通。一些Web框架,如 DjangoTurboGearsweb2pyZopeflask等,可以让程序员轻松地开发和管理复杂的Web程序。
Python对于各种网络协定的支持很完善,因此经常被用于编写服务器软件、网络蠕虫。第三方库 Twisted支持异步联机编写程序和多数标准的网络协定(包含客户端和服务器),并且提供了多种工具,被广泛用于编写高性能的服务器软件。

操作系统

在很多作业系统里,Python是标准的系统组件。大多数Linux发布版以及NetBSD、OpenBSD和Mac OS X都集成了Python,可以在终端机下直接运行Python。有一些Linux发布版的安装器使用Python语言编写,比如Ubuntu的 Ubiquity安装器、Red Hat Linux和Fedora的Anaconda安装器。Gentoo Linux使用Python来编写它的Portage包管理系统。Python标准库包含了多个调用作业系统功能的库。通过pywin3这个第三方软件 包,Python能够访问Windows的COM服务及其它Windows API。使用IronPython,Python程序能够直接调用 .Net Framework。一般说来,Python编写的系统管理脚本在可读性、性能、源代码重用度、扩展性几方面都优于普通的shell脚本。

其他

NumPySciPyMatplotlib可以让Python程序员编写科学计算程序。 PyQtPySidewxPythonPyGTK是Python快速开发桌面应用程序的利器。
很多游戏使用C++编写图形显示等高性能模块,而使用Python或者 Lua编写游戏的逻辑、服务器。相较于Python, Lua的功能更简单、体积更小;而Python则支持更多的特性和数据类型。很多游戏,如 EVE Online 使用Python来处理游戏中繁多的逻辑。
YouTube、Google、Yahoo!、NASA都在内部大量地使用Python。 OLPC的作业系统Sugar项目的大多数软件都是使用Python编写。

Hello World

下面是一个在标准输设备上输出 Hello World的简单程序,这种程序通常作为开始学习编程语言时的第一个程序:
  • 适用于Python 3.0以上版本以及Python 2.6、Python 2.7
print("Hello, world!")
  • 适用于Python 2.6以下版本以及Python 2.6、Python 2.7
print "Hello, world!"
将这行程序码保存为myhello.py。然后在Linux终端机下输入 python myhello.py,或者在Windows命令编辑字符下输入 myhello.py运行。

单步运行

Python也可以单步直译运行。运行Python解释器进入交互式命令行的环境,你可以在提示符号>>>旁输入print("Hello, world!"),按Enter键输出结果:
  • 适用于Python 3.0以上版本以及Python 2.6、Python 2.7
>>> print("Hello, world!")
Hello, world!
  • 适用于Python 2.6以下版本以及Python 2.6、Python 2.7
>>> print "Hello, world!"
Hello, world!
注意,低于3.0版本的Python,"Hello, world!"周围不需要括号。Python 3.x与Python 2.x的print语法是不一样的。

语法

Python的设计目标之一是让代码具备高度的可阅读性。它设计时尽量使用其它语言经常使用的标点符号和英文单字,让代码看起来整洁美观。它不像其他的静态语言如C、Pascal那样需要书写 声明语句,也不像它们的语法那样经常有特殊情况。

缩进

Python 开发者有意让违反了 缩进规则的程序不能通过编译,以此来强制程序员养成良好的编程习惯。并且 Python 语言利用缩进表示语句块的开始和退出( Off-side规则),而非使用花括号或者某种 关键字。增加缩进表示语句块的开始,而减少缩进则表示语句块的退出。缩进成为了语法的一部分。例如 if 语句:
if age < 21:
    print("你不能買酒。")
    print("不過你能買口香糖。")
print("這句話處於if語句塊的外面。")
  • 注:上述例子为 Python 3.0 以上版本的代码。
根据 PEP 的规定,必须使用 4个空格来表示每级缩进。使用 Tab 字符和其它数目的空格虽然都可以编译通过,但不符合编码规范。支持 Tab 字符和其它数目的空格仅仅是为兼容很旧的的 Python 程序和某些有问题的编辑程序。

语句和控制流

  • if语句,当条件成立时运行语句块。经常与else, elif(相当于else if) 配合使用。
  • for语句,遍列列表、字符串、字典、集合等迭代器,依次处理迭代器中的每个元素。
  • while语句,当条件为真时,循环运行语句块。
  • try语句。与except,finally配合使用处理在程序运行中出现的异常情况。
  • class语句。用于定义类型。
  • def语句。用于定义函数和类型的方法。
  • pass语句。表示此行为空,不运行任何操作。
  • assert语句。用于程序调适阶段时测试运行条件是否满足。
  • with语句。Python2.6以后定义的语法,在一个场景中运行语句块。比如,运行语句块前加密,然后在语句块运行退出后解密。
  • yield语句。在迭代器函数内使用,用于返回一个元素。自从Python 2.5版本以后。这个语句变成一个运算符。
  • raise语句。制造一个错误。
  • import语句。导入一个模块或包。
  • from import语句。从包导入模块或从模块导入某个对象。
  • import as语句。将导入的对象赋值给一个变量。
  • in语句。判断一个对象是否在一个字符串/列表/元组里。

表达式

Python的表达式写法与C/C++类似。只是在某些写法有所差别。
  • 主要的算术运算符与C/C++类似。+, -, *, /, //, **, ~, %分别表示加法或者取正、减法或者取负、乘法、除法、整除、乘方、取补、取模。>>, <<表示右移和左移。&, |, ^表示二进制的AND, OR, XOR运算。>, <, ==, !=, <=, >=用于比较两个表达式的值,分别表示大于、小于、等于、不等于、小于等于、大于等于。在这些运算符里面,~, |, ^, &, <<, >>必须应用于整数。
  • Python使用and, or, not表示逻辑运算。
  • is, is not用于比较两个变量是否是同一个对象。in, not in用于判断一个对象是否属于另外一个对象。
  • Python支持“列表推导式”(list comprehension),比如计算0-9的平方和:
>>> sum(x * x for x in range(10))
285
  • Python使用lambda表示匿名函数。匿名函数体只能是表达式。比如:
>>> add=lambda x, y : x + y
>>> add(3,2)
5
  • Python使用y if cond else x表示条件表达式。意思是当cond为真时,表达式的值为y,否则表达式的值为x。相当于C++和Java里的cond?y:x
  • Python区分列表(list)和元组(tuple)两种类型。list的写法是[1,2,3],而tuple的写法是(1,2,3)。可以改变list中的元素,而不能改变tuple。在某些情况下,tuple的括号可以省略。tuple对于赋值语句有特殊的处理。因此,可以同时赋值给多个变量,比如:
>>> x, y=1, 2 #同时给x,y赋值,最终结果:x=1, y=2
特别地,可以使用以下这种形式来交换两个变量的值:
>>> x, y=y, x #最终结果:y=1, x=2
  • Python使用'(单引号)和"(双引号)来表示字符串。与Perl、Unix Shell语言或者Ruby、Groovy等语言不一样,两种符号作用相同。一般地,如果字符串中出现了双引号,就使用单引号来表示字符串;反之则使用双 引号。如果都没有出现,就依个人喜好选择。出现在字符串中的\(反斜杠)被解释为特殊字符,比如\n表示换行符。表达式前加r指示Python不解释字符串中出现的\。这种写法通常用于编写正则表达式或者Windows文件路径。
  • Python支持列表切割(list slices),可以取得完整列表的一部分。支持切割操作的类型有str, bytes, list, tuple等。它的语法是...[left:right]或者...[left:right:stride]。假定nums变量的值是[1, 3, 5, 7, 8, 13, 20],那么下面几个语句为真:
  • nums[2:5] == [5, 7, 8] 从下标为2的元素切割到下标为5的元素,但不包含下标为5的元素。
  • nums[1:] == [3, 5, 7, 8, 13, 20] 切割到最后一个元素。
  • nums[:-3] == [1, 3, 5, 7] 从最开始的元素一直切割到倒数第3个元素。
  • nums[:] == [1, 3, 5, 7, 8, 13, 20] 返回所有元素。改变新的列表不会影响到nums。
  • nums[1:5:2] == [3, 7] 从下标为1的元素切割到下标为5的元素但不包含下标为5的元素,且步长为2

函数

Python的函数支持 递归、默认参数值、可变参数,但不支持函数 重载。为了增强代码的可读性,可以在函数后书写“文档字符串”(Documentation Strings,或者简称docstrings),用于解释函数的作用、参数的类型与意义、返回值类型与取值范围等。可以使用内置函数 help()打印出函数的使用帮助。比如:
>>> def randint(a, b):
...     "Return random integer in range [a, b], including both end points."
...
>>> help(randint)
Help on function randint in module __main__:
 
randint(a, b)
    Return random integer in range [a, b], including both end points.

面向对象开发方法

面向对象开发方法是指绑定到对象的函数。调用对象方法的语法是 instance.method(arguments)。它等价于调用 Class.method(instance, arguments)。当定义对象方法时,必须显式地定义第一个参数,一般该参数名都使用 self,用于访问对象的内部数据。这里的 self相当于C++, Java里面的 this变量,但是我们还可以使用任何其它合法的参数名,比如 thismine 等, self与C++,Java里面的 this不完全一样,它可以被看作是一个习惯性的用法,我们传入任何其它的合法名称都行,比如:
class Fish:
    def eat(self, food):
        if food is not None:
            self.hungry=False
class User:
    def __init__(myself, name):
        myself.name = name
 
#构造Fish的实例:
f=Fish()
#以下两种调用形式是等价的:
Fish.eat(f, "earthworm")
f.eat("earthworm")
 
u = User('username')
 
u.name
Python认识一些以“__”开始并以“__”结束的特殊方法名,它们用于实现运算符重载和实现多种特殊功能。

数据类型&动态类型

Python采用动态类型系统。在编译的时候,Python不会检查对象是否拥有被调用的方法或者属性,而是直至运行时,才做出检查。所以操作对象 时可能会抛出异常。不过,虽然Python采用动态类型系统,它同时也是强类型的。Python禁止没有明确定义的操作,比如数字加字符串。
与其它面向对象语言一样,Python允许程序员定义类型。构造一个对象只需要像函数一样调用类型即可,比如,对于前面定义的 Fish类型,使用 Fish()。类型本身也是特殊类型 type的对象( type类型本身也是 type对象),这种特殊的设计允许对类型进行反射编程。
Python内置丰富的数据类型。与Java、C++相比,这些数据类型有效地减少代码的长度。下面这个列表简要地描述了Python内置数据类型(适用于Python 3.x):
类型描述例子
str一个由字符组成的不可更改的有串行。在Python 3.x里,字符串由Unicode字符组成。'Wikipedia'
"Wikipedia"
"""Spanning
multiple
lines"""
bytes一个由字节组成的不可更改的有串行。b'Some ASCII'
b"Some ASCII"
list可以包含多种类型的可改变的有串行[4.0, 'string', True]
tuple可以包含多种类型的不可改变的有串行(4.0, 'string', True)
set, frozenset与数学中集合的概念类似。无序的、每个元素唯一。{4.0, 'string', True}
frozenset([4.0, 'string', True])
dict一个可改变的由键值对组成的无串行。{'key1': 1.0, 3: False}
int精度不限的整数42
float浮点数。精度与系统相关。3.1415927
complex复数3+2.7j
bool逻辑值。只有两个值:真、假True
False
除了各种数据类型,Python语言还用类型来表示函数、模块、类型本身、对象的方法、编译后的Python代码、运行时信息等等。因此,Python具备很强的动态性。

数学运算

Python使用与C、Java类似的运算符,支持整数与浮点数的数学运算。同时还支持复数运算与无穷位数(实际受限于计算机的能力)的整数运算。除了求绝对值函数 abs()外,大多数数学函数处于 mathcmath模块内。前者用于实数运算,而后者用于复数运算。使用时需要先导入它们,比如:
>>> import math
>>> print(math.sin(math.pi/2))
1.0
fractions模块用于支持分数运算; decimal模块用于支持高精度的浮点数运算。
Python定义求余运行 a % b的值处于开区间 [0, b)内,如果 b是负数,开区间变为 (b, 0]。这是一个很常见的定义方式。不过其实它依赖于整除的定义。为了让方程式: b * (a // b) + a % b = a恒真,整除运行需要向负无穷小方向取值。比如 7 // 3的结果是 2,而 (-7) // 3的结果却是 -3。这个算法与其它很多编程语言不一样,需要注意,它们的整除运算会向0的方向取值。
Python允许像数学的常用写法那样连着写两个比较运行符。比如 a < b < ca < b and b < c等价。C++的结果与Python不一样,首先它会先计算 a < b,根据两者的大小获得0或者1两个值之一,然后再与c进行比较。

标准库

Python拥有一个强大的标准库 [4]。Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数,而由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。Python标准库命名接口清晰、文档良好,很容易学习和使用。
Python标准库的主要功能有:
  • 文本处理,包含文本格式化、正则表达式匹配、文本差异计算与合并、Unicode支持,二进制数据处理等功能
  • 文件处理,包含文件操作、创建临时文件、文件压缩与归档、操作配置文件等功能
  • 操作系统功能,包含线程与进程支持、IO复用、日期与时间处理、调用系统函数、写日记(logging)等功能
  • 网络通信,包含网络套接字,SSL加密通信、异步网络通信等功能
  • 网络协议,支持HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC等多种网络协议,并提供了编写网络服务器的框架
  • W3C格式支持,包含HTML,SGML,XML的处理。
  • 其它功能,包括国际化支持、数学运算、HASH、Tkinter等
Python社区提供了大量的第三方模块,使用方式与标准库类似。它们的功能无所不包,覆盖科学计算、Web开发、数据库接口、图形系统多个领域,并且大多成熟而稳定。第三方模块可以使用Python或者 C语言编写。 SWIG, SIP常用于将C语言编写的程序库转化为Python模块。 Boost C++ Libraries 包含了一组库,Boost.Python,使得以 Python 或 C++ 编写的程序能互相调用。借助于拥有基于标准库的大量工具、能够使用低级语言如C和可以作为其他库接口的C++,Python已成为一种强大的应用于其他语言与工具之间的“胶水”语言。

Python 3.0

Python的3.0版本,常被称为 Python 3000,或简称 Py3k [5]。相对于Python的早期版本,这是一个较大的 升级。为了不带入过多的累赘,Python 3.0在设计的时候没有考虑 向下兼容。许多针对早期Python版本设计的程序都无法在Python 3.0上正常运行。为了照顾现有程序,Python 2.6作为一个过渡版本,基本使用了Python 2.x的语法和 ,同时考虑了向Python 3.0的迁移,允许使用部分Python 3.0的语法与函数。基于早期Python版本而能正常运行于Python 2.6并无警告的程序可以通过一个2 to 3的转换工具无缝迁移到Python 3.0 [6]
新的Python程序建议使用Python 3.0版本的语法 [7]。 除非运行环境无法安装Python 3.0或者程序本身使用了不支持Python 3.0的第三方库。目前不支持Python 3.0的第三方库有Django, Twisted, py2exe, PIL等。大多数第三方库都正在努力地兼容Python 3.0版本。即使无法立即使用Python 3.0,也建议编写兼容Python 3.0版本的程序,然后使用Python 2.6, Python 2.7来运行。Python 2.7被确定为最后一个Python 2.x版本,它除了支持Python 2.x语法外,还支持部分Python 3.1语法。

主要变化

Python 3.0的变化主要在以下几个方面 [8]
  1. print语句没有了,取而代之的是print()函数。可以使用2to3工具来自动转换。Python 2.6与Python 2.7部分地支持这种形式的print语法。在Python 2.6与Python 2.7里面,以下三种形式是等价的:
print "fish"
print ("fish") #注意print后面有个空格
print("fish") #print()不能带有任何其它参数
然而,Python 2.6实际已经支持新的 print()语法:
from __future__ import print_function
print("fish", "panda", sep=', ')
  1. 新的str类型表示一个Unicode字符串,相当于Python 2.x版本的unicode类型。而字节串行则用类似b"abc"的语法表示,用bytes类表示,相当于Python 2.x的str类型。现在两种类型不能再隐式地自动转换,因此在Python 3.x里面"fish"+b"panda"是错误。正确的写法是"fish"+b"panda".decode("utf-8")。Python 2.6可以自动地将字节串行识别为Unicode字符串,方法是:
from __future__ import unicode_literals
print(repr("fish"))
  1. 除法运算符/在Python 3.x内总是返回浮点数。而在Python 2.6内会判断被除数与除数是否是整数。如果是整数会返回整数值,相当于整除;浮点数则返回浮点数值。为了让Python 2.6统一返回浮点数值,可以:
from __future__ import division
print(3/2)
  1. 捕获异常的语法由except exc, var改为except exc as var。使用语法except (exc1, exc2) as var可以同时捕获多种类型的异常。Python 2.6已经支持这两种语法。
  1. 字典推导式(Dictionary comprehensions){expr1: expr2 for k, v in d},这个语法等价于:
result={}
for k, v in d.items():
    result[expr1]=expr2
return result
  1. 集合(set)的新写法:{1,2,3,4}。注意{}仍然表示空的字典(dict)。
  1. 八进制数必须写成0o777,原来的形式0777不能用了;二进制必须写成0b111。新增了一个bin()函数用于将一个整数转换成二进制字符串。Python 2.6已经支持这两种语法。
  1. dict.keys(), dict.values(), dict.items(), map(), filter(), range(), zip()不再返回列表,而是迭代器。
  1. 如果两个对象之间没有定义明确的有意义的顺序。使用<, >, <=, >=比较它们会抛出异常。比如1 < ""在Python 2.6里面会返回True,而在Python 3.0里面会抛出异常。现在cmp(), instance.__cmp__()函数已经被删除。
  1. 可以注释函数的参数与返回值。此特性可方便IDE对源代码进行更深入的分析。例如:
def sendMail(from_:"nobody@example.com", \
             to:"somebody@example.com", \
             title:"hello", \
             body:"Just say hello to you.") -> True:
    pass
  1. 多个模块被改名(根据PEP8):
旧的名字新的名字
_winregwinreg
ConfigParserconfigparser
copy_regcopyreg
Queuequeue
SocketServersocketserver
reprreprlib
  1. StringIO模块现在被合并到新的io模块内。new, md5, gopherlib等模块被删除。Python 2.6已经支持新的io模块。
  2. httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib被合并到http包内。
  3. 取消了exec语句,只剩下exec()函数。Python 2.6已经支持exec()函数。
  • 其他变化详见参考文献[8]。基本上,可以编写出使用Python 3.0语法并运行于Python 2.6, Python 2.7的程序。

实现

Python是一门跨平台的脚本语言,Python规定了一个Python语法规则,根据该规则可编写Python 解释器
  • CPython[9],官方的解释器。需要区别于其他解释器的时候才以CPython称呼。这是最常用的Python版本。
  • Jython(原名JPythonJava语言实现的Python,现已正式发布)。Jython可以直接调用Java的各种函数库。
  • PyPy(使用Python语言写的Python)
  • IronPython(面向.NETECMA CLI的Python实现)。IronPython能够直接调用.net平台的各种函数库。可以将Python程序编译成.net程序。
  • ZhPy(周蟒)(支持使用繁/简中文语句编写程序的Python语言)

在eclipse上集成步骤:
1.下载需要的PyDev 2.7.1.zip.
2.解压之后将对应的文件放到eclipse中去覆盖。
3. 然后启动eclipse,在window-&gt;preference, 从右侧的树形列表中选择“ PyDev”-&gt;“Interpreter Python”, 点击New按钮,弹出一个对话框,对话框的Interpreter Name处写上python(可以自定义),下面的Interpreter Executable处从Python的安装路径下选择Python.exe,然后会弹出一个对话框让你勾选System PYTHONPATH,即python的系统路径,此处选择默认,到此整合.