跳转到内容

Python

本页使用了标题或全文手工转换
维基百科,自由的百科全书

这是本页的一个历史版本,由118.169.138.208留言2011年3月17日 (四) 09:18 Python 3000相關連結编辑。这可能和当前版本存在着巨大的差异。

Python
Official Python Logo
编程范型多泛型,面向对象,函数式编程,面向切面编程
設計者吉多·范罗苏姆
實作者Python Software Foundation
发行时间1991年
当前版本
  • 3.13.3(2025年4月8日;穩定版本)[1]
  • 3.14.0b2(2025年5月26日;测试版本)[2]
編輯維基數據鏈接
型態系統强类型, 动态类型, "duck"
操作系统跨平台
許可證en:Python Software Foundation License
網站www.python.org
主要實作產品
CPython, IronPython, Jython, Python for S60, PyPy, Unladen Swallow
衍生副語言
Stackless Python
受影响于
ABCC語言HaskellIconJavaLispModula-3PerlSmalltalkTcl
影響語言
RubyBooGroovy

Python([KK] Template:IPA-en, [DJ] Template:IPA-en),是一种面向对象直譯式计算机程序设计语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法非常简捷和清晰,与其它计算机程序设计语言不一样,它采用缩进来定义语句块。

Python支持命令式编程面向对象程序设计函数式编程面向切面编程泛型编程多种编程范式。与SchemeRubyPerlTcl等动态语言一样,Python具备垃圾回收功能,能够自动管理内存使用。它经常被当作脚本语言用于处理系统管理任务和Web编程,然而它也非常适合完成各种高阶任务。Python虚拟机本身几乎可以在所有的操作系统中运行。使用一些诸如py2exePyPyPyInstaller之类的工具可以将Python源代码转换成可以脱离Python解释器执行的程序。

Python的主要参考实现是CPython,它是一个由社区驱动的自由软件。目前由Python软件基金会管理。基于这种语言的相关技术正在飞速的发展,用户数量急剧扩大,相关的资源非常多。

发展历史

Python的创始人为吉多·范罗苏姆。在1989年圣诞节期间的阿姆斯特丹,吉多为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。之所以选中Python作为程序的名字,是因为他是一个蒙提·派森的飛行馬戲團的爱好者。ABC是由吉多参加设计的一种教学语言。就吉多本人看来,ABC这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,吉多认为是非开放造成的。吉多决心在Python中避免这一错误(的确如此,Python与其它的语言如CC++Java结合的非常好)。同时,他还想实现在ABC中闪现过但未曾实现的东西。[3]

就这样,Python在吉多手中诞生了。实际上,第一个实现是在Mac机上。可以说,Python是从ABC发展起来,主要受到了Modula-3(另一种相当优美且强大的语言,为小型团体所设计的)的影响。并且结合了Unix shell和C的习惯。

目前吉多·范罗苏姆仍然是Python的主要开发者,决定整个Python语言的发展方向。Python社区经常称呼他是仁慈的独裁者

Python 2.0于2000年10月16日发布,主要是实现了完整的垃圾回收,并且支持Unicode。同时,整个开发过程更加透明,社区对开发进程的影响逐渐扩大。2008年12月3发布,经过长时间的测试,Python 3.0发布。它不完全兼容之前的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技术是Pysco。

Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强代码的复用性。Python支持重载运算符,因此Python也支持泛型设计。相对于Lisp这种传统的函数式编程语言,Python对函数式编程只提供了有限的支持。有两个标准库(functools, itertools)提供了HaskellStandard ML中久经考验的函数式编程工具。

虽然Python可能被粗略地分类为「脚本语言」(script language),但实际上一些大规模软件开发计划例如Zope、Mnet及BitTorrentGoogle也广泛地使用它。Python的支持者较喜欢称它为一种高阶动态编程语言,原因是「脚本语言」泛指仅作简单编程任务的语言,如shell script、JavaScript等只能处理简单任务的编程语言,並不能与Python相提并论。

Python本身被设计为可扩展的。并非所有的特性和功能都集成到语言核心。Python提供了丰富的API和工具,以便程序员能够轻松地使用C语言C++Cython来编写扩展模块。Python解释器本身也可以被集成到其它需要脚本语言的程序内。因此,很多人还把Python作为一种「胶水语言」(glue language)使用。使用Python将其他语言编写的程序进行集成和封装。Google内部的很多项目使用C++编写性能要求极高的部分,然后用Python调用相应的模块。[來源請求]很多游戏使用Python来处理游戏中繁多的逻辑。[來源請求]

Python的应用场景

Python经常被用于Web开发。比如,通过mod_wsgi模块,Apache可以运行用Python编写的Web程序。Python定义了WSGI标准应用接口来协调Http服务器与基于Python的Web程序之间的通信。一些Web框架,如Django,TurboGears,web2py,Zope等,可以让程序员轻松地开发和管理复杂的Web程序。此外,NumPy,SciPy,Matplotlib可以让Python程序员编写科学计算程序。PyQt是Python快速开发桌面应用程序的利器。

在很多操作系统里,Python是标准的系统组件。大多数Linux发行版以及NetBSD、OpenBSD和Mac OS X都集成了Python,可以在终端下直接运行Python。有一些Linux发行版的安装器使用Python语言编写,比如Ubuntu的Ubiquity安装器,Red Hat Linux和Fedora的Anaconda安装器。Gentoo Linux使用Python来编写它的Portage包管理系统。Python标准库包含了多个调用操作系统功能的库。通过pywin32这个第三方软件包,Python能够访问Windows的COM服务及其它Windows API。使用IronPython,Python程序能够直接调用.Net Framework。

