打印¶
正如我们已经看到的,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}\) 的打印机。
如果未安装 \(\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()
函数有许多选项可以改变不同内容的格式。更多详情请参阅 其文档
。
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,)";
}
脚注