1.1 什么是python
Python 是一门优雅而健壮的编程语言,它继承了传统编译语言的强大性和通用性,同时也借鉴了简单脚本和解释语言的易用性。
范·罗萨姆期望的工具有一些是用于完成日常系统管理任务的,还希望能够访问Amoeba 分布式操作系统的系统调用。他也曾想过为Amoeba 开发专用语言,但创造一种通用的程序设计语言更加明智。
汇编语言是献给那些挣扎在机器代码中的人的礼物;
FORTRAN、 C 和 Pascal 语言,将计算提升到了崭新的高度,并开创了软件开发行业;
伴随着C 语言诞生了更多的像C++、Java 这样的现代编译语言;
强大的、可以进行系统调用的解释型脚本语言,例如Tcl、Perl 和Python。
这些语言都有高级的数据结构,这样就减少了以前“框架”开发时间:
像Python 中的列表(大小可变的数组)和字典(哈希表)就是内建于语言本身的;
在 C 语言中,对于混杂数组(Python 中的列表)和哈希表(Python 中的字典)还没有相应的标准库,所以它们经常被重复实现,并被复制到每个新项目中去;
C++使用标准模版库改进了这种情况,但是标准模版库是很难与Python 内建的列表和字典的简洁和易读相提并论的;
面向对象编程为数据和逻辑相分离的结构化和过程化编程添加了新的活力。
“可升级”这个术语最经常用于衡量硬件的负载,通常指为系统添加了新的硬件后带来的性能提升。我们试图用“可升级”来传达一种观念,这就是:Python 提供了基本的开发模块,你可以在它上面开发你的软件,而且当这些需要
扩展和增长时,Python 的可插入性和模块化架构则能使你的项目生机盎然和易于管理。
若你的项目中有大量的Python 代码,可以通过将其分离为多个文件或模块加以组织管理。而且你可以从一个模块中选取代码,而从另一个模块中读取属性。
而且对于所有模块,Python 的访问语法都是相同的。不管这个模块是Python 标准库中的还是你创造的,哪怕是你用其他语言写的扩展都没问ti!借助这些特点,你会感觉自己根据需要“扩展”了这门语言。
代码中的瓶颈,可能是在性能分析中总排在前面的那些热门或者一些特别强调性能的地方,可以作为 Python 扩展用 C 重写。需要重申的是,这些接口和纯Python 模块的接口是一模一样的,乃至代码和对象的访问方法也是如出一辙的。唯一不同的是,这些代码为性能带来了显著的提升。自然,这全部取决你的应用程序以及它对资源的需求情况。很多时候,使用编译型代码重写程序的瓶颈部分绝对是益处多多的,因为它能明显提升整体性能。
程序设计语言中的这种可扩展性使得工程师能够灵活附加或定制工具,缩短开发周期。虽然像 C、C++乃至 Java 等主流第三代语言(3GL)都拥有该特性,但是这么容易地使用 C 编写扩展确实是 Python 的优势。此外,还有像 PyRex 这样的工具,允许 C 和 Python 混合编程,使编写扩展更加轻而易举,因为它会把所有的代码都转换成 C 语言代码。
Python 的标准实现是使用 C 语言完成的(CPython),所以要使用 C 和 C++编写 Python 扩展;
Python 的 Java 实现称作 Jython,要使用 Java 编写其扩展;
IronPython,这是针对 .NET 或 Mono 平台的 C# 实现。你可以使用 C# 或者 VB.Net 扩展 IronPython;
因为Python 是用C 写的,又由于C 的可移植性,使得Python 可以运行在任何带有ANSI C 编译器的平台上。
尽管有一些针对不同平台开发的特有模块,但是在任何一个平台上用Python 开发的通用软件都可以稍事修改或者原封不动的在其他平台上运行。这种可移植性既适用于不同的架构,也适用于不同的操作系统。
Python 关键字少、结构简单、语法清晰。
Python 与其他语言显著的差异是,它没有其他语言通常用来访问变量、定义代码块和进行模式匹配的命令式符号;
Python 让其他人很快就能理解你写的代码,反之亦然;
Python 本身就是易于学习和阅读的,也不需要借助手册才能读懂自己的软件,所以python是易维护的;
程序员针对异常处理可以采取相应的措施,例如解决问ti、重定向程序流、执行清除或维护步骤、正常关闭应用程序、亦或干脆忽略掉。
Python 的健壮性对软件设计师和用户而言都是大有助益的。一旦某些错误处理不当,Python 也还能提供一些信息,作为某个错误结果而产生的堆栈追踪不仅可以描述错误的类型和位置,还能指出代码所在模块。
我们之前已经提到了Python 是多么的易学易读。但是,你或许要问了,BASIC 也是如此啊,Python 有什么出类拔萃的呢?
与那些封闭僵化的语言不同,Python 有许多面向其他系统的接口,它的功能足够强大,本身也足够强壮,所以完全可以使用 Python 开发整个系统的原型。
显然,传统的编译型语言也能实现同样的系统建模,但是Python 工程方面的简洁性让我们可以在同样的时间内游刃有余的完成相同的工作。
大家已经为Python 开发了为数众多的扩展库,所以无论你打算开发什么样的应用程序,都可能找到先行的前辈。你所要做的全部事情,就是来个“即插即用”!只要你能想得出来,Python 模块和包就能帮你实现。
Python 标准库是很完备的,如果你在其中找不到所需,那么第三方模块或包就会为你完成工作提供可能。
由于内存管理是由Python 解释器负责的,所以开发人员就可以从内存事务中解放出来。
Python 是一种解释型语言,这意味着开发过程中没有了编译这个环节。一般来说,由于不是以本地机器码运行,纯粹的解释型语言通常比编译型语言运行的慢。然而,类似于Java,Python实际上是字节编译的,其结果就是可以生成一种近似机器语言的中间形式。这不仅改善了Python的性能,还同时使它保持了解释型语言的优点。
Python 源文件通常用.py 扩展名。当源文件被解释器加载或者显式地进行字节码编译的时候会被编译成字节码。由于调用解释器的方式不同,源文件会被编译成带有.pyc 或.pyo 扩展名的文件。
python应用平台:
所有 Unix 衍生系统(Linux,MacOS X,Solaris,FreeBSD 等等)
Win32 家族(Windows NT,2000,XP 等等)
早期平台:MacOS 8/9,Windows 3.x,DOS,OS/2,AIX
掌上平台(掌上电脑/移动电话):Nokia Series 60/SymbianOS,Windows CE/PocketPC,Sharp Zaurus/arm-linux,PalmOS
游戏控制台:Sony PS2,PSP,Nintendo GameCube
实时平台:VxWorks,QNX
其他实现版本:Jython,IronPython,stackless
其他
Python 大部分的最近版本都只是针对“三巨头”的。实际上,最新的Linux 和MacOS X 版本都已经安装好了Python。
Unix 衍生系统(Linux,MacOS X,Solaris,FreeBSD 等等):
输入python命令查看版本;
Windows/DOS 系统:
从https://www.python.org/或是http://corepython.com/网站下载msi 文件,之后执行该文件安装Python。
如果你打算开发 Win32 程序,例如使用 COM或 MFC,或者需要 Win32 库,强烈建议下载并安装 Python 的 Windows 扩展。之后你就可以通过DOS 命令行窗口或者 IDLE 和 Pythonwin 中的一个来运行Python 了
IDLE 是 Python 缺省的 IDE(集成开发环境);
Pythonwin 则来自Windows 扩展模块;
自己动手编译Python:
对绝大多数其它平台 , 下载 .tgz 文件, 解压缩这些文件, 然后执行以下操作以编译
Python:
1. ./configure
2. make
3. make install
Python 通常被安装在固定的位置,所以你很容易就能找到。如今,在系统上安装多种版本的Python 已经是司空见惯的事情了。虽然容易找到二进制执行文件,你还是要设置好库文件的安装位置。
在Unix 中,可执行文件通常会将Python 安装到/usr/local/bin 子目录下,而库文件则通常安装在/usr/local/lib/python2.x 子目录下,。
MacOS X系统中,Python 则安装在/sw/bin 以及/或者 /usr/local/bin 子目录下。而库文件则在/sw/lib,/usr/local/lib, 以及/或者 /Library/Frameworks/Python.framework/Versions 子目录下。
在Windows 中,默认的安装地址是C:\Python2x。避免将其安装在C:\Program Files目录下。DOS 是不支持“Program Files”这样的长文件名的,它通常会被用“Progra~1”这个别名代替。这有可能给程序运行带来一些麻烦。
有三种不同的办法来启动Python。
最简单:交互式的启动解释器,每次输入一行Python 代码来执行。
运行Python 脚本。这样会调用相关的脚本解释器。
用集成开发环境中的图形用户界面运行Python。集成开发环境通常整合了其他的工具,例如集成的调试器、文本编辑器,而且支持各种像 CVS 这样的源代码版本控制工具。
在命令行上启动解释器,你马上就可以开始编写Python 代码。在Unix, DOS 或其它提供命令行解释器或 shell 窗口的系统中,都可以这么做。
Unix 衍生系统(Linux,MacOS X,Solaris,FreeBSD 等等)
须将Python 所在路径添加到系统搜索路径之中, 否则就必须输入Python 的完整路径名才可以启动Python。我们建议把Python(python 执行文件,或Jython 执行文件)添加到你的系统搜索路径之中。
要将Python 添加到搜索路径中, 只需要检查你的登录启动脚本, 找到以 set path 或PATH= 指令开始,后面跟着一串目录的那行, 然后添加解释器的完整路径。所有事情都做完之后, 更新一下shell 路径变量。现在在 Unix 提示符处键入 python(或jython)就可以启动解释器了, 如下所示:
Windoes/DOS 环境
为了把 Python 添加到搜索路径中,你需要编辑 C:\autoexec.bat 文件并将完整的Python 安装路径添加其中。这通常是C:\Python 或 C:\Program Files \Python ( 或是“Program Files”在DOS 下的简写名字C:\Progra~1\Python)。
C:\> python
当从命令行启动Python 的时候,可以给解释器一些选项。这里有部分选项可供选择:
-d 提供调试输出
-O 生成优化的字节码(生成 .pyo 文件)
-S 不导入 site 模块以在启动时查找Python 路径
-v 冗余输出(导入语句详细追踪)
-m mod 将一个模块以脚本形式运行
-Q opt 除法选项(参阅文档)
-c cmd 运行以命令行字符串形式提交的 Python 脚本
file 从给定的文件运行Python 脚本(参阅后文)
Unix 衍生系统(Linux,MacOS X,Solaris,FreeBSD 等等)
(1)不管哪种Unix 平台, Python 脚本在命令行上通过解释器执行:
$ python script.py
(2)Unix 平台还可以在不明确指定Python 解释器的情况下,自动执行Python 解释器。在脚本的第一行使用shell 魔术字符串(“sh-bang”) :
#!/usr/local/bin/python
在 #!之后写上Python 解释器的完整路径。 错误的路径将导致出现类似于”找不到命令“的错误信息;
另外,许多Unix 系统有一个命令叫 env, 位于 /bin 或 /usr/bin 中。它会帮你在系统搜索路径中找到 python 解释器。 如果你的系统拥有 env, 启动行可以改为这样:
#!/usr/bin/env python
当你不能确定Python 的具体路径或者Python 的路径经常变化时(但不能挪到系统搜索路径之外), env 就非常有用。当你在你的脚本首行书写了合适的启动指令之后, 这个脚本就能够直接执行。当调用脚本时, 会先载入Python 解释器, 然后运行你的脚本。我们刚才提到,这样就不必显式的调用 Python 解释器了, 而你只需要键入脚本的文件名:
$ script.py
注意, 在键入文件名之前, 必须先将这个文件的属性设置为可以执行(自己拥有rwx权限)。
Windows/DOS 环境
DOS 命令窗口不支持自动执行机制, 通过输入文件名执行脚本: 这就是“文件类型”接口。这个接口允许Windows 根据文件扩展名识别文件类型, 从而调用相应的程序来处理这个文件。
eg:你安装了带有PythonWin 的Python, 双击一个带有 .py 扩展名的Python 脚本就会自动调用 Python 或PythonWin IDE(如果你安装了的话)来执行你的脚本。 运行以下命令就和双击它的效果一样:
C:\> script.py
这样无论是基于 Unix 操作系统还是 Win32 操作系统都可以无需在命令行指定 Python解释器的情况下运行脚本。
你也可以从图形用户界面环境运行Python,你所需要的是支持 Python 的 GUI 程序。集成开发环境不仅仅是图形接口,通常会带有源代码编辑器、追踪和排错工具。
Unix 衍生系统(Linux,MacOS X,Solaris,FreeBSD 等等)
IDLE 可以说是Unix 平台下Python 的第一个集成开发环境(IDE)。IDLE 基于Tkinter, 要运行它的话你的系统中必须先安装 Tcl/Tk . 目前的Python 发行版都带有一个迷你版的 Tcl/Tk 库, 因此就不再需要 Tcl/Tk 的完整安装了。
如果你安装好了Python,或者你有一个 Python RPM 包,可是它并没有包含 IDLE 或 Tkinter,那在你尝试 IDLE 之前, 必须先将这两样东西安装好(如果你需要,确实有一个独立的Tkinter RPM 包可以供你下载, 以便和Python 一起工作)。如果你是自己编译的Python, 而且有Tk 库可用, 那Tkinter 会自动编译进Python, 而且Tkinter 和IDLE也会随Python 的安装而安装。
如果你打算运行 IDLE, 就必须找到你的标准库安装位置:/usr/local/lib/python2.x/idlelib/idle.py. 如果你是自己编译Python, 你会在/usr/local/bin 目录中发现一个名为idle 的脚本, 这样你就可以在shell 命令行中直接运行idle.
MacOS X 是一个非常类似Unix(基于mach 内核,BSD 服务)的操作系统。 在MacOS X 下,Python 可以用传统的Unix 编译工具编译。MacOS X发行版自带一个编译好的Python 解释器, 不过并没有任何一个面向Mac 的特殊工具。(比如GNU readline, IDE 等等)。 当然也没有Tkinter 和IDLE。你可能会打算自己下载并编译一个出来, 不过要小心一点, 有时你新安装的Python 会与Apple 预装的版本混淆在一起。认真一点没有坏处。你也可以通过 Fink/Finkcommander 和DarwinPorts 得到MacOS X 版的Python:
http://fink.sourceforge.net/
http://darwinports.org
如果要得到最新Mac 版Python 的组建和信息, 请访问:
http://undefined.org/python
http://pythonmac.org/packages
另一个选择是从Python 站点下载 MacOS X 的通用二进制包。这个磁盘映像文件(DMG)要求操作系统版本至少为10.3.9, 它适用于基于PowerPC 和Intel 硬件的Mac 机器。
Windows 环境
PythonWin 是 Python 的第一个 Windows 接口,并且还是个带有图形用户界面的集成开发环境。PythonWin 发行版本中包含Windows API 和COM 扩展。PythonWin 本身是针对MFC 库编写的,它可以作为开发环境来开发你自己的Windows 应用程序。你可以从下面给出的网页中下载并安装它。
PythonWin 通常被安装在和Python 相同的目录中, 在它自己的安装目录C:\Python2x\Lib\site-packages\pythonwin 中有可执行的启动文件pythonwin.exe 。
PythonWin 拥有一个带有颜色显示的编辑器、一个新的增强版排错器、交互shell 窗口、COM 扩展和更多的有用特性。
你可以在网站中找到更多的关于PythonWin和Python 针对Windowns 的扩展(也被称作“win32all”):
http://starship.python.net/crew/mhammond/win32/
http://sourceforge.net/projects/pywin32/
http://starship.python.net/crew/mhammond/win32/
http://sourceforge.net/projects/pywin32/
IDLE 也有Windows 平台版本,这是由Tcl/ Tk 和Python/ Tkinter 的跨平台性特点决定的,它看上去很像Unix 平台下的版本。
在Windows 平台下,IDLE 可以在Python 编译器通常所在的目录C:\Python2x 下的子目录Lib\idlelib 中找到。从DOS 命令行窗口中启动IDLE,请调用idle.py。你也可以从Windows环境中调用idle.py,但是会启动一个不必要的DOS 窗口。取而代之的方法是双击idle.pyw,以.pyw 作为扩展名的文件不会通过打开DOS 命令行窗口来运行脚本。事实上你可以在桌面上创建一个到C:\Python2x\Lib\idlelib\idle.pyw 的快捷方式,然后双击启动就可以了,简单吧!
很多的软件开发专家事实上会选择在他们喜欢的文本编辑器中编写代码,比如vi(m) 或者emacs。除了这些和上面提到到的集成开发环境,还有大量的开源和商业的集成开发环境,下面是个简短的列表:
开源
IDLE (在 Python 发行版中自带)
http://python.org/idle/
PythonWin + Win32 Extensions
http://starship.python.net/crew/skippy/win32
IPython (增强的交互式 Python)
http://ipython.scipy.org
IDE Studio (IDLE 以及更多)
http://starship.python.net/crew/mike/Idle
Eclipse
http://pydev.sf.net
http://eclipse.org/
商业
WingWare 开发的 WingIDE Python 集成开发环境
http://wingware.com/
ActiveState 开发的Komodo 集成开发环境
http://activestate.com/Products/Komodo
通用集成开发环境列表
http://wiki.python.org/moin/IntegratedDevelopmentEnvironments
核心提示:运行本书中的代码实例
当你运行它们的时候,住这些代码是设计用来从命令行(DOS 命令行窗口或Unix shell)或者集成开发环境执行的。如果你在使用Win32 系统,双击Python 程序会打开DOS 窗口,但是在脚本执行完毕后就会关闭,所以你可能看不到输出结果。如果你遇到了这种情况,就直接打开DOS 窗口,从命令行中运行相关的脚本,或者在集成开发环境中执行脚本。另外一种办法,就是在脚本的最后一行后面添加raw_input()语句,这样就可以保持窗口开着,直到你按下回车键才关闭。
1.6 Python 文档
Python 网站查看在线文档。如果你没上网,并且使用的是Win32 系统,那么在C:\Python2x\Doc\目录下会找到一个名为Python2x.chm 的离线帮助文档。
其他的离线文档包括PDF 和PostScript (PS)文件。最后,如果你下载了Python 发行版,你会得到 LaTeX 格式的源文件。
在本书的网站中,我们创建了一个包括绝大多数Python 版本的文档,只要访问http://corepython.com,单击左侧的“Documentation”就可以了。
Python 提供了很多其他语言拥有的特性。另外一个原因就是Python 本身也是由诸多其他语言发展而来的,这包括ABC、Modula-3、C、C++、Algol-68、SmallTalk、Unix shell 和其他的脚本语言等等。Python 就是”浓缩的精华“
然而,因为Python 是一门解释型语言,大多数的比较是在Perl、Java、Tcl,还有JavaScript 之间进行的。
(1)Perl
Perl 是另外一种脚本语言,远远超越了标准的shell 脚本。像Python 一样,Perl 赋予了你所有编程语言的功能特性,还有系统调用能力。Perl 最大的优势在于它的字符串模式匹配能力,其提供了一个十分强大的正则表达式匹配引擎。这使得Perl 实际上成为了一种用于过滤、识别和抽取字符串文本的语言,而且它一直是开发Web 服务器端CGI(common gateway interface,通用网关接口)网络程序的最流行的语言。
Python 的正则表达式引擎很大程度上是基于Perl 的。然而,Perl 语言的晦涩和对符号语法的过度使用,让解读变得很困难。
(2)Java
Python 也经常被拿来和Java 作对比,因为他们都有类似的面向对象的特性和语法。Python的简洁比纯粹的使用Java 提供了更加快速的开发环境。在Python 和Java 的关系上,一个非常重大的革命就是Jython 的开发。Jython 是一个完全用Java 开发的Python 解释器,现在可以在只有Java 虚拟机的环境中运行Python 程序。
在Jython 的脚本环境中,你可以熟练地处理Java 对象,Java可以和Python 对象进行交互,你可以访问自己的Java 标准类库,就如同Java 一直是Python环境的一部分一样。
(3)Ruby
Python 是多种编程范式的混合,它不像Ruby 那样完全的面向对象,也没有像Smalltalk那样的块,而这正是Ruby 最引人注目的特性。Python 有一个字节码解释器,而Ruby 没有。Python更加易读,而Ruby 事实上可以看作是面向对象的Perl。相对于Rails(Ruby的框架),Python 有几个自己的Web 应用框架,比如Django 和 Turbogears 这两个项目。
(4)Tcl
Tcl 是最易于使用的脚本语言之一, 程序员很容易像访问系统调用一样对Tcl 语言进行扩展。Tcl 直到今天仍然很流行, 与Python相比, 它或许有更多局限性(主要是因为它有限的几种数据类型), 不过它也拥有和Python一样的通过扩展超越其原始设计的能力。更重要的是, Tcl 通常总是和它的图形工具包Tk 一起工作, 一起协同开发图形用户界面应用程序。因为它非常流行, 所以Tk 已经被移植到Perl(Perl/Tk)和Python(Tkinter)中.
与Tcl 相比, 因为Python 有类, 模块及包的机制,所以写起大程序来更加得心应手。
Python 有一点点函数化编程结构,这使得它有点类似List 或Scheme 语言。尽管Python 不是传统的函数化编程语言, 但它持续的从Lisp 和haskell语言中借用一些有价值的特性。举例来说, 列表解析就是一个广受欢迎的来自Haskell 世界的特性, 而Lisp 程序员在遇到 lambda, map, filter 和reduce 时也会感到异常亲切。
(5)JavaScript
JavaScript 是另外一种非常类似Python 的面向对象脚本语言。聪慧的读者会注意到JavaScript 是基于原型系统的, 而Python 则遵循传统的面向对象系统, 这使得二者的类和对象有一些差异。
下面列出了有关Python 与其它语言进行比较的网页:
Perl
http://www2.linuxjournal.com/article/3882
http://llama.med.harvard.edu/~fgibbons/PerlPythonPhrasebook.html
http://aplawrence.com/Unixart/pythonvsperl.html
http://pleac.sf.net/pleac_python
http://www.garshol.priv.no/download/text/perl.html
Java
http://dirtsimple.org/2004/12/python-is-not-java.html
http://twistedmatrix.com/users/glyph/rant/python-vs-java.html
http://netpub.cstudies.ubc.ca/oleary/python/python_java_comparison.php
Lisp
http://strout.net/python/pythonvslisp.html http://norvig.com/python-lisp.html
Ruby
http://blog.ianbicking.org/ruby-python-power.html
http://www.rexx.com/~oinkoink/Ruby_v_Python.html
http://dev.rubycentral.com/faq/rubyfaq-2.html
Perl, C++
http://strombergers.com/python/
Perl, Java, C++
http://furryland.org/~mikec/bench/
C++, Java, Ruby
http://dmh2000.com/cjpr
Perl, Java, PHP, Tcl
http://www-128.ibm.com/developerworks/linux/library/l-python101.html
http://www-128.ibm.com/developerworks/linux/library/l-script-survey/
C, C++, Java, Perl, Rexx, Tcl
http://www.ubka.uni-karlsruhe.de/indexer-vvv/ira/2000/5
你可以在下面的网址中看到更多Python 与其他的语言的比较:
http://www.python.org/doc/Comparisons.html
标准版本的Python 是用C 来编译的, 又叫CPython. 除此之外, 还有一些其它的Python实现。
http://python.org/dev/implementations.html
Java
有Python 解释器是完全由Java 写成的, 名为 Jython。 尽管两种解释器之间存在一些细微的差别, 但是它们非常接近, 而且启动环境也完全相同。那Jython 又有哪些优势呢?
只要有 Java 虚拟机, 就能运行Jython
拥有访问 Java 包与类库的能力
为 Java 开发环境提供了脚本引擎
能够很容易的测试 Java 类库
提供访问 Java 原生异常处理的能力
继承了 JavaBeans 特性和内省能力
鼓励 Python 到Java 的开发(反之亦然)
GUI 开发人员可以访问 Java 的 AWT/Swing 库
利用了 Java 原生垃圾收集器(CPython 未实现此功能)
对 Jython 进行详细论述, 超出了本文的范围。 不过网上有非常多的Jython 信息。Jython目前仍然在不断开发之中, 不时会增加新的特性。你可以通过访问Jython 的网站得到更多有用的信息:
http://jython.org
.NET/Mono
现在已经有一个名为 IronPython 的Python 实现. 它是用 C# 语言完成的. 它适用的环境是 .NET 和 Mono. 你可以在一个 .NET 应用程序中整合 IronPython 解释器来访问 .NET对象. IronPython 的扩展可以用 C#或VB.NET 语言编写. 除此之外, 还有一种名为 Boo的 .NET/Mono 语言. 你可以在下面的网址获得更多关于 IronPython 和 Boo 语言的信息.
http://codeplex.com/Wiki/View.aspx?ProjectName=IronPython
http://boo.codehaus.org/
Stackless
CPython 的一个局限就是每个Python 函数调用都会产生一个C 函数调用. (从计算机科学的角度来说, 我们在讨论栈帧). 这意味着同时产生的函数调用是有限制的, 因此Python 难以实现用户级的线程库和复杂递归应用. 一旦超越这个限制, 程序就会崩溃. 你可以通过使用一个 “stackless” 的 Python 实现来突破这个限制, 一个 C 栈帧可以拥有任意数量的 Python 栈帧. 这样你就能够拥有几乎无穷的函数调用, 并能支持巨大数量的线程. 这个Python 实现的名字就叫…….Stackless
Stackless 唯一的问题就是它要对现有的 CPython 解释器做重大修改. 所以它几乎是一个独立的分支. 另一个名为 Greenlets 的项目也支持微线程, 它是一个标准的C 扩展, 因此不需要对标准Python 解释器做任何修改. 通过以下网址你能了解更多信息:
http://stackless.com
http://codespeak.net/py/current/doc/greenlet.html