Python经常被用来编写黑客工具。因为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!

注意,低于2.5版本的Python要去掉"Hello, world!"周围的括号。Python 3.x与Python 2.x的print函数语法是不一样的。

Python语法

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

縮進

Python開發者有意讓違反了縮進規則的程序不能通過編譯,以此來強制程序員養成良好的編程習慣。並且在Python語言裡,縮進而非花括號或者某種關鍵字,被用於表示語句塊的開始和結束。增加縮進表示語句塊的開始,而減少縮進則表示語句塊的結束。縮進成為了語法的一部分。例如if語句:

if age < 21:
    print("你不能買酒。")
    print("不過你能買口香糖。")
print("這句話處於if語句塊的外面。")

根據PEP的規定,必須使用4個空格來表示每級縮進。使用Tab字符和其它數目的空格雖然都可以編譯通過,但不符合編碼規範。

语句和控制流

  • if语句,当条件成立时执行语句块。经常与else,elif(相当于else if)配合使用。
  • for语句,遍历列表、字符串等迭代器,循环处理迭代器中的每个元素。
  • while语句,当条件为真时,循环执行语句块。
  • try语句。与except,finally配合使用处理在程序运行中出现的异常情况。
  • class语句。用于定义类型。
  • def语句。用于定义函数。
  • with语句。Python2.6以后定义的语法,在一个场景中运行语句块。比如,运行语句块前加锁,然后在语句块运行结束后释放它。
  • pass语句。表示此行为空,不执行任何操作。
  • assert语句。用于程序调试阶段时测试运行条件是否满足。
  • yield语句。在迭代器函数内使用,用于返回一个元素。自从Python 2.5版本以后。这个语句变成一个运算符。

表达式

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

  • Python使用and, or, not表示逻辑运算。
  • 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]

对象的方法

对象的方法是指绑定到对象的函数。调用对象方法的语法是instance.method(arguments)。它等价于调用Class.method(instance, arguments)。当定义对象方法时,必须显式地定义第一个参数为self,用于访问对象的内部数据。self相当于C++, Java里面的this变量。比如:

class Fish:
    def eat(self, food):
        if food is not None:
            self.hungry=False

类型

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定义求余运行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社区提供了大量的第三方模块,使用方式与标准库类似。它们的功能无所不包,覆盖科学计算、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[5]。相对于Python的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0在设计的时候就没有考虑向下兼容。许多针对早期Python版本设计的程序都无法在Python 3.0上正常运行。为了照顾现有程序,Python 2.6作为一个过渡版本,基本使用了Python 2.x的语法和,同时考虑了向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 3.0的变化主要在以下几个方面[8]

部分函数和语句的改变[9]

最引人注意的改变是print语句没有了,取而代之的是print函数;

字符串和字节:

类似Javastr类表示一个Unicode字符串,代替了早期版本的unicode类。而一堆字节则用类似b"abc"的语法创建,用bytes类表示;

其他变化:

详见參考文獻[8]

各种实现

Python是一门跨平台的脚本语言,Python规定了一个Python语法规则,实现了Python语法的解释程序就成为了Python的解释器

  • CPythonClassic Python,也就是原始的经典Python实现,需要区别于其他实现的时候才以CPython称呼;或解作C语言实现的Python)。这是最常用的Python版本。
  • Jython(原名JPythonJava语言实现的Python,现已正式发布)。Jython可以直接调用Java的各种函数库。
  • PyPy(使用Python语言寫的Python)
  • IronPython(面向.NETECMA CLI的Python实现)。IronPython能够直接调用.net平台的各种函数库。可以将Python程序编译成.net程序。
  • 周蟒(支持繁簡中文的Python语言)

集成开发环境

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

专门为Python设计的IDE软件:

有相应插件的通用IDE软件(使用难度往往较大):

另外,诸如EditPlusUltraEditPSPad等通用的程序员文本编辑器软件也能对Python代码文本作出一定解释,但是否够得上集成开发环境的水平,尚有待评估。

著名应用

從其它語言到Python

影響

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

外部链接

Python 3000相關連結

参考文献

  1. ^ "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日.
  2. ^ Python 3.14.0 beta 2 is here!. 2025年5月26日 [2025年5月27日] (英語). 
  3. ^ Guido van Rossum. Foreword for "Programming Python" (1st ed.). 1996/5/1 (英语). 
  4. ^ Przemyslaw Piotrowski, Build a Rapid Web Development Environment for Python Server Pages and Oracle, Oracle Technology Network, July 2006. Accessed October 21, 2008.
  5. ^ Python Software Foundation. Python 3.0b3 Release. 2008/8/20 [2008/8/30] (英语). 
  6. ^ Python Software Foundation. Conversion tool for Python 2.x code: 2to3. [2008/8/30] (英语). 
  7. ^ Python Software Foundation. Should I use Python 2 or Python 3 for my development activity?. 2010/9/14 (英语). 
  8. ^ 8.0 8.1 Guido van Rossum. What’s New in Python 3.0—Python v3.0b3 documentation. Python Software Foundation. [2008/8/30] (英语). 
  9. ^ Guido van Rossum. What’s New in Python 3.0—Python v3.0b3 documentation: Common Stumbling Blocks. Python Software Foundation. [2008/8/30] (英语). 

Template:Link FA Template:Link GA Template:Link GA