常見Python問答集
****************


常見資訊
========


什麼是Python?
-------------

Python 是一种解释性、交互式、面向对象的编程语言。 它包含了模块、异常、
动态类型、非常高层级的动态数据类型以及类的概念。 Python结合了超强的功
能和极清晰的语法。 它带有许多系统调用和库以及各种窗口系统的接口，并且
可以用 C 或 C ++ 来进行扩展。 它还可用作需要可编程接口的应用程序的扩展
语言。 最后，Python 还是可移植的：它可以在许多 Unix 变种、Mac 以及
Windows 2000 以上的操作系统中运行。

要了解更多详情，请先查看 Python 教學。 Python 新手指南 提供了学习
Python 的其他入门教程及资源的链接。


什麼是Python軟體基金會?
-----------------------

Python軟體基金會是一個獨立非營利性組織，並且擁有Python版本2.1 與更新的
版本版權。Python軟體基金會的任務在於精進相關於Python 程式語言撰寫於開
放原始碼技術，而且宣傳使用Python 。Python軟體基金會網址
:https://www.python.org/psf/

在美國捐款給Python軟體基金會是免稅的，如果你使用Python而且發現很好用，
請貢獻捐款到Python軟體基金會捐款頁面
<https://www.python.org/psf/donations/>


當使用Python時有任何版權限制嗎?
-------------------------------

你可以任意使用源码，只要你保留版权信息并在你基于 Python 的产品文档中显
示该版权信息。 如果你遵守此版权规则，就可以将 Python 用于商业领域，以
源码或二进制码的形式（不论是否经过修改）销售 Python 的副本，或是以某种
形式包含了 Python 的产品。 当然，我们仍然希望获知所有对 Python 的商业
使用。

請看Python軟體基金會的授權頁面<https://www.python.org/psf/license/>有
更完整的授權說明

Python 的徽标是注册商标，在某些情况下需要获得允许方可使用。 请参阅 商
标使用政策 了解详情。


為什麼Python被創造出來
----------------------

Guido van Rossum寫下這篇"非常長"的簡述說明Python的由來

   我在 CWI 的 ABC 部门时在实现解释型语言方面积累了丰富经验，通过与这
   个部门成员的协同工作，我学到了大量有关语言设计的知识。 这是许多
   Python 特性的最初来源，包括使用缩进来组织语句以及包含非常高层级的数
   据结构（虽然在 Python 中具体的实现细节完全不同）。

   我对 ABC 语言有过许多抱怨，但同时也很喜欢它的许多特性。 没有可能通
   过扩展 ABC 语言（或它的实现）来弥补我的不满 —— 实际上缺乏可扩展性就
   是它最大的问题之一。 我也有一些使用 Modula-2+ 的经验，并曾与
   Modula-3 的设计者进行交流，还阅读了 Modula-3 的报告。 Modula-3 是
   Python 中异常机制所用语法和语义，以及其他一些语言特性的最初来源。

   我还曾在 CWI 的 Amoeba 分布式操作系统部门工作。 当时我们需要有一种
   比编写 C 程序或 Bash 脚本更好的方式来进行系统管理，因为 Amoeba 有它
   自己的系统调用接口，并且无法方便地通过 Bash 来访问。 我在 Amoeba 中
   处理错误的经验令我深刻地意识到异常处理在编程语言特性当中的重要地位
   。

   我发现，某种具有 ABC 式的语法而又能访问 Amoeba 系统调用的脚本语言将
   可满足需求。 我意识到编写一种 Amoeba 专属的语言是愚蠢的，所以我决定
   编写一种具有全面可扩展性的语言。

   在 1989 年的圣诞假期中，我手头的时间非常充裕，因此我决定开始尝试一
   下。 在接下来的一年里，虽然我仍然主要用我的业余时间来做这件事，但
   Python 在 Amoeba 项目中的使用获得了很大的成功，来自同事的反馈让我得
   以增加了许多早期的改进。

   到 1991 年 2 月，经过一年多的开发，我决定将其发布到 USENET。 之后的
   事情就都可以在 "Misc/HISTORY" 文件里面看了。


什麼是Python擅長的事情
----------------------

Python是高階語言及一般任何用途都可以使用的語言，可以用來解決不同的問題

