Получение RecursionError: максимальная глубина рекурсии превышена при вызове объекта Python при запуске моего приложения фляги - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь перебрать список значений, полученных из базы данных

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

def winner(x):
    winner = random.choice(x)
    return winner_list(x, winner)

winner_lists = []
def winner_list(y, x):
    if x not in winner_lists:
        winner_lists.append(x)
    else:
        winner(y)

i = 0
competitors = User.query.all() #gotten from database
main_competitors = []
for competitor in competitors:
    competitor_raffles = competitor.raffles.split(',')
    if uuid in competitor_raffles:
        main_competitors.append(competitor.uuid.strip(' '))
while (i < form.number.data) and (main_competitors != []):
    winner(main_competitors)
    i+=1

Я ожидаю увидеть случайно выбранные имена из списка конкурентов

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Похоже, проблема в цикле while.Когда winner_lists содержит все main_competitors, функции winner и winner_lists продолжают вызывать друг друга, так как невозможно выбрать нового победителя.

Возможно, вы забыли удалить конкурента из main_competitors каждый раз, когда запускается winner.

0 голосов
/ 06 июня 2019

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

Почему бы и нет?Вы знаете, сколько раз максимально выбрать победителя (из form.number.data), и у вас есть список конкурентов определенной длины.

В этом примере выбираются только уникальные победители.Если участник может «выиграть» более одного раза, просто удалите последнюю строчку.

results = []
how_many_winners = form.number_data
contestants = main_competitors[:]
while main_competitors and len(results) < how_many_winners:
    this_winner = random.choice(contestants)
    results.append(this_winner)
    contestants.remove(this_winner)   # Remove this line if a contestant can 'win' more than once
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...