Оператор Return печатает первую итерацию, а Print выводит все итерации - Python - PullRequest
0 голосов
/ 23 января 2019

Я бьюсь головой об стену:

Я протестировал следующий раздел кода с помощью оператора print, он выводит все итерации, как и ожидалось.Однако, когда я использую return в реальной программе (взаимодействуя с flask для публикации на веб-странице), она выводит только первую итерацию.

This:

# Setting up cursor so we can parse results. 
cur = db.cursor()

cur.execute("SELECT user from users")
user_table = cur.fetchall()

for u in user_table:
    cur.execute("SELECT date from mood WHERE user='{}'".format(u[0]))
    user_dates = cur.fetchall()
    n = (len(user_dates) - 1) # Using this to call indexes later so need to throw away last number
    u_streak = 1
    dte_list = [ ]
    t = timedelta(days=1)
    u_streak = 1
    streak_list = [ ]
    streak_dict = {}
    sm_list = [ ]
    for dte in user_dates:
        dte_list.append(dte[0])
        dte_list = sorted(dte_list)
    for i in range(n):
        if (dte_list[i] + t) == dte_list[(i + 1)]:
            u_streak += 1
        else:
            streak_list.append(u_streak)
            u_streak = 1

    print u[0], streak_list

вывод:

codestardust [1, 1, 3]
pippen [2, 2, 5, 4]
samwise [4, 1, 1, 1]

В то время как это:

@app.route('/mood',methods=['GET', 'POST'])
def mood():
    if request.method == 'POST':
        user = session['username']
        mymood = request.form['mymood']
        d = datetime.today().strftime('%Y-%m-%d')

        # Confirm user is logged in
        if user and mymood:
            cur.execute("INSERT INTO mood SET mood ='{}', date = '{}', user='{}'"\
            .format(mymood,d,user) )

           # Begin streak calculation
            t = timedelta(days=1)

            cur.execute("SELECT user from users")
            user_table = cur.fetchall()


            for u in user_table:
                cur.execute("SELECT date from mood WHERE user='{}'".format(u[0]))
                user_dates = cur.fetchall()
                n = (len(user_dates) - 1) # Using this to call indexes later so need to throw away last number
                u_streak = 1
                dte_list = [ ]
                u_streak = 1
                streak_list = [ ]
                streak_dict = {}
                sm_list = [ ]
                for dte in user_dates:
                    dte_list.append(dte[0])
                    dte_list = sorted(dte_list)
                for i in range(n):
                    if (dte_list[i] + t) == dte_list[(i + 1)]:
                        u_streak += 1
                    else:
                        streak_list.append(u_streak)
                        u_streak = 1

                return jsonify([u[0], streak_list])

выводит это:

["codestardust", [1, 1, 3, 4]]

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

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

Насколько я понимаю, начиная с returnоператор вложен в for u in user_table:, он должен проходить через все итерации пользователей.Я был на этом весь день и не вижу, что мне не хватает.Любая помощь высоко ценится!(Также я знаю, что пишется "pippen" неправильно lol)

1 Ответ

0 голосов
/ 23 января 2019

Вы просто печатаете в конце каждой итерации в первом примере кода, однако в примере с колбой вы возвращаете это. Return останавливает выполнение функции, в которой он находится, возвращает значение (None, если не указано) и затем продолжается. Вы должны объединить значения в список или набор и вернуть их вызывающей стороне для анализа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...