Вопрос-Ответ

How can I use `return` to get back multiple values from a loop? Can I put them in a list?

Как я могу использовать `return`, чтобы вернуть несколько значений из цикла? Могу ли я поместить их в список?

У меня есть некоторый код, который печатает данные из глобального словаря с именем cal:

def show_todo():
for key, value in cal.items():
print(value[0], key)

Однако я хочу использовать этот код как часть бота Discord. Для правильной работы бота мне нужно return передать данные другой функции, которая фактически отправит сообщение в чат Discord. Использование print подобного выше означает, что сообщение отображается в окне моей локальной консоли, а чат просто видит None.

Я попытался исправить это, используя return вместо:

def show_todo():
for key, value in cal.items():
return(value[0], key)

но таким образом цикл for не работает должным образом. Я получаю не более одной пары ключ-значение из словаря.

Как я могу исправить это, чтобы возвращались все данные?

Переведено автоматически
Ответ 1

Использование return внутри цикла прервет его и завершит работу функции, даже если итерация все еще не завершена.

Например:

def num():
# Here there will be only one iteration
# For number == 1 => 1 % 2 = 1
# So, break the loop and return the number
for number in range(1, 10):
if number % 2:
return number
>>> num()
1

В некоторых случаях нам нужно прервать цикл, если выполняются некоторые условия. Однако в вашем текущем коде прерывание цикла до его завершения является непреднамеренным.

Вместо этого вы можете использовать другой подход:

Получение ваших данных

def show_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(): ...

Помещение ваших данных в список или другой контейнер

Добавьте свои данные в список, затем верните их после завершения цикла:

def show_todo():
my_list = []
for key, value in cal.items():
my_list.append((value[0], key))
return my_list

Или использовать понимание списка:

def show_todo():
return [(value[0], key) for key, value in cal.items()]
Ответ 2

Используйте синтаксис генератора (отличное объяснение для SO здесь):

def show_todo():
for key, value in cal.items():
yield value[0], key

for value, key in show_todo():
print(value, key)
2023-04-26 05:46 python function