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