********* 后记 ********* 为什么选择 Python? =================== Python 的优势 ------------- 尽管必须快速执行的代码是用编译型语言实现的,但 Sage 的主要实现语言是 Python(见 [Py]_ )。 Python 具有以下几点优势: - **对象保存** 在 Python 中得到了很好的支持。Python 广泛支持将(几乎)任意对象保存到磁盘文件或数据库中。 - 源代码中对函数和包的 **文档** 支持非常好,包括自动提取文档和自动测试所有示例。 这些示例会定期自动测试,并保证如预期工作。 - **内存管理**:Python 现有的内存管理器和垃圾收集器设计精巧且强大, 可以正确处理循环引用,并允许文件中的局部变量。 - Python 拥有许多对 Sage 用户非常有用的 **包**:数值分析和线性代数,2D 和 3D 可视化, 网络(用于分布式计算和服务,例如通过 twisted),数据库支持等。 - **可移植性**:Python 在大多数平台上,只需几分钟即可轻松从源代码编译 Python。 - **异常处理**:Python 拥有复杂且精巧的异常处理系统,即使代码出现错误,程序也能优雅地恢复。 - **调试器**:Python 包含调试器,因此当代码由于某种原因失败时, 用户可以访问详尽的堆栈跟踪,检查所有相关变量的状态,并上下移动堆栈。 - **性能分析器**:Python 拥有性能分析器,它会运行代码并创建一份详细报告,说明每个函数被调用的次数和时间。 - **一门语言**:不同于 Magma、Maple、Mathematica、Matlab、GP/PARI、GAP、Macaulay 2、Simath 等 那样为数学编写一门 **新语言**,我们使用 Python 语言,它是一种流行的计算机语言, 由数百名经验丰富的软件工程师积极开发和优化。Python 是一个重要的开源成功案例,拥有成熟的开发流程(见 [PyDev]_ )。 .. _section-mathannoy: 预解析器:Sage 与 Python 之间的区别 ----------------------------------- Python 的一些数学方面可能会令人困惑,因此 Sage 在多个方面的行为与 Python 不同。 - **指数运算符的表示法**: ``**`` vs ``^``。在 Python 中, ``^`` 表示“异或”,而不是指数运算。因此在 Python 中我们有: .. CODE-BLOCK:: pycon >>> 2^8 10 >>> 3^2 1 >>> 3**2 9 ``^`` 的这种用法可能略显奇怪,并且对于纯数学研究来说效率不高,因为“异或”函数很少使用。 为了方便起见,Sage 在将所有命令行传递给 Python 之前都会进行预解析, 将不在字符串中的 ``^`` 替换为 ``**``: :: sage: 2^8 256 sage: 3^2 9 sage: "3^2" '3^2' Sage 中的按位异或运算符是 ``^^``。这也适用于就地运算符对于就地运算符 ``^^=``: :: sage: 3^^2 1 sage: a = 2 sage: a ^^= 8 sage: a 10 - **整数除法**:Python 表达式 ``2/3`` 并不像数学家们所预期的那样:``2/3`` 返回浮点数 ``0.6666...``。 请注意 ``//`` 是欧几里得除法,``2//3`` 返回 ``0``。 我们在 Sage 解释器中通过将整型字面量包装在 ``Integer( )`` 中,并使除法作为有理数的构造函数来处理这个问题。例如: :: sage: 2/3 2/3 sage: (2/3).parent() Rational Field sage: 2//3 0 - **长整数**:Python 原生支持除 C int 类型外的任意精度整数。 这些原生整数的性能显著低于 GMP 所提供的。Sage 使用 GMP C 库来实现任意精度整数。 与某些人为了内部项目修改 Python 解释器不同,我们完全按照原样使用 Python 语言, 并为 IPython 编写预解析器,使 IPython 的命令行行为符合数学家的预期。 这意味着任何现有的 Python 代码都可以在 Sage 中使用。 然而,仍需遵守标准的 Python 规则,以便编写能够导入 Sage 的包。 (例如,要安装在互联网上找到的 Python 库,请按照说明进行操作, 但使用 ``sage -python`` 而不是 ``python``。 通常这意味着输入 ``sage -python setup.py install``。) 我想做出一些贡献,我应该怎么做? ================================ 如果你想为 Sage 做出贡献,我们会非常感谢你的帮助!贡献可以从实质性代码贡献到向 Sage 添加文档或报告错误。 浏览 Sage 网页以获取开发者信息。你还可以找到一份按优先级和类别排序的 Sage 相关项目列表。 `Sage 开发者指南 <http://doc.sagemath.org/html/en/developer/>`_ 也有一些有用的信息, 你还可以查看 ``sage-devel`` Google 讨论组。 如何引用 Sage? =============== 如果你在论文中使用了 Sage,当引用使用 Sage 的计算时,包含以下内容: 如果你使用 Sage 撰写论文,请将以下内容添加到参考文献中来引用使用 Sage 完成的计算 .. CODE-BLOCK:: text [Sage] SageMath, the Sage Mathematics Software System (Version 8.7), The Sage Developers, 2019, https://www.sagemath.org. (将 8.7 替换为你使用的 Sage 版本)。此外,请尝试追踪在计算中使用了哪些 Sage 组件, 例如 PARI?, GAP?, Singular?, Maxima? 并引用这些系统。如果你不确定计算使用了哪个软件, 可以随时在 ``sage-devel`` Google 讨论组上提问。有关这一点的进一步讨论,请参阅 :ref:`section-univariate`。 ------------ 如果你恰好刚刚读完这篇教程,并且知道花了多长时间,请在 ``sage-devel`` Google 讨论组上告诉我们。 祝使用 Sage 愉快!