没有全局参数的python动画

2024-05-14 16:14:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个康威的人生游戏的实现。我的第一次尝试就是在每次更新后用matplotlib的imshow在一个1和0的NxN板上绘制板。但是,当程序每次显示绘图时都会暂停,所以这不起作用。必须关闭绘图才能得到下一个循环迭代。在

我发现matplotlib中有一个动画包,但它不接受(或给出)变量,所以我见过的每个实现(甚至matplotlib's documentation)都依赖于全局变量。在

所以这里有两个问题:

1)这里可以使用全局变量吗?我一直读到这不是个好主意,但这只是教条吗?在

2)在没有全局参数的情况下,如何在python中制作这样的动画(即使这意味着要放弃matplotlib,我想,标准库总是首选的)。在


Tags: 程序游戏绘图参数matplotlibdocumentation绘制动画
2条回答

这些只是示例程序。可以使用object代替全局变量,如下所示:

class GameOfLife(object):
    def __init__(self, initial):
        self.state = initial
    def step(self):
        # TODO: Game of Life implementation goes here
        # Either assign a new value to self.state, or modify it
    def plot_step(self):
        self.step()
        # TODO: Plot here

# TODO: Initialize matplotlib here
initial = [(0,0), (0,1), (0,2)]
game = GameOfLife(initial)
ani = animation.FuncAnimation(fig, game.plot_step)
plt.show()

如果您真的想避免类,也可以这样重写程序:

^{pr2}$

注意,对于非数学动画(没有标签、图形、比例等),您可能更喜欢pyglet或{a3}。在

以下是在不使用自定义类的情况下使用FuncAnimation的示例:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

def animate(data, im):
    im.set_data(data)

def step():
    while True:
        # replace this with Conway's Game of Life logic
        data = np.random.randn(10, 10)
        yield data

fig, ax = plt.subplots()
im = ax.imshow(np.random.randn(10, 10), interpolation='nearest')
ani = animation.FuncAnimation(
    fig, animate, step, interval=10, repeat=True, fargs=(im, ))
plt.show()

当在函数中使用yield(与return相反)时,它使函数成为generator生成器函数保存状态。每次在生成器返回的迭代器上调用next,执行流从它停止的地方开始(从最后一个yield表达式开始)。这就是为什么生成器是避免全局变量的一种方法-可能的全局变量只是生成器函数内部的局部变量,它们的状态在调用next之间保存。在


顺便说一句,“永远不要使用globals”的警告还不够精确。我们一直使用全局变量。每次在模块级别导入模块时,模块对象都是全局的。每次在模块级别定义函数或类时,它都是全局的。使用全局变量没有什么错(尽管从函数内部访问全局变量确实比访问函数的局部变量慢。不过,请注意预优化)。在

也许应该改为“尽量不要使用改变状态的全局变量。”改变全局值是不好的原因是因为每个改变全局的函数都会悄悄地关联起来。函数不再能够被理解和测试为一个独立的代码单元。程序员用来解决问题的主要工具是把大问题分解成更小的部分。函数和类有助于将问题分解成更小的部分。但是当你使用变异的全局变量时,你就失去了这个好处。现在大脑必须同时搜索整个模块来理解代码。在

相关问题 更多 >

    热门问题