当他们说'有状态'时意味着什么?

eve*_*anh 4 python matplotlib

我有一个关于matplotlib的问题 - pyplot教程,链接在这里 我是一个本地荷兰语,可以阅读标准英语.我的问题不是关于一个不起作用的例子,而是关于文本.在pyplot_tutorial章节中,使用多个数字和轴,它们使用有状态和有状态的单词.我不明白他们的意思.我们在荷兰语中没有一句话.我在互联网上搜索,但我没有找到任何东西.我认为有状态意味着使用所有可能性完成.

我希望有人能给我一个答案.我知道这不是一个问题,因为它不是关于编程,但我不知道在哪里可以问它.

DrV*_*DrV 12

在这种情况下,可以通过简单的绘图示例最好地理解差异.

首先是有状态的例子:

import matplotlib.pyplot as plt

plt.figure()
plt.plot([0,1], [1,0])
Run Code Online (Sandbox Code Playgroud)

然后是无状态(或者说面向对象的方法):

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
li = ax.plot([0,1], [1,0])
Run Code Online (Sandbox Code Playgroud)

这些步骤执行相同的步骤:

  1. 创建一个图形对象(matplotlib.figure.Figure)
  2. 创建一个新的绘图区域对象(matplotlib.axes.AxesSubplot)并将其添加到图中
  3. 在绘图区域中创建一个新行(matplotlib.lines.Line2D)

在面向对象的形式,我们做上述操作相当明确,并采取了对象引用到变量(fig,ax,li).引用也不会在有状态接口中丢失,但它们隐藏在某个地方matplotlib.

当我们尝试改变某些属性(例如图的大小)时,这种差异变得明显.使用OO方法:

fig.set_size_inches([10, 8])
Run Code Online (Sandbox Code Playgroud)

通过有状态的方法,我们首先需要找到这个数字.有一个功能; plt.gcf.所以:

plt.gcf().set_size_inches([10,8])
Run Code Online (Sandbox Code Playgroud)

几乎是一回事.在我们同时打开多个数字的情况下,"几乎"部分变得非常重要.plt.gcf返回'当前'数字,但很难分辨哪一个是当前数字.

轴或线重复相同的情况.如果我们想调整图的x刻度,那么:

ax.set_xticks([0,.5,1])
Run Code Online (Sandbox Code Playgroud)

很简单.随着有状态的方法,它变成:

plt.gca().set_xticks([0, .5, 1])
Run Code Online (Sandbox Code Playgroud)

其中gca()返回'当前'轴.如果你有几个子图,这变得非常复杂.

所以,问题是谁持有这些物品.有状态接口只是面向对象信息的一个薄包装器.所有参数都在对象中,并且在一个图中有许多对象(数百甚至数千).

有状态接口的matplotlib一点是它经常用于pylab运行IPython.这给出了有状态接口以及一些带有命名空间的快捷方式.绘制正弦曲线就像:

x = linspace(0, 2*pi, 100)
plot(x, sin(x))
Run Code Online (Sandbox Code Playgroud)

这可以说比以下更简单:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2*np.pi, 100)
fig = plt.figure()
ax = fig.add_subplot(111)
li = ax.plot(x, np.sin(x))
Run Code Online (Sandbox Code Playgroud)

但是,尽管提供的快捷方式pylab对于交互式工作非常方便,但它在脚本中并不好.我也使用pylab,但是我在matplotlib相关答案中以面向对象的形式展示了几乎所有的例子,因为它更加透明.


oko*_*oko 0

在这种情况下,状态类似于内存。

你可以用一个类比来思考它:

  • 无国籍人对自己从一项任务到下一项任务的生活没有记忆。

  • 一个有状态的人有记忆/记录他们从一项任务到下一项任务的生活。

在您的情况下,无状态意味着绘制值时不参考过去的值。

通过有状态,库可以跟踪或记住绘制的过去值。

这避免了过多的内存消耗和进程开销。