打印¶
正如我们已经看到,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}\) 的打印机。
如果没有安装 \(\mathrm{\LaTeX}\),但安装了 Matplotlib,它将使用 Matplotlib 渲染引擎。如果没有安装 Matplotlib,它将使用 Unicode 美化打印机。
在 IPython 笔记本中,它将使用 MathJax 渲染 \(\mathrm{\LaTeX}\)。
在 IPython 控制台会话或常规 Python 会话中,如果终端支持 Unicode,它将使用 Unicode 美化打印机。
在不支持 Unicode 的终端中,将使用 ASCII 美化打印机。
要明确不使用 \(\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,)";
}
脚注