2013-12-19 2 views
0

Я пытаюсь создать данные для анимации matplotlib.
У меня есть функция data_gen для функции «animation.FuncAnimation» Matplotlib, что называется, как это:функция генератора для анимации matplotlib

ani = animation.FuncAnimation(fig, update, frames=data_gen, init_func=init, interval=10, blit=True) 

Мой код имеет такой вид:

def func(a): 
    a += 1 
    return a 

b = 0 

def data_gen(): 
    global b 
    c = func(b) 
    b = c 
    yield c 

К сожалению, это не делать то, что я хочу ! Например,

print(data_gen().__next__()) 
print(data_gen().__next__()) 
print(data_gen().__next__()) 

for k in data_gen(): 
    print(k) 

... производит этот вывод:

1 
2 
3 
4 

Я ожидал, что цикл будет работать вечно, но это не так. (Он останавливается на 4.)

поведение мне нужно:

(1) set initial value for b

(2) update b each time the generator runs

Все предложения высоко оценили!

ответ

2

Каждый раз, когда вы звоните data_gen() в устанавливает новый генератор, вам просто нужно продолжать использовать объект генератора же. Также нет причин явно поддерживать глобальное состояние, это то, что делает генератор для вас:

def data_gen(init_val): 
    b = init_val 
    while True: 
     b += 1 
     yield b 

gen = data_gen(3) 
print next(gen) 
print 'starting loop' 
for j in gen: 
    print j 
    if j > 50: 
     print "don't want to run forever, breaking" 
     break 
+0

все еще не работает, поскольку в генераторе нет цикла. он будет только один раз. – M4rtini

+0

@ M4rtini Ваше право, отвлеченное другими проблемами и смущенным глобальным государством .... – tacaswell

+0

@tcaswell Это очень полезно; однако, в том числе аргументы в data_gen, похоже, не работают в вызове функции animation.FuncAnimation. Я задам еще один вопрос, могу ли я сузить источник проблемы. Еще раз спасибо. – Riccati

0

Когда я добавляю бесконечный цикл в data_gen так:

b=0 
def data_gen(): 
    global b 
    while True: 
     b+=1 
     yield b 

я получаю (я использую Python 3.3, но результат должен быть одинаковым для 2.x)

next(data_gen()) 
> 1 
next(data_gen()) 
>2 
next(data_gen()) 
>3 

list(zip(range(10), data_gen())) 
> [(0, 4), (1, 5), (2, 6), (3, 7), (4, 8), (5, 9), (6, 10), (7, 11), (8, 12), (9, 13)] 

И наконец, если я

for i in data_gen(): 
    print(i) 

код продолжается и на номера печатных

0
def func(a): 
    a += 1 
    return a 

b = 0 

def data_gen(): 
    global b 
    while 1: 
      c = func(b) 
      b = c 
      yield c 

>>> gen.next() 
    1 
>>> gen.next() 
    2 
>>> gen.next() 
    3 
>>> gen.next() 
    4 
>>> gen.next() 
    5 
Смежные вопросы