函数定义的语法错误

时间:2014-07-02 13:08:14

标签: function class animation

我正在用python探索动画,我正面临着我的代码问题,如下所示。我在代码末尾的“test_visualize()”函数定义中得到“语法错误”。

from matplotlib import pyplot as plt
from matplotlib import animation

我在这里定义了一个类,这个类的对象将用于模拟。

class Particle:
    def __init__(self, x, y, ang_speed):
        self.x = x
        self.y = y
        self.ang_speed = ang_speed

以下是粒子进化的规则。

class ParticleSimulator:
    def __init__(self, particles):
        self.particles = particles
    def evolve(self, dt):
        timestep = 0.00001
        nsteps = int(dt/timestep)
        for i in range(nsteps):
            for p in self.particles:

                norm = (p.x**2 + p.y**2)**0.5
                v_x = (-p.y)/norm
                v_y = p.x/norm

                d_x = timestep * p.ang_speed * v_x
                d_y = timestep * p.ang_speed * v_y
                p.x += d_x
                p.y += d_y

现在我想制作一个粒子动画,所以我定义了一个新函数。

def visualize(simulator):
    X = [p.x for p in simulator.particles]
    Y = [p.y for p in simulator.particles]
    fig = plt.figure()
    ax = plt.subplot(111, aspect='equal')
    line, = ax.plot(X, Y, 'ro')

    plt.xlim(-1, 1)
    plt.ylim(-1, 1)


    def init():
        line.set_data([], [])
        return line,
    def animate(i):

        simulator.evolve(0.01)
        X = [p.x for p in simulator.particles]
        Y = [p.y for p in simulator.particles]
        line.set_data(X, Y)
        return line,

        anim = animation.FuncAnimation(fig, animate, init_func=init, blit=True)
plt.show()

最后,在这个块的开头,我得到一个语法错误。以下代码的想法是测试我的可视化功能。奇怪的是,错误属于“def”行。

def test_visualize():
    particles = [Particle( 0.3, 0.5, +1), Particle( 0.0, -0.5, -1)]
    simulator = ParticleSimulator(particles)
    visualize(simulator)

if __name__ == '__main__':
    test_visualize()

好的伙计们,谢谢你的时间!

希望我们能解决这个问题。

问候!

1 个答案:

答案 0 :(得分:0)

有趣的是,我没有得到同样的错误。

您收到的错误告诉编译器不希望在该行上找到def。它可能与缩进有关。我在这里复制你的代码,但现在正确缩进:

from matplotlib import pyplot as plt
from matplotlib import animation

class Particle:
    def __init__(self, x, y, ang_speed):
        self.x = x
        self.y = y
        self.ang_speed = ang_speed

class ParticleSimulator:
    def __init__(self, particles):
        self.particles = particles
    def evolve(self, dt):
        timestep = 0.00001
        nsteps = int(dt/timestep)
        for i in range(nsteps):
            for p in self.particles:

                norm = (p.x**2 + p.y**2)**0.5
                v_x = (-p.y)/norm
                v_y = p.x/norm

                d_x = timestep * p.ang_speed * v_x
                d_y = timestep * p.ang_speed * v_y
                p.x += d_x
                p.y += d_y

def visualize(simulator):
    X = [p.x for p in simulator.particles]
    Y = [p.y for p in simulator.particles]
    fig = plt.figure()
    ax = plt.subplot(111, aspect='equal')
    line, = ax.plot(X, Y, 'ro')

    plt.xlim(-1, 1)
    plt.ylim(-1, 1)


    def init():
        line.set_data([], [])
        return line,

    def animate(i):
        simulator.evolve(0.01)
        X = [p.x for p in simulator.particles]
        Y = [p.y for p in simulator.particles]
        line.set_data(X, Y)
        return line,

    anim = animation.FuncAnimation(fig, animate, init_func=init, blit=False)
    plt.show()

def test_visualize():
    particles = [Particle( 0.3, 0.5, +1), Particle( 0.0, -0.5, -1)]
    simulator = ParticleSimulator(particles)
    visualize(simulator)

if __name__ == '__main__':
    test_visualize()

唯一重要的变化是修复visualize末尾的奇数缩进。这可以在没有SyntaxError的计算机上工作,现在我看到两个有趣的粒子在跳舞。 (请注意,我更改了blit=False,因为设置它True会破坏至少一些Mac后端。)

如果无法使其正常工作,请将上面的代码复制并粘贴到编辑器中。隐藏错误的一个非常典型的原因是缩进中的空格和制表符或代码中的不可见字符之间的混淆。

一旦你有了它的工作,我建议你把它暴露给http://codereview.stackexchange.com的亲切女士们。你的代码一点都不差,但有一些风格的东西可能会从一些抛光中受益!