Python

通用的高级编程语言
(重定向自Python语言

Python英國發音:/ˈpaɪθən/ 美國發音:/ˈpaɪθɑːn/)是一种广泛使用的解释型高级编程通用型编程语言,由吉多·范罗苏姆创造,第一版发布于1991年。Python是ABC语言的后继者,也可以視之為一種使用传统中缀表达式英语M-expressionLISP方言[4]。Python的设计哲学强调代码的可读性和简洁的语法(尤其是使用空格缩进划分代码块,而非使用大括号或者关键词)。相比於C++或Java,Python让开发者能够用更少的代码表达想法。不管是小型还是大型程序,该语言都试图让程序的结构清晰明瞭。

Phyton
Python logo and wordmark.svg
编程范型 多范式函数式指令式面向对象结构化反射式
設計者 吉多·范罗苏姆
實作者 Python软件基金会
发行时间 1991年,​29年前​(1991
穩定版本
3.8.3
( 2020年5月13日,​53天前​(2020-05-13[1]
預覽版本
3.9.0b1
( 2020年5月19日,​47天前​(2020-05-19[2]
型態系統 鸭子类型, 动态, 渐进英语gradual typing(自从3.5)[3]
作業系統 跨平台
許可證 Python软件基金会许可证
文件扩展名 .py、.pyw、.pyc、.pyo、.pyd、.pyz
網站 www.python.org 編輯維基數據鏈接
主要實作產品
CPythonPyPyIronPythonJython
衍生副語言
CythonRPythonStackless Python
啟發語言
ABCALGOL 68CC++Dylan英语Dylan (programming language)HaskellIconJavaLispModula-3Perl
影響語言
BooCobraDF#FalconGoGroovyJavaScriptRuby

SchemeRubyPerlTcl等动态类型编程语言一样,Python拥有动态类型系统垃圾回收功能,能够自动管理内存使用,并且支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。其本身拥有一个巨大而广泛的标准库。

Python 解释器本身几乎可以在所有的操作系统中运行。Python的其中一個直譯器CPython是用C语言编写的、是一個由社群驱动的自由软件,目前由Python软件基金会管理。

歷史编辑

 
Python的創始人為吉多·范羅蘇姆(Guido van Rossum)。

Python的創始人為吉多·范羅蘇姆,当时他在阿姆斯特丹CWI工作。1989年的聖誕節期間,吉多·范羅蘇姆為了在打發时间,決心開發一個新的腳本解釋程式,作為ABC語言的一種繼承,担负同Amoeba操作系统英语Amoeba (operating system)的交互和异常处理[5]。之所以選中Python作為程式的名字,是因為他是BBC電視劇——蒙提·派森的飛行馬戲團的愛好者。Python是为了替代使用Unix shellC语言进行系统管理而從ABC语言發展起来[5],而它的模块系统主要受到了Modula-3的影響[6],它还结合了C语言的最少争议特征。就范羅蘇姆本人看来,ABC這種語言非常優美和强大,是專門為非專業程式設計師設計的。但是ABC語言并没有成功,究其原因,他認為是非開放造成的。范羅蘇姆決心在Python中避免這一錯誤,并取得了非常好的效果。[7]

目前范羅蘇姆仍然是Python的主要開發者,決定整個Python語言的發展方向。Python社群經常稱呼他是終身仁慈獨裁者(BDFL)。

Python 2.0於2000年10月16日發布,增加了實現完整的垃圾回收,并且支持Unicode。同时,整個開發過程更加透明,社群對開發進度的影響逐渐擴大。

Python 3.0於2008年12月3日發布,此版不完全兼容之前的Python原始碼。不過,很多新特性後來也被移植到舊的Python 2.6/2.7版本。

特性與設計哲學编辑

Python是多范式编程语言。完全支持面向对象编程结构化编程,而它的很多特征支持函数式编程面向切面编程(包括元编程元对象英语Metaobject(魔术方法))。Python是完全物件導向的語言,函數、模組、數值、字串都是物件;並且完全支持繼承、重載、派生、多重繼承,有益於增强原始碼的複用性。Python支持重載運算符,因此Python也支持泛型設計。Python對遵循Lisp傳統的函数式编程提供了有限的支持,它提供了 filtermapreduce函数;列表推导字典、集合和生成器表达式[8]。標準庫中有兩個模組(functools和itertools)实现了从HaskellStandard ML取来的函數式工具[9]

Python的設計哲學是“優雅”、“明確”、“簡單”。Python開發者的哲學是“用一種方法,最好是只有一種方法來做一件事”,也因此它和擁有明顯個人風格的其他語言很不一樣。在設計Python語言時,如果面臨多種選擇,Python開發者一般會拒绝花俏的語法,而選擇明確没有或者很少有歧義的語法。這些準則被稱為「Python之禅」。在Python解釋器内運行import this可以獲得完整的列表,下面是其中首要:

  • 优美优于丑陋。明瞭优于隐晦。
  • 简单优于复杂。复杂优于凌乱。
  • 扁平优于嵌套。稀疏优于稠密。
  • 可读性很重要。

Python開發人員盡量避開不成熟或者不重要的優化。一些針對非重要部位的加快運行速度的補丁通常不會被合併到Python内。再加上因为Python属于动态类型语言,动态类型语言是在运行期间检查数据的类型,不得不保持描述变量值的实际类型标记,程序在每次操作变量时,需要执行数据依赖分支,而静态类型语言相对于动态类型语言,在声明变量时已经指定了数据类型和表示方法,根据这一原理导致Python相对于C、Visual Basic等静态类型语言来说运行速度较慢。不過,根據二八定律,大多數程式對速度要求不高。在某些對運行速度要求很高的情況,Python設計師可以使用JIT技术PyPy,或者使用C/C++語言编写扩展模块。

Python本身被設計為可擴充的。並非所有的特性和功能都集成到語言核心。Python提供了豐富的API和工具,以便程式設計師能够輕鬆地使用CC++Cython來編寫擴充模組。Python編譯器本身也可以被集成到其它需要腳本語言的程式内。因此,有很多人把Python作为一種「膠水語言」使用。使用Python將其他語言編寫的程式進行集成和封裝。

語法编辑

Python的設計目標之一是讓程式碼具備高度的可閱讀性。它設計時盡量使用其它語言經常使用的標點符號和英文單字,讓程式碼看起来整潔美觀。因为Python是动态语言,它不像其他的靜態語言如CPascal那樣需要書寫聲明語句。

縮排编辑

Python開發者有意讓違反了縮排規則的程序不能通過解釋,以此來強迫程序員養成良好的編程習慣,也方便所有人查找和閱讀。並且Python語言利用縮排表示語句塊的開始和結束(Off-side規則),而非使用花括號或者某種關鍵字。增加縮排表示語句塊的開始,而減少縮排則表示語句塊的結束。縮排成為了語法的一部分。例如if語句:

if age < 21:
    print("你不能買酒")  #美國法律規定21歲以下的人不能購買酒
    print("不過你能買口香糖")
print("這句話處於if語句塊的外面")
  • 注:上述例子為Python 3.0以上版本的程式碼。

根據PEP 8的規定,必須使用4個空格來表示每級縮排。使用Tab字符和其它數目的空格雖然都可以被解釋器識別,但不符合編碼規範。支持Tab字符和其它数目的空格僅僅是為兼容很舊的Python程式和某些有問題的編輯程式。偏向使用Tab字符的程序員可以設置文本編輯器將Tab鍵轉換為4個空格實現縮進而不致導致縮進錯誤。

标识符编辑

  • _foo(单下划线开头):弱“内部使用”标识。对于from M import *,将不导入所有以下划线开头的对象,包括包、模块、成员。
  • foo_(单下划线结尾):为了避免与python关键字的命名冲突。
  • __foobar(双下划线开头):模块内的成员,表示私有成员,外部无法直接调用。
  • __foobar__(双下划线开头双下划线结尾):指那些包含在用户无法控制的命名空间中的“魔术”对象或属性,如类成员的__name____doc____init____import____file__等。建议永远不要将这样的命名方式应用于自己的变量或函数。

語句和控制流编辑

  • if語句,當條件成立時執行語句塊。經常與elseelif(相當於else if)配合使用。
  • for語句,遍历列表、字符串、字典、集合等迭代器,依次處理迭代器中的每個元素。
  • while語句,當條件為真時,循環執行語句塊。
  • try語句。與exceptfinallyelse配合使用處理在程式執行中出现的異常情況。
  • class語句。用於定義類型。
  • def語句。用於定義函數和類型的方法。
  • pass語句。表示此行為空,不執行任何操作。
  • assert語句。用於程式調適階段時測試執行條件是否滿足。
  • with語句。Python2.5加入的語法,用于在一個場景中執行語句塊。比如,執行語句塊前加锁,然后在語句塊執行結束後释放锁。
  • yield语句。使用它从一个生成器中返回一个值。自从Python 2.5,yield也是一个运算符,这种形式被用来实现协程
  • raise语句。抛出一个异常。
  • import语句。导入一个模块或包。常用写法:from module import nameimport module as namefrom module import name as anothername

表达式编辑

Python的表达式写法与C/C++类似。只是在某些写法有所差别。

  • 主要的算术运算符与C/C++类似。+, -, *, /, //, **, ~, %分别表示加法或者取正、减法或者取负、乘法、除法、整除、乘方、取反、取餘數。>>, <<表示右移和左移。&, |, ^表示二进制的AND, OR, XOR运算。>, <, ==, !=, <=, >=用于比较两个表达式的值,分别表示大于、小于、等于、不等于、小于等于、大于等于。在这些运算符里面,~, |, ^, &, <<, >>必须应用于整数。
  • Python使用and, or, not表示逻辑运算。
  • is, is not用于比较两个变量是否是同一个对象。in, not in用于判断一个对象是否属于另外一个对象。
>>> [x + 3 for x in range(4)]
[3, 4, 5, 6]
>>> {x + 3 for x in range(4)}
{3, 4, 5, 6}
>>> {x: x + 3 for x in range(4)}
{0: 3, 1: 4, 2: 5, 3: 6}
  • Python支持“生成器表达式”,比如计算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.

函数调用时,实参可以如同C语言那样按照位置与形参匹配;也可以按照命名參數英语Named parameter形式调用,即 param_name=value 形式的实参。在一个函数调用的实参表中,關鍵字引數必须出现在位置参数之后。

可变参数用*args或**dictargs表示,即在形式参数名字前加一个*号,表示这是由多个实参组成的可变参数,该形参视作tuple数据类型;在形式参数名字前加**号,表示这是由多个实参组成的可变参数,该形参视作dict数据类型。实际上,在一个"集合(collection)类型"(包括set、list、tuple甚至bytes、str等)的变量前加一个*号,获得了其中所有元素作为多个对象。

Python的函数作为第一類物件,具有和普通变量平等的地位。函数一旦定义,即可视作为普通对象,其形参会保留上次调用时的值,但在函数新的一次调用时会被实参值覆盖。因此函数的缺省参数值在连续多次调用该函数时,如果不被实参值覆盖,就会一直保留。例如:

def f(a, L=[]):
    L.append(a)
    return L

print(f(1))
print(f(2))
print(f(3))

结果为:

[1]
[1, 2]
[1, 2, 3]

函数的缺省参数值在函数被定义时被一次性计算其初值。

Python的函数实参与形参之间的结合是传递对象的引用[10]。这是因为Python的赋值操作是把(变量)名字绑定到对象上。形实结合也是这种方式。如果形参绑定到一个可变的对象,则通过形参对此对象内容的修改,在函数外也是可见的。如果形参绑定到一个不可变的对象,则通过形参是不能修改此对象内容,但可以把形参重新绑定到其它对象上,这并不影响函数外的对象的值。例如:

def foo(a):
    a.append('haha')
    
def bar(b):
    b=101 #实际上是重新绑定了另一个整型对象101

a=[]
b=100
foo(a)
bar(b)
print(a) #结果为['haha']
print(b) #结果为100

数据类型与动态类型编辑

 
Python 3中的标准类型层次结构

Python采用动态类型系统。Python不会在编译期检查对象是否拥有被调用的方法或者属性,而是直至运行时,才做出检查。所以操作对象时可能会抛出异常。不过,虽然Python采用动态类型系统,它同时也是强类型的。Python禁止没有明确定义的操作,比如数字加字符串。

与其它面向对象语言一样,Python允许程序员定义类型。构造一个对象只需要像函数一样调用类型即可,比如,对于前面定义的Fish类型,使用Fish()。类型本身也是特殊类型type的对象(type类型本身也是type对象),这种特殊的设计允许对类型进行反射编程。

Python内置多种数据类型。下面这个列表简要地描述了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具备很强的动态性。

面向对象开发方法编辑

面向对象开发方法是指绑定到对象的函数。调用对象方法的语法是instance.method(arguments)。它等价于调用Class.method(instance, arguments)。当定义对象方法时,必须显式地定义第一个参数,一般该参数名都使用self,用于访问对象的内部数据。这里的self相当于C++, Java里面的this变量,但是我们还可以使用任何其它合法的参数名,比如thismine等,self与C++,Java里面的this不完全一样,它可以被看作是一个习惯性的用法,我们传入任何其它的合法名称都行,比如:

class Fish(object):
    def eat(self, food):
        if food is not None:
            self.hungry=False
class User(object):
    def __init__(myself, name):
        myself.name = name

#构造Fish的实例:
f=Fish()
#以下两种调用形式是等价的:
Fish.eat(f, "earthworm")
f.eat("earthworm")

u = User('username')

u.name

Python支持一些以“__”开始并以“__”结束的特殊方法名,它们用于实现运算符重载和实现多种特殊功能。

数学运算编辑

Python使用与C、Java类似的运算符,支持整数与浮点数的数学运算。同时还支持复数运算与无穷位数(实际受限于计算机的能力)的整数运算。除了求绝对值函数abs()外,大多数数学函数处于mathcmath模块内。前者用于实数运算,而后者用于复数运算。使用时需要先导入它们,比如:

>>> import math
>>> print(math.sin(math.pi/2))
1.0

fractions模块用于支持分数运算;decimal模块用于支持高精度的浮点数运算;第三方库Sympy用于支持数学符号运算。

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拥有一个强大的标准库[11]。Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数,而由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。

Python标准库的主要功能有:

  • 文本处理,包含文本格式化、正则表达式、文本差异计算与合并、Unicode支援,二进制数据处理等功能
  • 文件处理,包含文件操作、建立临时文件、文件压缩与归档、操作配置文件等功能
  • 操作系统功能,包含线程与进程支持、IO复用、日期与时间处理、调用系统函数、日志(logging)等功能
  • 网络通信,包含网络套接字,SSL加密通信、异步网络通信等功能
  • 网络协议,支持HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC等多种网络协议,并提供了编写网络服务器的框架
  • W3C格式支持,包含HTML,SGML,XML的处理。
  • 其它功能,包括国际化支持、数学运算、HASH、Tkinter等

Python社群提供了大量的第三方模組,使用方式与标准库类似。它们的功能覆盖科学计算、Web开发、数据库接口、图形系统多个领域。第三方模块可以使用Python或者C语言编写。SWIGSIP常用于将C语言编写的程序库转化为Python模块。Boost C++ Libraries包含了一組函式庫,Boost.Python,使得以Python或C++編寫的程式能互相调用。Python常被用做其他语言与工具之间的“胶水”语言。

程序代码实例编辑

一個在標準輸出設備上輸出Hello World的簡單程式,這種程式通常作為開始學習程式語言時的第一個程式:

  • 適用於Python 3.0以上版本以及Python 2.6、Python 2.7
print("Hello, world!")
  • 適用於Python 2.6以下版本
print "Hello, world!"

單步執行编辑

Python也可以單步直譯執行。執行Python直譯器進入互動式命令列的環境,你可以在提示符號>>>旁輸入print("Hello, world!"),按Enter鍵輸出結果:

  • 適用於Python 3.0以上版本以及Python 2.6、Python 2.7
>>> print('Hello, world!')
Hello, world!
  • 適用於Python 2.6以下版本
>>> print "Hello, world!"
Hello, world!

注意,在3.0及以上版本中,需要在"Hello,world"周围加上圆括号。其原因是在3.0及以上版本中,print命令不再是一个关键字,而是一个函数。

應用编辑

雖然Python可能被粗略地分類為「腳本語言」,但實際上一些大規模軟體開發計划例如Zope、Mnet及BitTorrentGoogle也广泛地使用它。Python的支持者較喜歡稱它為一種高階動態程式語言,原因是「腳本語言」泛指僅作簡單程式設計任務的語言,如shell script、VBScript等只能處理簡單任務的程式語言,並不能與Python相提並論。在Google内部的很多项目,例如Google應用服務引擎使用C++編寫性能要求極高的部分,然后用Python或Java/Go調用相應的模組。[12]《Python技术手册》的作者马特利(Alex Martelli)說:“這很難講,不過,2004年,Python已在Google內部使用,Google召募許多Python高手,但在這之前就已決定使用Python。他們的目的是尽量使用Python,在不得已时改用C++;在操控硬體的場合使用C++,在快速開發時候使用Python。”[13]

網絡應用程式编辑

Python經常被用於Web開發。比如,通過mod_wsgi英语mod_wsgi模組,Apache可以運行用Python編寫的Web程式。使用Python语言编写的Gunicorn作为Web服务器,也能够运行Python语言编写的Web程序。Python定義了WSGI標準應用接口来協調Http伺服器與基於Python的Web程式之間的溝通。一些Web框架,如DjangoPyramidTurboGearsTornadoweb2pyZopeFlask等,可以讓程式設計師輕鬆地開發和管理複雜的Web程式。

Python對於各种網路協定的支援很完善,因此經常被用於編寫伺服器軟體、網路爬蟲。第三方函式庫Twisted支援非同步線上編寫程式和多數標準的網路協定(包含客户端和伺服器),並且提供了多種工具,被廣泛用於編寫高性能的伺服器軟體。另有gevent这个流行的第三方库,同样能够支持高性能高并发的网络开发。

GUI开发编辑

Python本身包含的Tkinter库能够支持简单的GUI开发。但是越来越多的Python程序员选择wxPython或者PyQt等GUI套件来开发跨平台的桌面软件。使用它们开发的桌面软件运行速度快,与用户的桌面环境相契合。通过PyInstaller还能将程序发布为独立的安装程序包。

作業系統编辑

在很多作業系統裡,Python是標準的系统元件。大多數Linux發行版和Mac OS X都集成了Python,可以在終端機下直接執行Python。有一些Linux發行版的安裝器使用Python語言編寫,比如Ubuntu的Ubiquity安裝器、Red Hat Linux和Fedora的Anaconda安裝器。在RPM系列Linux发行版中,有一些系统组件就是用Python编写的。Gentoo Linux使用Python來編寫它的Portage軟件包管理系统。Python標準庫包含了多個調用作業系统功能的函式庫。通過pywin32這個第三方軟體包,Python能夠訪問Windows的COM服務及其它Windows API。使用IronPython,Python程式能夠直接調用.Net Framework。

科學計算编辑

NumPySciPyMatplotlib可以讓Python程式設計師編寫科学計算程式。有些公司会使用Scons代替make构建C++程序。

很多遊戲使用C++編寫圖形顯示等高性能模組,而使用Python或者Lua編寫遊戲的邏輯、伺服器。相較於Python,Lua的功能更簡單、體積更小;而Python則支援更多的特性和數據類型。很多遊戲,如EVE Online使用Python來處理遊戲中繁多的邏輯。

YouTube、Google、Yahoo!、NASA都在内部大量地使用Python。OLPC的作業系统Sugar項目的大多數軟體都是使用Python編寫。

实现编辑

Python是一门跨平台的脚本语言,Python规定了一个Python语法规则,根据该规则可编写Python直譯器

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

开发环境编辑

通用IDE / 文本编辑器编辑

很多并非集成开发环境软件的文本编辑器,也对Python有不同程度的支持,并且加上专门为Python设计的编辑器插件也会有很高的可用性。

专门为Python设计的IDE软件编辑

适用于Python的集成开发环境(IDE)软件,除了标准二进制发布包所附的IDLE之外,还有许多其他选择。其中有些软件设计有语法着色、语法检查、运行调试、自动补全、智能感知等便利功能。由于Python的跨平台出身,这些软件往往也具备各种操作系统的版本或一定的移植性。

  • Eric:基于PyQt的自由软件。支持自动补全、智能感知、自动语法检查、工程管理、svn/mercurial集成、自动单元测试等功能,具有可扩展的插件系统,通过可选插件支持Git集成。调试功能与Visual Studio和Eclipse类似。目前版本为Eric6,可同时支持Python2.x和Python3.x,以及PyQt4和PyQt5。使用前需要先安装相应的Python和PyQt版本。
  • IDLE:Python“标准”IDE。一般随Python而安装,支持较少的编辑功能。调试功能也比较弱。
  • KomodoKomodo Edit:后者是前者的免费精简版。也可以用于PHP,Ruby,Javascript,Perl,Web和云开发。
  • PyCharm:由JetBrains打造,该公司的Java IDE软件IntelliJ(此软件也有Python开发插件)拥有海量的使用者;PyCharm具备一般IDE的功能,比如,调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等,同时另外,PyCharm还提供了一些很好的功能用于Django开发,同时支持Google App Engine,PyCharm也支持IronPython。PyCharm是商业软件,但也具有社区版和教育版。
  • PyScripter:功能较全的开源IDE,使用Delphi开发。
  • PythonWin:包含在pywin32内的编辑器,仅适用于Windows。
  • SPE(Stani's Python Editor):功能较多的免费软件,依赖wxPython
  • Spyder:开源的跨平台科学计算IDE。
  • Ulipad:功能较全的免费软件,依赖wxPython
  • WingIDE:商业软件,有免費的Wing IDE 101,功能有限,適用於入門者教學。

Python 3.0编辑

Python的3.0版本,常被称为Python 3000,或简称Py3k[15]。相对于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[16]

新的Python程序建议使用Python 3.0版本的语法[17]。除非运行环境无法安装Python 3.0或者程序本身使用了不支持Python 3.0的第三方库。目前不支持Python 3.0的第三方库有Twisted, 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的变化主要在以下几个方面[18]

  • 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=', ')
  • 新的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已经支持这两种语法。
  • 集合(set)的新写法:{1,2,3,4}。注意{}仍然表示空的字典(dict)。
result={}
for k, v in d.items():
    result[expr1]=expr2
return result
result = set()
for x in stuff:
    result.add(expr1)
return result
  • 八进制数必须写成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__()函数已经被删除。
  • Python 3.5支持型態提示(Type Hints),可以注释函数的参数与返回值。此特性可方便IDE对源代码进行更深入的分析。例如给参数增加类型信息:
def send_mail(from_: str, to: str, title: str, body: str) -> bool:
    pass
  • 合并intlong类型。
  • 多个模块被改名(根据PEP8):
旧的名字 新的名字
_winreg winreg
ConfigParser configparser
copy_reg copyreg
Queue queue
SocketServer socketserver
repr reprlib
  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()函数。
  • 其他变化详见參考文獻[18]。基本上,可以编写出使用Python 3.0语法并运行于Python 2.6, Python 2.7的程序。

著名第三方库编辑

Web框架编辑

  • Django:开源Web开发框架,它鼓励快速开发,并遵循MVC设计,开发周期短。
  • Flask:轻量级的Web框架。
  • Pyramid:轻量,同時有可以規模化的Web框架,Pylon projects 的一部分。
  • ActiveGrid:企业级的Web2.0解决方案。
  • Karrigell:简单的Web框架,自身包含了Web服务,py脚本引擎和纯python的数据库PyDBLite。
  • Tornado:一个轻量级的Web框架,内置非阻塞式服务器,而且速度相当快
  • webpy:一个小巧灵活的Web框架,虽然简单但是功能强大。
  • CherryPy:基于Python的Web应用程序开发框架。
  • Pylons:基于Python的一个极其高效和可靠的Web开发框架。
  • Zope:开源的Web应用服务器。
  • TurboGears:基于Python的MVC风格的Web应用程序框架。
  • Twisted:流行的网络编程库,大型Web框架。
  • Quixote:Web开发框架。
  • aiohttp:轻量级的Web框架,采用的是Python3的asyncio异步特性。

科学计算编辑

  • Matplotlib:用Python实现的类matlab的第三方库,用以绘制一些高质量的数学二维图形。
  • Pandas:用于数据分析、数据建模、数据可视化的第三方库。
  • SciPy:基于Python的matlab实现,旨在实现matlab的所有功能。
  • NumPy:基于Python的科学计算第三方库,提供了矩阵,线性代数,傅立叶变换等等的解决方案。

GUI编辑

  • PyGtk:基于Python的GUI程序开发GTK+库。
  • PyQt:用于Python的QT开发库。
  • WxPython:Python下的GUI编程框架,与MFC的架构相似。

其它编辑

  • BeautifulSoup:基于Python的HTML/XML解析器,简单易用。
  • gevent:python的一个高性能并发框架,使用了epoll事件监听、协程等机制将异步调用封装为同步调用。
  • PIL:基于Python的图像处理库,功能强大,对图形文件的格式支持广泛。目前已无维护,另一个第三方库Pillow实现了对PIL库的支持和维护。
  • PyGame:基于Python的多媒体开发和游戏软件开发模块。
  • Py2exe:将python脚本转换为windows上可以独立运行的可执行程序。
  • Requests:适合于人类使用的HTTP库,封装了许多繁琐的HTTP功能,极大地简化了HTTP请求所需要的代码量。
  • scikit-learn:機器學習第三方库,實現許多知名的機器學習演算法。
  • TensorFlowGoogle开发维护的开源机器学习库。
  • Keras:基於TensorFlowTheanoCNTK的高階神經網路API
  • SQLAlchemy关系型数据库对象关系映射(ORM)工具

使用Python编写的著名应用编辑

  • Youtube - 視頻社交网站
  • Reddit - 社交分享网站
  • Dropbox - 文件分享服务
  • 豆瓣网 - 图书、唱片、电影等文化产品的资料数据库网站
  • Django - 鼓励快速开发的Web应用框架
  • Pylons - Web应用框架
  • Zope - 应用服务器
  • Plone - 内容管理系统
  • Instagram - 是一款免费提供在线图片及视频分享的社交应用软件,使用Django作为后台
  • TurboGears - 另一个Web应用快速开发框架
  • Twisted - Python的网络应用程序框架
  • Fabric - 用于管理成百上千台Linux主机的程序库
  • Python Wikipedia Robot Framework - MediaWiki的機器人程式
  • MoinMoinWiki - Python寫成的Wiki程序
  • Trac - 使用Python编写的BUG管理系统
  • Mailman - 使用Python编写的邮件列表软件
  • Mezzanine - 基于Django编写的内容管理系统
  • Flask - Python微Web框架
  • Webpy - Python微Web框架
  • Bottle - Python微Web框架
  • EVE - 网络游戏EVE大量使用Python进行开发
  • Blender - 使用Python作為建模工具與GUI語言的開源3D繪圖軟體
  • Inkscape - 一个开源的SVG矢量图形编辑器。
  • 知乎 - 一个问答网站
  • 果壳 - 一个泛科技主题网站
  • Odoo-仍在持续发展壮大且最受欢迎的ERP软件

社群编辑

  • PyCon是各地社群舉辦的會議,通常每年舉辦。各社群在會議中討論Python相關的議題。
  • 台灣Python社群由2012年起舉辦PyCon TW
  • 由女性社群發起的PyLadies英语PyLadies社群,主要注重於發展Python的女性程式設計社群。
  • Django Girls使用Django網頁設計框架,推廣使用Python進行網頁設計的技術。

影響编辑

  • ECMAScript從Python參考了iterators,generators,以及list comprehensions。
  • OCaml有個optional syntax,稱為twt(The Whitespace Thing),取材自Python與Haskell

参考文献编辑

  1. ^ Python 3.8.3. Python Software Foundation. [2020-05-13]. 
  2. ^ Python Releases for Windows. Python Software Foundation. [2020-05-19]. 
  3. ^ PEP 483 -- The Theory of Type Hints. Python.org. 
  4. ^ 彼德·諾米格. Python for Lisp Programmers. Python can be seen as a dialect of Lisp with "traditional" syntax (what Lisp people call "infix" or "m-lisp" syntax). 
  5. ^ 5.0 5.1 Why was Python created in the first place?. Python FAQ. [March 22, 2007]. 
  6. ^ The Making of Python. Artima Developer. [March 22, 2007]. 
  7. ^ Guido van Rossum. Foreword for "Programming Python" (1st ed.). 1996-05-01 (英语). 
  8. ^ Hettinger, Raymond. PEP 289 – Generator Expressions. Python Enhancement Proposals. Python Software Foundation. 30 January 2002 [19 February 2012]. 
  9. ^ 6.5 itertools – Functions creating iterators for efficient looping. Docs.python.org. [22 November 2016]. 
  10. ^ call by value (where the value is always an object reference, not the value of the object)或者称作call by object reference
  11. ^ Przemyslaw Piotrowski, Build a Rapid Web Development Environment for Python Server Pages and Oracle, Oracle Technology Network, July 2006. Accessed October 21, 2008.
  12. ^ Python Language Guide (v1.0). Google Documents List Data API v1.0. Google. [2012-11-30]. (原始内容存档于2010-08-11). 
  13. ^ Heavy usage of Python at Google
  14. ^ http://www.Python.org CPython
  15. ^ Python Software Foundation. Python 3.0b3 Release. 2008-08-20 [2008-08-30] (英语). 
  16. ^ Python Software Foundation. Conversion tool for Python 2.x code: 2to3. [2008-08-30]. (原始内容存档于2012-07-29) (英语). 
  17. ^ Python Software Foundation. Should I use Python 2 or Python 3 for my development activity?. 2010-09-14 (英语). 
  18. ^ 18.0 18.1 Guido van Rossum. What’s New in Python 3.0. Python Software Foundation. 2009-02-14 [2011-02-22] (英语). 

延伸閱讀编辑

参见编辑

外部链接编辑