该语言附带一个庞大的标准库，涵盖了字符串处理（正则表达式，Unicode，比
较文件间的差异等），因特网协议（HTTP，FTP，SMTP，XML-RPC，POP，IMAP，
CGI 编程等），软件工程（单元测试，日志记录，性能分析，Python 代码解析
等），以及操作系统接口（系统调用，文件系统，TCP/IP 套接字等）。 请查看
Python 標準函式庫 (Standard Library) 的目录以了解所有可用的内容。 此外
还可以获取到各种各样的第三方扩展。 请访问 Python 包索引 来查找你感兴趣
的软件包。


Python 版本的编号形式是怎样的？
-------------------------------

Python 版本的编号形式是 A.B.C 或 A.B。 A 称为大版本号 —— 它仅在对语言
特性进行非常重大改变时才会递增。 B 称为小版本号，它会在语言特性发生较
小改变时递增。 C 称为微版本号 —— 它会在每次发布问题修正时递增。 请参阅
**PEP 6** 了解有关问题修正发布版的详情。

发布版本并非都是问题修正版本。 在新的主要发布版本开发过程中，还会发布
一系列的开发版，它们以 alpha (a), beta (b) 或 release candidate (rc)
来标示。 其中 alpha 版是早期发布的测试版，它的接口并未最终确定；在两个
alpha 发布版本间出现接口的改变并不意外。 而 beta 版更为稳定，它会保留
现有的接口，但也可能增加新的模块，release candidate 版则会保持冻结状态
不会再进行改变，除非有重大问题需要修正。

以上 alpha, beta 和 release candidate 版本会附加一个后缀。 用于 alpha
版本的后缀是带有一个小数字 N 的 “aN”，beta 版本的后缀是带有一个小数字
N 的“bN”，release candidate 版本的后缀是带有一个小数字 N 的“cN”。 换句
话说，所有标记为 2.0aN 的版本都早于标记为 2.0bN 的版本，后者又都早于标
记为 2.0cN 的版本，而 *这些版本* 全都早于 2.0。

你还可能看到带有“+”后缀的版本号，例如“2.2+”。 这表示未发布版本，直接基
于 CPython 开发代码仓库构建。 在实际操作中，当一个小版本最终发布后，未
发布版本号会递增到下一个小版本号，成为“a0”版本，例如“2.4a0”。

另请参阅 "sys.version", "sys.hexversion" 以及 "sys.version_info" 的文
档。


我如何拿到Python的原始碼
------------------------

最新的 Python 发布版源代码总能从 python.org 获取，下载页链接为
https://www.python.org/downloads/。 最新的开发版源代码可以在
https://github.com/python/cpython/ 获取。

发布版源代码是一个以 gzip 压缩的 tar 文件，其中包含完整的 C 源代码、
Sphinx 格式的文档、Python 库模块、示例程序以及一些有用的自由分发软件。
该源代码将可在大多数 UNIX 类平台上直接编译并运行。

请参阅 Python 开发者指南的初步上手部分 了解有关获取源代码并进行编译的
更多信息。


如何取得Python的相關文件
------------------------

当前的 Python 稳定版本的标准文档可在 https://docs.python.org/3/ 查看。
也可在 https://docs.python.org/3/download.html 获取PDF、纯文本以及可下
载的 HTML 版本。

文档以 reStructuredText 格式撰写，并使用 Sphinx 文档工具 生成。 文档的
reStructuredText 源文件是 Python 源代码发布版的一部分。


我從來沒寫過程式，有沒有Python的教學
------------------------------------

有许多可选择的教程和书籍。 标准文档中也包含有 Python 教學。

请参阅 新手指南 以获取针对 Python 编程初学者的信息，包括教程的清单。


有沒有新手的群組或是郵件群組討論Python
--------------------------------------

有一个新闻组 *comp.lang.python* 和一个邮件列表 python-list。 新闻组和
邮件列表是彼此互通的 —— 如果你可以阅读新闻就不必再订阅邮件列表。
*comp.lang.python* 的流量很大，每天会收到数以百计的发帖，Usenet 使用者
通常更擅长处理这样大的流量。

有关新软件发布和活动的公告可以在 comp.lang.python.announce 中找到，这
是个严格管理的低流量列表，每天会收到五个左右的发帖。 可以在 Python 公
告邮件列表 页面进行订阅。

有关其他邮件列表和新闻组的更多信息可以在
https://www.python.org/community/lists/ 找到。


