Python

Official Python Logo | |
编程范型 | 多泛型、面向对象、函数式编程、面向切面编程 |
---|---|
設計者 | 吉多·范罗苏姆(Guido van Rossum) |
實作者 | Python Software Foundation |
发行时间 | 1991年 |
当前版本 | |
型態系統 | 强类型、动态类型、"duck" |
操作系统 | 跨平台 |
許可證 | Python Software Foundation License |
網站 | www.Python.org |
主要實作產品 | |
CPython、IronPython、Jython、Python for S60、PyPy、Unladen Swallow | |
衍生副語言 | |
Stackless Python | |
受影响于 | |
ABC、C語言、Haskell、Icon、Java、Lisp、Modula-3、Perl、Smalltalk、Tcl | |
影響語言 | |
Boo、Groovy、Ruby |
Python(Template:IPA-en),是一种面向对象、直譯式電腦程式語言,也是一種功能强大的通用型語言,已經具有近二十年的發展歷史,成熟且穩定。它包含了一組完善而且容易理解的標準庫,能夠輕鬆完成很多常見的任務。它的語法非常简捷和清晰,與其它大多數程式設計語言使用大括号不一樣,它使用縮排來定義语句块。
Python支援命令式程式設計、物件導向程式設計、函數式編程、面向切面編程、泛型編程多種編程范式。與Scheme、Ruby、Perl、Tcl等動態語言一樣,Python具備垃圾回收功能,能夠自動管理記憶體使用。它經常被當作腳本語言用於處理系统管理任務和網路程式編寫,然而它也非常適合完成各種高階任務。Python虛擬機本身幾乎可以在所有的作業系统中運行。使用一些諸如py2exe、PyPy、PyInstaller之類的工具可以將Python原始碼轉換成可以脫離Python解釋器執行的程式。
Python的主要參考實現是CPython,它是一個由社群驅動的自由軟體。目前由Python軟體基金會管理。基於這種語言的相關技術正在飛快的發展,使用者數量快速擴大,相關的資源非常多。
發展歷史
Python的創始人為吉多·范羅蘇母(Guido van Rossum)。在1989年聖誕節期間的阿姆斯特丹,吉多為了打發聖誕節的無趣,決心開發一個新的腳本解釋程式,作為ABC語言的一種繼承。之所以選中Python作為程式的名字,是因為他是一個蒙提·派森的飛行馬戲團的愛好者。ABC是由吉多参加設计的一種教學語言。就吉多本人看来,ABC這種語言非常優美和强大,是專門為非專業程式設計師設計的。但是ABC語言并没有成功,究其原因,吉多認為是非開放造成的。吉多決心在Python中避免這一錯誤,并取得了非常好的效果,完美结合了如C、C++和Java等其他語言。[4]
就這樣,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的設計哲學是“優雅”、“明確”、“簡單”。因此,Perl語言中“總是有多種方法來做同一件事”的理念在Python開發者中通常是難以忍受的。Python開發者的哲學是“用一種方法,最好是只有一種方法來做一件事”。在設計Python語言時,如果面臨多種選擇,Python開發者一般會拒绝花俏的語法,而選擇明確的没有或者很少有歧義的語法。由於這種設計觀念的差異,Python原始碼通常被認為比Perl具備更好的可讀性,并且能夠支撑大規模的軟體開發。這些準則被稱為Python格言。在Python解釋器内運行import this
可以獲得完整的列表。
Python開發人員盡量避開不成熟或者不重要的優化。一些針對非重要部位的加快運行速度的補丁通常不會被合併到Python内。所以很多人認為Python很慢。不過,根據二八定律,大多數程式對速度要求不高。在某些對運行速度要求很高的情況,Python設計師傾向於使用JIT技术,或者用使用C/C++語言改寫這部分程式。目前可用的JIT技術是PyPy。
Python是完全物件導向的語言。函數、模組、數字、字串都是物件。並且完全支持繼承、重載、派生、多繼承,有益於增强原始碼的複用性。Python支持重載運算符,因此Python也支持泛型設計。相對於Lisp這種傳統的函數式程式語言,Python對函數式設計只提供了有限的支持。有兩個標準庫(functools, itertools)提供了Haskell和Standard ML中久經考驗的函數式程式設計工具。
雖然Python可能被粗略地分類為「腳本語言」(script language),但實際上一些大規模軟體開發計畫例如Zope、Mnet及BitTorrent,Google也广泛地使用它。Python的支持者較喜歡稱它為一種高階動態程式語言,原因是「腳本語言」泛指僅作簡單程式設計任務的語言,如shell script、VBScript等只能處理簡單任務的程式語言,並不能與Python相提並論。
Python本身被設計為可擴充的。並非所有的特性和功能都集成到語言核心。Python提供了豐富的API和工具,以便程式設計師能够輕鬆地使用C语言、C++、Cython來編寫擴充模組。Python編譯器本身也可以被集成到其它需要腳本語言的程式内。因此,很多人還把Python作为一種「膠水語言」(glue language)使用。使用Python將其他語言編寫的程式進行集成和封裝。在Google内部的很多项目使用C++編寫性能要求極高的部分,然后用Python調用相應的模組。[來源請求]
Python的應用時機
Python經常被用於Web開發。比如,通過mod_wsgi模組,Apache可以運行用Python編寫的Web程式。Python定義了WSGI標準應用接口来協調Http伺服器與基於Python的Web程式之間的溝通。一些Web框架,如Django、TurboGears、web2py、Zope、flask等,可以讓程式設計師輕鬆地開發和管理複雜的Web程式。
在很多作業系统裡,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腳本。
NumPy、SciPy、Matplotlib可以讓Python程式設計師編寫科学計算程式。PyQt、PySide、wxPython、PyGTK是Python快速開發桌面應用程式的利器。
Python對於各种網路協定的支援很完善,因此經常被用於編寫伺服器軟體、網路蠕蟲。第三方函式庫Twisted支援非同步線上編寫程式和多數標準的網路協定(包含客户端和伺服器),並且提供了多種工具,被廣泛用於編寫高性能的伺服器軟體。
很多遊戲使用C++編寫圖形顯示等高性能模組,而使用Python或者Lua編寫遊戲的邏輯、伺服器。相較於Python,Lua的功能更簡單、體積更小;而Python則支援更多的特性和數據類型。
YouTube、Google、Yahoo!、NASA都在内部大量地使用Python。OLPC的作業系统Sugar項目的大多數軟體都是使用Python編寫。
很多遊戲,如 EVE Online 使用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語法
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
变量,但是我们还可以使用任何其它合法的参数名,比如this
和 mine
等,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
|
bytes
|
一个由字节组成的不可更改的有序列。 | 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()
外,大多数数学函数处于math
和cmath
模块内。前者用于实数运算,而后者用于复数运算。使用时需要先导入它们,比如:
>>> 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 < c
与a < b and b < c
等价。C++的结果与Python不一样,首先它会先计算a < b
,根据两者的大小获得0或者1两个值之一,然后再与c进行比较。
标准库
Python拥有一个强大的标准库[5]。Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数,而由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。Python标准库命名接口清晰、文档良好,很容易学习和使用。
Python社区提供了大量的第三方模块,使用方式与标准库类似。它们的功能无所不包,覆盖科学计算、Web开发、数据库接口、图形系统多个领域,并且大多成熟而稳定。第三方模块可以使用Python或者C语言编写。SWIG,SIP常用于将C语言编写的程序库转化为Python模块。Boost C++ Libraries 包含了一組函式庫,Boost.Python,使得以 Python 或 C++ 編寫的程式能互相呼叫。借助于拥有基于标准库的大量工具、能够使用低级语言如C和可以作为其他库接口的C++,Python已成为一种强大的应用于其他语言与工具之间的胶水语言。
Python标准库的主要功能有:
- 文本处理,包含文本格式化、正则表达式匹配、文本差异计算与合并、Unicode支持,二进制数据处理等功能
- 文件处理,包含文件操作、创建临时文件、文件压缩与归档、操作配置文件等功能
- 操作系统功能,包含线程与进程支持、IO复用、日期与时间处理、调用系统函数、写日记(logging)等功能
- 网络通信,包含网络套接字,SSL加密通信、异步网络通信等功能
- 网络协议,支持HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC等多种网络协议,并提供了编写网络服务器的框架
- W3C格式支持,包含HTML,SGML,XML的处理。
- 其它功能,包括国际化支持、数学运算、HASH、Tkinter等
Python 3.0
Python的3.0版本,常被称为Python 3000,或简称Py3k[6]。相对于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[7]。
新的Python程序建议使用Python 3.0版本的语法[8]。除非运行环境无法安装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的变化主要在以下几个方面[9]:
- 最引人注意的改变是
print
语句没有了,取而代之的是print()
函数。可以使用
2to3
工具自动地转换print
语句。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=', ')
- 新的
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"))
- 除法运算符
/在Python 3.x内总是返回浮点数。而在Python 2.6内会判断被除数与除数是否是整数。如果是整数会返回整数值,相当于整除;浮点数则返回浮点数值。为了让Python 2.6统一返回浮点数值,可以:
from __future__ import division
print(3/2)
- 捕获异常的语法由
except exc, var
改为except exc as var
。使用语法except (exc1, exc2) as var
可以同时捕获多种类型的异常。Python 2.6已经支持这两种语法。
- 字典推导式(Dictionary comprehensions)
{expr1: expr2 for k, v in d}
,这个语法等价于:
result={}
for k, v in d.items():
result[expr1]=expr2
return result
- 集合(set)的新写法:
{1,2,3,4}
。注意{}
仍然表示空的字典(dict)。
- 八进制数必须写成
0o777
,原来的形式0777
不能用了;二进制必须写成0b111
。新增了一个bin()
函数用于将一个整数转换成二进制字符串。Python 2.6已经支持这两种语法。
dict.keys(), dict.values(), dict.items(), map(), filter(), range(), zip()
不再返回列表,而是迭代器。
- 如果两个对象之间没有定义明确的有意义的顺序。使用
<, >, <=, >=
比较它们会抛出异常。比如1 < ""
在Python 2.6里面会返回True
,而在Python 3.0里面会抛出异常。现在cmp(), instance.__cmp__()
函数已经被删除。
- 可以注释函数的参数与返回值。此特性可方便IDE对源代码进行更深入的分析。例如:
def sendMail(from_:"nobody@example.com", \
to:"somebody@example.com", \
title:"hello", \
body:"Just say hello to you.") -> True:
pass
- 根据PEP8,多个模块被改名:
旧的名字
新的名字
_winreg
winreg
ConfigParser
configparser
copy_reg
copyreg
Queue
queue
SocketServer
socketserver
repr
reprlib
StringIO
模块现在被合并到新的io
模块内。new, md5, gopherlib
等模块被删除。Python 2.6已经支持新的io
模块。
httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib
被合并到http
包内。
- 取消了
exec
语句,只剩下exec()
函数。Python 2.6已经支持exec()
函数。
- 其他变化详见參考文獻[9]。基本上,可以编写出使用Python 3.0语法并运行于Python 2.6, Python 2.7的程序。
各种实现
Python是一门跨平台的脚本语言,Python规定了一个Python语法规则,实现了Python语法的解释程序就成为了Python的解释器。
- CPython(Classic Python,也就是原始的Python实现,需要区别于其他实现的时候才以CPython称呼;或解作C语言实现的Python)。这是最常用的Python版本。
- Jython(原名JPython;Java语言实现的Python,现已正式发布)。Jython可以直接调用Java的各种函数库。
- PyPy(使用Python语言寫的Python)
- IronPython(面向.NET和ECMA CLI的Python实现)。IronPython能够直接调用.net平台的各种函数库。可以将Python程序编译成.net程序。
- ZhPy(周蟒)(支持使用繁/簡中文语句编写程序的Python语言)
开发环境
适用于Python的集成开发环境(IDE)软件,除了标准二进制发布包所附的IDLE之外,还有许多其他选择。其中有些软件设计有语法着色、语法检查、运行调试、自动补全、智能感知等便利功能。由于Python的跨平台出身,这些软件往往也具备各种操作系统的版本或一定的移植性。
而很多并非集成开发环境软件的文本编辑器,也对Python有不同程度的支持,并且加上专门为Python设计的编辑器插件也会有很高的可用性。
专门为Python设计的IDE软件:
- Eric:基于PyQt的自由软件,功能强大。支持自动补全、智能感知、自动语法检查、工程管理、svn/cvs集成、自动单元测试等功能。调试功能与Visual Studio和Eclipse类似。目前同时有两个版本。Eric4支持Python2.x,Eric5支持Python3.x。使用前需要先安装相应的PyQt版本。
- IDLE:Python“标准”IDE。一般随Python而安装,支持较少的编辑功能。调试功能也比较弱。
- Komodo和Komodo Edit:后者是前者的免费精简版。也可以用于PHP,Ruby,Javascript,Perl,Web和云开发。
- PyCharm:由JetBrains打造,该公司的Java IDE软件IntelliJ拥有海量的使用者;PyCharm具备一般IDE的功能,比如, 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等,同时另外,PyCharm还提供了一些很好的功能用于Django开发,同时支持Google App Engine,更酷的是,PyCharm支持IronPython。PyCharm是商业软件,目前已经到2.5版本。
- PythonWin:包含在pywin32内的编辑器,仅适用于Windows。
- SPE(Stani's Python Editor):功能较多的免费软件,依赖wxPython。
- Ulipad:功能较全的免费软件,依赖wxPython。
- WingIDE:可能是功能最全的IDE,但不是免费软件。
- PyScripter:功能较全的开源IDE,使用Delphi开发。
通用IDE / 文本编辑器:
著名应用
- Pylons - Web应用框架
- Zope - 应用服务器
- Plone - 内容管理系统
- Django - 鼓励快速开发的Web应用框架
- TurboGears - 另一个Web应用快速开发框架
- Twisted--Python的网络应用程序框架
- Python Wikipedia Robot Framework - MediaWiki的機器人程式
- MoinMoinWiki - Python寫成的Wiki程序
- flask - Python 微Web框架
- Webpy - Python 微Web框架
- Bottle - Python 微Web框架
影響
- ECMAScript 從Python 參考了 iterators, generators, 以及 list comprehensions.
- OCaml 有個 optional syntax, 稱為 twt (The Whitespace Thing), 取材自 Python 與 Haskell.
参考文献
- ^ "Python Insider: Python 3.14.0a7, 3.13.3, 3.12.10, 3.11.12, 3.10.17 and 3.9.22 are now available"; 作者姓名字符串: Hugo; 出版日期: 2025年4月8日; 检索日期: 2025年4月9日.
- ^ Python 3.14.0 beta 1 is here!. 2025年5月7日 [2025年5月8日] (英語).
- ^ "Python 3.14 Reaches Beta With New Tail-Call Interpreter For Better Performance"; 检索日期: 2025年5月8日; 作品或名稱使用語言: 英語; 出版日期: 2025年5月7日; 宣传物: Phoronix.
- ^ Guido van Rossum. Foreword for "Programming Python" (1st ed.). 1996/5/1 (英语).
- ^ Przemyslaw Piotrowski, Build a Rapid Web Development Environment for Python Server Pages and Oracle, Oracle Technology Network, July 2006. Accessed October 21, 2008.
- ^ Python Software Foundation. Python 3.0b3 Release. 2008/8/20 [2008/8/30] (英语).
- ^ Python Software Foundation. Conversion tool for Python 2.x code: 2to3. [2008/8/30] (英语).
- ^ Python Software Foundation. Should I use Python 2 or Python 3 for my development activity?. 2010/9/14 (英语).
- ^ 9.0 9.1 Guido van Rossum. What’s New in Python 3.0. Python Software Foundation. 2009/2/14 [2011/2/22] (英语).
外部链接
- Python.org - Python的官方網站(英文)
- POT--PyTUG - Python台灣使用者群組
- PyTUG 一般討論區/郵件列表
- 政大應數《數理資訊》討論版 - Python討論區
- Planet@Taiwan:Python中文星球
- 水木清华Python版
- 玩Python群組
- Python中文社区
- Python技术论坛
- 周蟒 - 中文Python語言
- 中蟒 - 基於Python的中文编程语言
- 啄木鸟Pythonic开源社区
- 易記學Python中文教學
- 電腦做什麼事 - 利用Python提供給程式語言完全初學者的教學系列文章
- 简明Python教程(A Byte of Python)/繁體中文版/英文版官網
- 線上體驗Python(Google App Engine版)/線上體驗Python(英文)
- web.py 一个非常简约而强大的web开发框架(英文)
- PySide 一个采用LGPL协议的QT库(英文)
- 程式語言教學誌(Page of Python)
Python 3000相關連結
- (中文)專訪Guido van Rossum:迎接Python 3000
- (中文)Guido談Python 3000及與Ruby的競爭
- (中文)Python 3000 FAQ
- (英文)What's New in Python 3.0
- (英文)Python 2 or Python 3
- (中文)Python 3 學習筆記
- (中文)Python 3 教材
- (中文)深入 Python 3