调用Python函数而不传递参数 - animate(i)

时间:2015-12-15 13:59:31

标签: python function animation matplotlib

我正在努力弄清楚这段代码中发生了什么,并使其适应我自己的代码。我不确定它是否是Python函数的通用内容,或者它是否是matplotlib动画包特有的。

代码来自Jake Vanderplas animation tutorial,但它在网络上的类似示例。

这是一个名为的动画函数:

# animation function.  This is called sequentially
def animate(i):
    x = np.linspace(0, 2, 1000)
    y = np.sin(2 * np.pi * (x - 0.01 * i))
    line.set_data(x, y)
    return line,

这就是调用它的行:

anim = animation.FuncAnimation(fig, animate, init_func=init,
                               frames=200, interval=20, blit=True)

animate接受参数i,但他在没有变量i的情况下调用它。 animation.FuncAnimation以某种方式知道在那里传递一个值或者它是如何工作的?

小一点 - 在任何重要的返回声明之后是逗号吗?

4 个答案:

答案 0 :(得分:4)

当看到像这样的案例时,记住函数就像Python中的其他内容一样是对象是件好事。 。因此,除其他外,它们可以存储在数据结构中,重新分配名称并作为另一个函数参数传递

查看 animation.FuncAnimation 的文档:

  

class matplotlib.animation.FuncAnimation(fig, func, frames=None, init_func=None, fargs=None, save_count=None, **kwargs)       基础:matplotlib.animation.TimedAnimation

     

通过重复调用函数func,在fargs中传入(可选)参数来制作动画。

所以它只需要函数对象 animate(在本例中)并使用fargs中提供的参数调用它(如果未指定,则默认为{{ 1}})。

注意:查看FuncAnimation的来源后,我意识到None只是其他参数要传递给函数{{1如果fargs它们默认为空元组,则表示没有参数。 (在这种情况下,animate不应该确实指定,因为fargs=None只接受一个参数)

使用fargs调用函数animate,其中animate与最初传递的func(framedata, *self._args)参数相关,framedata是通过{{1}提供的任何参数}}。

完整调用(以下frames实际上是您的self._args函数):

fargs

所以,在内部,matplotlib使用self._func参数调用你的函数。

作为animate中的尾随逗号,这意味着它将返回值作为具有单个元素的元组,在这种情况下为 # Call the func with framedata and args. If blitting is desired, # func needs to return a sequence of any artists that were modified. self._drawn_artists = self._func(framedata, *self._args) 。它与以下内容相同:

framedata

答案 1 :(得分:1)

是返回语句之后的逗号是什么意思?

是的,它是元组的简写语法,所以...
  return line, == return (line,)

animation.FuncAnimation是否知道在那里传递一个值或者它是如何工作的?

我没有看过matplotlib,但我认为你对它的语法感到困惑。人们可以将函数作为参数传递。见下文

def foo(func,x,y,z): # foo takes in func,x,y,z
    return func(z) # foo returns func(z)

def bar(a): # bar takes in a, return a*a
    return a*a

print foo(bar,2,3,4) # foo returns bar(4)

答案 2 :(得分:1)

  1. 在此调用中,您传递函数参考,在FuncAnimation中,它可以使用正确的参数调用您的函数。
  2. 是的,它使响应成为元组。

答案 3 :(得分:0)

对于您提出的部分,

  

我不确定它是否是Python函数的通用内容

我邀请您阅读本教程的第二行。 http://www.diveintopython.net/getting_to_know_python/everything_is_an_object.html

基本上,在使用Python进行编程时需要牢记,

  

一切都是一个物体,它可以像普通物体一样传递。

这意味着,类,函数,整数,字符串,列表,集合,元组......一切。因为如果您看到所有这些不同数据类型的基本类型,您会惊奇地发现,基本类型的所有内容都是<type 'type'>

进一步阅读:http://www.cafepy.com/article/python_types_and_objects/python_types_and_objects.html#basic-concepts