我应如何获取 Python 的公开测试版本？
------------------------------------

可以从 https://www.python.org/downloads/ 下载 alpha 和 beta 发布版。
所有发布版都会在 comp.lang.python 和 comp.lang.python.announce 新闻组
以及 Python 主页 https://www.python.org/ 上进行公告；并会推送到 RSS 新
闻源。

你还可以通过 Git 访问 Python 的开发版。 请参阅 Python 开发者指南 了解
详情。


我应如何为 Python 提交错误报告和补丁？
--------------------------------------

要报告错误或提交补丁，请使用安装于 https://bugs.python.org/ 上的
Roundup。

你必须拥有一个 Roundup 账号才能报告错误；这样我们就可以在有后续问题时
与你联系。 这也使得 Roundup 能在我们处理所报告的错误时向你发送更新消息
。 如果你之前使用过 SourceForge 向 Python 报告错误，你可以通过 Roundup
的 密码重置操作 来获取你的 Roundup 密码。

有关 Python 开发流程的更多信息，请参阅 Python 开发者指南。


是否有任何公开发表的 Python 相关文章可以供我参考引用？
------------------------------------------------------

可能作为参考文献的最好方式还是引用你喜欢的 Python 相关书籍。

最早討論Python的文章在1991年，但現在來看已經有點過時

   Guido van Rossum 与 Jelke de Boer, "使用 Python 编程语言交互式地测
   试远程服务器", CWI 季刊, 第 4 卷, 第 4 期 (1991 年 12 月), 阿姆斯特
   丹, 第 283--303 页。


有沒有關於Python的書
--------------------

是的已經有很多書出版，可以參考這個連結的參考書目
https://wiki.python.org/moin/PythonBooks

你也可以上網搜尋網路書店關鍵字為"Python"，但不要使用"Monty Python"當作
關鍵字。或者可以搜尋"Python"和"語言"


www.python.org 這個非營利組織位於哪裡
-------------------------------------

Python 项目的基础架构分布于世界各地并由 Python 基础架构团队负责管理。
详情请访问 这里。


為什麼要取名為Python
--------------------

在着手编写 Python 实现的时候，Guido van Rossum 同时还阅读了刚出版的
"Monty Python 的飞行马戏团" 剧本，这是一部自 1970 年代开始播出的 BBC
系列喜剧。 Van Rossum 觉得他需要选择一个简短、独特而又略显神秘的名字，
于是他决定将这个新语言命名为 Python。


我需要喜歡蒙提·派森的飛行馬戲團這個節目嗎
-----------------------------------------

不需要，但它有幫助 :)


Python在真實世界
================


Python穩定性如何
----------------

非常穩定。自從1991年開始大約每隔6到18個月會釋出更新版，而且看起來會繼
續更新下去。現在大約18個月會有主要的更新

开发者也会推出旧版本的“问题修正”发布版，因此现有发布版的稳定性还会逐步
提升。 问题修正发布版会以版本号第三部分的数字来标示（例如 3.5.3, 3.6.2
），用于稳定性的管理；只有对已知问题的修正会包含在问题修正发布版中，同
一系列的问题修正发布版中的接口确定将会始终保持一致。

最新的稳定版本总是可以在 Python 下载页面 上找到。有两个生产环境可用的
Python 版本： 2.x 和 3.x。 推荐的版本是 3.x，大多数广泛使用的库都支持
它。 虽然 2.x 仍然被广泛使用，但它 在 2020 年 1 月 1 日之后将不再维护
。


有多少人使用Python
------------------

大約有超過一萬個使用者，實際上有多少人是很難準確的估算

Python 可以免费下载，因此并不存在销量数据，此外它也可以从许多不同网站
获取，并且包含于许多 Linux 发行版之中，因此下载量统计同样无法完全说明
问题。

comp.lang.python 新闻组非常活跃，但不是所有 Python 用户都会在新闻组发
帖，许多人甚至不会阅读新闻组。


有沒有任何重要的案子使用Python完成開發
--------------------------------------

请访问 https://www.python.org/about/success 查看使用了 Python 的项目列
表。 阅览 历次 Python 会议 的日程纪要可以看到许多不同公司和组织所做的
贡献。

