Python: как вернуть данные из цикла for? - PullRequest
1 голос
/ 04 мая 2019

Моя цель - создать график в режиме реального времени с помощью Dash, который отображает, сколько времени требуется пакетному заданию для выполнения повторяющейся задачи. График будет получать данные из лог-файла batchjob, где он ищет некоторые конкретные слова.

Проблема в том, что когда я хочу отобразить данные на графике, отображаются только первые значения, а не следующие значения.

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

def update_graph():
    specific_word = "help"

    for i,line in enumerate(lines):
        if specific_word in line:

            X.append(int(count))
            Y.append(int(time))

            data = go.Scatter(
                x = list(X),
                y = list(Y),
                name = 'Scatter',
                mode = 'lines+markers'
                )

            return {'data':[data], 
            'layout': go.Layout(xaxis = dict(range=[min(X), max(X)]),
                                yaxis = dict(range=[min(Y), max(Y)]))}

В результате я получаю только первое значение из файла журнала, а не следующие значения.

Когда я заменяю обратную строку на print (data) и выполняю функцию в терминале, я получаю результат, который ищу.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 04 мая 2019

Оператор return прерывается из цикла. Так что это не позволяет циклу for продолжать выполнение.Чтобы решить эту проблему, вы можете сохранить данные внутри цикла for и поместить инструкцию return вне функции.

Вы можете попробовать это -

array_name.append( {'data':[data], 
            'layout': go.Layout(xaxis = dict(range=[min(X), max(X)]),
                                yaxis = dict(range=[min(Y), max(Y)]))})
0 голосов
/ 04 мая 2019

Проблема в том, что python выходит из функции после возврата первого значения.

Вы можете добавить в список все значения, которые вы хотите видеть, и вместо этого вернуть:

def update_graph():
    specific_word = "help"
    output = []  # the list output will store all the data
    for i,line in enumerate(lines):
        if specific_word in line:

            X.append(int(count))
            Y.append(int(time))

            data = go.Scatter(
                x = list(X),
                y = list(Y),
                name = 'Scatter',
                mode = 'lines+markers'
                )

            output.append({'data':[data],  #add the values to the list
            'layout': go.Layout(xaxis = dict(range=[min(X), max(X)]),
                                yaxis = dict(range=[min(Y), max(Y)]))})
    return output 

Таким образом, вы получите список в качестве возвращаемого значения.

Вы можете перебирать список, чтобы получить любые элементы, которые вы хотите:

thelist = update_graph()

for item in thelist:
    print(item)
    #do whatever you want with the item here

...