Я изо всех сил пытаюсь понять, что происходит в этом коде, и адаптировать его, чтобы заставить мой собственный код работать. Я не уверен, что это что-то универсальное для функций Python или что-то специфическое для пакета анимации matplotlib.

Код взят из учебника по анимации Джейка Вандерпласа, но похожего примеры этого по всему интернету.

Это анимационная функция, которая называется:

# 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, как передавать туда значение, или как это работает?

Небольшое отступление - эта запятая после оператора return имеет какое-либо значение?

3
cardamom 15 Дек 2015 в 16:59

3 ответа

Лучший ответ

При рассмотрении подобных случаев полезно помнить, что функции , , как и все в 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 (который, если не указан, по умолчанию равен None ) .

Примечание . После просмотра источника < strong> FuncAnimation Я понял, что fargs - это просто дополнительные аргументы , которые нужно передать в функцию animate, и если {{X3 }} по умолчанию они содержат пустой кортеж, что означает отсутствие аргументов. (В этом случае fargs не следует указывать, поскольку animate принимает только один аргумент)

Функция animate вызывается с использованием: func(framedata, *self._args), где framedata относится к аргументу frames, переданному изначально, а self._args - к любым аргументам, переданным через fargs.

Выполнен полный вызов (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)  

Так что да, внутренне matplotlib вызывает вашу функцию с аргументом framedata.


Как завершающая запятая в return, это означает, что она вернет значение в виде кортежа с одним элементом, line в этом случае. Это так же, как следующее:

>>> i = 1,
>>> i
(1,)  # tuple with single element
4
Dimitris Fasarakis Hilliard 17 Дек 2015 в 16:28

Эта запятая после оператора return имеет какое-либо значение?

Да, это сокращенный синтаксис для кортежа и т. д.
return line, == return (line,)

Анимация .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)
1
taesu 15 Дек 2015 в 14:06