高水准的 Python 项目包括 Mailman 邮件列表管理器 和 Zope 应用服务器。
多个 Linux 发行版，其中最著名的有 Red Hat 均已使用 Python 来编写部分或
全部的安装程序和系统管理软件。 在内部使用 Python 的大公司包括了
Google, Yahoo 以及 Lucasfilm 等。


對於程式開發者Python對於未來有什麼期待
--------------------------------------

请访问 https://www.python.org/dev/peps/ 查看 Python 增强提议（PEP）。
PEP  是为 Python 加入某种新特性的提议进行描述的设计文档，其中会提供简
明的技术规格说明与基本原理。 可以查找标题为“Python X.Y Release
Schedule”的 PEP，其中 X.Y 是某个尚未公开发布的版本。

新版本的开发会在 python-dev 邮件列表 中进行讨论。


提议对 Python 加入不兼容的更改是否合理？
----------------------------------------

通常来说是不合理的。 世界上已存在的 Python 代码数以亿计，因此，任何对
该语言的更改即便仅会使得现有程序中极少的一部分失效也是难以令人接受的。
就算你可以提供一个转换程序，也仍然存在需要更新全部文档的问题；另外还有
大量已出版的 Python 书籍，我们不希望让它们在一瞬间全部变成废纸。

如果必须更改某个特性，则应该提供渐进式的升级路径。 **PEP 5** 描述了引
入向后不兼容的更改所需遵循的流程，以尽可能减少对用户的干扰。


Python對於入門的程式設計者而言是否為好的程式語言
------------------------------------------------

是的

从过程式、静态类型的编程语言例如 Pascal, C 或者 C++ 以及 Java 的某一子
集开始引导学生入门仍然是常见的做法。 但以  Python 作为第一种编程语言进
行学习对学生可能更有利。Python 具有非常简单和一致的语法和庞大的标准库
，而且最重要的是，在编程入门教学中使用 Python 可以让学生专注于更重要的
编程技能，例如问题分解与数据类型设计。 使用 Python，可以快速向学生介绍
基本概念例如循环与过程等。 他们甚至有可能在第一次课里就开始接触用户自
定义对象。

对于之前从未接触过编程的学生来说，使用静态类型语言会感觉不够自然。 这
会给学生带来必须掌握的额外复杂性，并减慢教学的进度。 学生需要尝试像计
算机一样思考，分解问题，设计一致的接口并封装数据。 虽然从长远来看，学
习和使用一种静态类型语言是很重要的，但这并不是最适宜在学生的第一次编程
课上就进行探讨的主题。

还有许多其他方面的特点使得 Python 成为很好的入门语言。 像 Java 一样，
Python 拥有一个庞大的标准库，因此可以在课程非常早期的阶段就给学生布置
一些 *实用* 的编程项目。 编程作业不必仅限于标准四则运算和账目检查程序
。 通过使用标准库，学生可以在学习编程基础知识的同时开发真正的应用，从
而获得更大的满足感。 使用标准库还能使学生了解代码重用的概念。 而像
PyGame 这样的第三方模块同样有助于扩大学生的接触领域。

Python 的解释器使学生能够在编程时测试语言特性。 他们可以在一个窗口中输
入程序源代码的同时开启一个解释器运行窗口。 如果他们不记得列表有哪些方
法，他们这以这样做:

   >>> L = []
   >>> dir(L) 
   ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
   '__dir__', '__doc__', '__eq__', '__format__', '__ge__',
   '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__',
   '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__',
   '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
   '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__',
   '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear',
   'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove',
   'reverse', 'sort']
   >>> [d for d in dir(L) if '__' not in d]
   ['append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

   >>> help(L.append)
   Help on built-in function append:

   append(...)
       L.append(object) -> None -- append object to end

   >>> L.append(1)
   >>> L
   [1]

通过使用解释器，学生编写程序时参考文档总是能伴随在他们身边。

Python 还拥有很好的 IDE。 IDLE 是一个跨平台的 Python IDE，它基于
Tkinter 库，使用 Python 语言编写。  PythonWin 是一个 Windows 专属的
IDE。 Emacs 用户将高兴地了解到 Emacs 具有非常好的 Python 模式。  所有
这些编程环境都提供语法高亮，自动缩进以及在编写代码时使用交互式解释器等
功能。 请访问 Python wiki 查看 Python 编程环境的完整列表。

如果你想要讨论 Python 在教育中的使用，你可能会有兴趣加入 edu-sig 邮件
列表。
