web-dev-qa-db-fra.com

Python - Comment utiliser une instruction return dans une boucle for?

Tout d'abord, je tiens à m'excuser pour le mauvais titre, mais c'était le mieux que j'ai pu faire. J'ai essayé de prendre beaucoup de captures d'écran pour, je l'espère, rendre cela un peu plus facile à comprendre.

Je travaille donc sur un chat-bot pour la discorde, et en ce moment sur une fonctionnalité qui fonctionnerait comme une liste de tâches. J'ai une commande pour ajouter des tâches à la liste, où elles sont stockées dans un dict. Cependant mon problème est de retourner la liste dans un format plus lisible (voir photos).

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

Les tâches sont stockées dans un dict appelé cal. Mais pour que le bot envoie réellement le message, je dois utiliser une déclaration de retour, sinon il l'imprimera simplement sur la console et non sur le chat réel (voir les images).

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

Voici comment j'ai essayé de le réparer, mais depuis que j'ai utilisé return, la boucle for ne fonctionne pas correctement.

Alors, comment puis-je résoudre ce problème? Comment puis-je utiliser une déclaration de retour pour qu'elle s'imprime dans le chat au lieu de la console?

Veuillez voir les images pour une meilleure compréhension

6
Eric.L

L'utilisation d'un return à l'intérieur d'une boucle, le cassera et quittera la méthode/fonction même si l'itération n'est toujours pas terminée.

Par exemple:

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

Dans certains cas/algorithmes, nous devons rompre la boucle si certaines conditions sont remplies. Cependant, dans votre code actuel, rompre la boucle avant de la terminer est une erreur/mauvaise conception.

Au lieu de cela, vous pouvez utiliser une approche différente:

donnant vos données:

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

Vous pouvez l'appeler comme:

a = list(show_todo()) # or Tuple(show_todo()) and you can iterate through it too.

Ajout de vos données dans une liste temporelle ou Tuple ou dict ou string puis après la sortie de votre boucle renvoyez vos données:

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

Utilisez une syntaxe générateur (excellente explication sur SO ici ):

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

for value, key in show_todo():
    print(value, key)
4
Uriel