How can I use `return` to get back multiple values from a loop? Can I put them in a list?
Как я могу использовать `return`, чтобы вернуть несколько значений из цикла? Могу ли я поместить их в список?
У меня есть некоторый код, который печатает данные из глобального словаря с именем cal:
defshow_todo(): for key, value in cal.items(): print(value[0], key)
Однако я хочу использовать этот код как часть бота Discord. Для правильной работы бота мне нужно return передать данные другой функции, которая фактически отправит сообщение в чат Discord. Использование print подобного выше означает, что сообщение отображается в окне моей локальной консоли, а чат просто видит None.
Я попытался исправить это, используя return вместо:
defshow_todo(): for key, value in cal.items(): return(value[0], key)
но таким образом цикл for не работает должным образом. Я получаю не более одной пары ключ-значение из словаря.
Как я могу исправить это, чтобы возвращались все данные?
Переведено автоматически
Ответ 1
Использование return внутри цикла прервет его и завершит работу функции, даже если итерация все еще не завершена.
Например:
defnum(): # Here there will be only one iteration # For number == 1 => 1 % 2 = 1 # So, break the loop and return the number for number inrange(1, 10): if number % 2: return number >>> num() 1
В некоторых случаях нам нужно прервать цикл, если выполняются некоторые условия. Однако в вашем текущем коде прерывание цикла до его завершения является непреднамеренным.
Вместо этого вы можете использовать другой подход:
Получение ваших данных
defshow_todo(): # Create a generator for key, value in cal.items(): yield value[0], key
Вы можете назвать это следующим образом:
a = list(show_todo()) # or tuple(show_todo())
или вы можете выполнить итерацию по нему:
for v, k in show_todo(): ...
Помещение ваших данных в список или другой контейнер
Добавьте свои данные в список, затем верните их после завершения цикла:
defshow_todo(): my_list = [] for key, value in cal.items(): my_list.append((value[0], key)) return my_list
Или использовать понимание списка:
defshow_todo(): return [(value[0], key) for key, value in cal.items()]
Ответ 2
Используйте синтаксис генератора (отличное объяснение для SO здесь):
defshow_todo(): for key, value in cal.items(): yield value[0], key