打印

正如我们已经看到的,SymPy 可以使用 Unicode 字符来美化其输出。这是对 SymPy 中最常见的打印选项的简要介绍。

打印机

SymPy 中有几种可用的打印机。最常见的是

  • str

  • srepr

  • ASCII 漂亮打印机

  • Unicode 美化打印机

  • LaTeX

  • MathML

除了这些,还有可以将 SymPy 对象输出为代码的“打印机”,例如 C、Fortran、Javascript、Theano 和 Python。这些在本教程中没有讨论。

设置漂亮打印

如果你只想要最好的漂亮打印效果,使用 init_printing() 函数。这将自动启用你环境中可用的最佳打印机。

>>> from sympy import init_printing
>>> init_printing() 

如果你计划在一个交互式的计算器类型会话中工作,init_session() 函数将自动导入 SymPy 中的所有内容,创建一些常见的符号,设置绘图,并运行 init_printing()

>>> from sympy import init_session
>>> init_session() 
Python console for SymPy 1.13.0 (Python 3.12.4-64-bit) (ground types: gmpy)

These commands were executed:
>>> from sympy import *
>>> x, y, z, t = symbols('x y z t')
>>> k, m, n = symbols('k m n', integer=True)
>>> f, g, h = symbols('f g h', cls=Function)
>>> init_printing() # doctest: +SKIP

Documentation can be found at https://docs.sympy.org/1.13.0/
>>>

无论如何,这将发生:

  • 在 IPython QTConsole 中,如果安装了 \(\mathrm{\LaTeX}\),它将启用一个使用 \(\mathrm{\LaTeX}\) 的打印机。

    ../../_images/ipythonqtconsole.png

    如果未安装 \(\mathrm{\LaTeX}\),但安装了 Matplotlib,它将使用 Matplotlib 渲染引擎。如果未安装 Matplotlib,则使用 Unicode 漂亮打印机。

  • 在 IPython 笔记本中,它将使用 MathJax 来渲染 \(\mathrm{\LaTeX}\)

    ../../_images/ipythonnotebook.png
  • 在 IPython 控制台会话或常规 Python 会话中,如果终端支持 Unicode,它将使用 Unicode 漂亮打印机。

    ../../_images/consoleunicode.png
  • 在不支持Unicode的终端中,使用ASCII格式打印机。

    ../../_images/consoleascii.png

要明确不使用 \(\mathrm{\LaTeX}\),请将 use_latex=False 传递给 init_printing()init_session()。 要明确不使用 Unicode,请传递 use_unicode=False

打印功能

除了自动打印外,您还可以通过调用适当的函数显式使用任何一种打印机。

str

要获取表达式的字符串形式,请使用 str(expr)。这也是 print(expr) 生成的形式。字符串形式设计得易于阅读,但同时是正确的 Python 语法,以便可以复制和粘贴。表达式的 str() 形式通常看起来与您输入的表达式完全相同。

>>> from sympy import *
>>> x, y, z = symbols('x y z')
>>> str(Integral(sqrt(1/x), x))
'Integral(sqrt(1/x), x)'
>>> print(Integral(sqrt(1/x), x))
Integral(sqrt(1/x), x)

srepr

表达式的 srepr 形式旨在显示表达式的确切形式。它将在 教程-操作 部分中进一步讨论。要获取它,请使用 srepr() [1]

>>> srepr(Integral(sqrt(1/x), x))
"Integral(Pow(Pow(Symbol('x'), Integer(-1)), Rational(1, 2)), Tuple(Symbol('x')))"

srepr 形式主要用于理解表达式是如何在内部构建的。

ASCII 漂亮打印机

ASCII 格式打印器通过 pprint() 访问。如果终端不支持 Unicode,默认使用 ASCII 打印器。否则,您必须传递 use_unicode=False

>>> pprint(Integral(sqrt(1/x), x), use_unicode=False)
  /
 |
 |     ___
 |    / 1
 |   /  -  dx
 | \/   x
 |
/

pprint() 将输出打印到屏幕上。如果你想得到字符串形式,请使用 pretty()

>>> pretty(Integral(sqrt(1/x), x), use_unicode=False)
'  /          \n |           \n |     ___   \n |    / 1    \n |   /  -  dx\n | \\/   x    \n |           \n/            '
>>> print(pretty(Integral(sqrt(1/x), x), use_unicode=False))
  /
 |
 |     ___
 |    / 1
 |   /  -  dx
 | \/   x
 |
/

Unicode 美化打印机

Unicode 漂亮打印器也可以通过 pprint()pretty() 访问。如果终端支持 Unicode,它会自动使用。如果 pprint() 无法检测到终端支持 Unicode,你可以传递 use_unicode=True 来强制使用 Unicode。

>>> pprint(Integral(sqrt(1/x), x), use_unicode=True)

⎮     ___
⎮    ╱ 1
⎮   ╱  ─  dx
⎮ ╲╱   x

\(\mathrm{\LaTeX}\)

要获取表达式的 \(\mathrm{\LaTeX}\) 形式,请使用 latex()

>>> print(latex(Integral(sqrt(1/x), x)))
\int \sqrt{\frac{1}{x}}\, dx

latex() 函数有许多选项可以改变不同内容的格式。更多详情请参阅 其文档

MathML

还有一个打印为 MathML 的工具,称为 print_mathml()。它必须从 sympy.printing.mathml 导入。

>>> from sympy.printing.mathml import print_mathml
>>> print_mathml(Integral(sqrt(1/x), x))
<apply>
    <int/>
    <bvar>
        <ci>x</ci>
    </bvar>
    <apply>
        <root/>
        <apply>
            <power/>
            <ci>x</ci>
            <cn>-1</cn>
        </apply>
    </apply>
</apply>

print_mathml() 打印输出。如果你想获取字符串,请使用函数 mathml()

sympy.printing.dot 中的 dotprint() 函数将输出打印为 dot 格式,该格式可以使用 Graphviz 进行渲染。有关此打印机输出的一些示例,请参阅 高级表达式操作 部分。

以下是 dotprint() 函数的原始输出示例

>>> from sympy.printing.dot import dotprint
>>> from sympy.abc import x
>>> print(dotprint(x+2))
digraph{

# Graph style
"ordering"="out"
"rankdir"="TD"

#########
# Nodes #
#########

"Add(Integer(2), Symbol('x'))_()" ["color"="black", "label"="Add", "shape"="ellipse"];
"Integer(2)_(0,)" ["color"="black", "label"="2", "shape"="ellipse"];
"Symbol('x')_(1,)" ["color"="black", "label"="x", "shape"="ellipse"];

#########
# Edges #
#########

"Add(Integer(2), Symbol('x'))_()" -> "Integer(2)_(0,)";
"Add(Integer(2), Symbol('x'))_()" -> "Symbol('x')_(1,)";
}

脚注