打印

正如我们已经看到,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 0.7.3 (Python 2.7.5-64-bit) (ground types: gmpy)

These commands were executed:
>>> from __future__ import division
>>> 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://www.sympy.org/
>>>

无论如何,这将是发生的事情

  • 在 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() 函数有许多选项可以更改不同事物的格式。有关更多详细信息,请参阅 its documentation

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()

Dot

dotprint() 函数位于 sympy.printing.dot 中,将输出打印为 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,)";
}

脚注