-1
votes

Comment retourner la valeur à chaque fois en boucle dans Python

J'ai le code ci-dessous xxx

et je veux retourner msg à chaque fois comment puis-je faire? quelqu'un peut-il m'aider?


1 commentaires

Pouvez-vous essayer de décrire le comportement que vous voulez? Je suppose que la méthode bus.recv () renvoie les données actuellement disponibles (un ou plusieurs octets). Voulez-vous un résultat dès qu'il sera disponible, ou après une certaine quantité de silence dans le bus? Et voulez-vous toutes les données (concaténées) ou uniquement le dernier octet? Je pense qu'il y a plusieurs problèmes avec votre code, mais j'ai besoin de plus d'informations pour fournir une bonne réponse.


3 Réponses :


0
votes

Vous voulez probablement envisager de tourner votre fonction en générateur, à l'aide du mot-clé code> de rendement code> au lieu de retour code>. De cette manière, mettre fin à votre cycle avec rendement msg code>, votre fonction générera une séquence de messages, une par itération dans le cycle.

Lorsque votre générateur se termine, donc msg code > est Aucun code>, un STOVITÉTÉTRAITATION code> sera soulevé, rendant le pour code> Terminez la boucle comme prévu. P>

conclure, vous Peut structurer votre code comme suit: P>

def callee():
    while ...:
        elem = ...
        yield elem

def caller():
    for elem in callee():
        ...


4 commentaires

il ne vient qu'une seule fois et sortit ça n'a pas fonctionné


Pouvez-vous s'il vous plaît fournir un exemple expliquant votre problème avec cette solution?


~~~~ Importer peut DEF ABCD (): bus = can.interface.bus (canal = '1', bustype = 'vecteur', app_name = 'python-peut') msg ​​= bus.recv (0.5) pendant que msg est Non aucun: msg = bus.recv (1) rendement msg def abcd_2 (): pour msg in abcd (): impression (msg) renvoyer msg si nom == ' Main ': abcd_2 () ~~~~~~ j'ai essayé cela, mais cela ne donne aucune sortie


Votre code n'est pas lisible dans un commentaire, pouvez-vous mettre à jour votre message d'origine en ajoutant la nouvelle version de votre code en bas?



0
votes

Comme mentionné par @elia geretto, vous devrez peut-être le convertir en fonction de générateur.Le sais que cela change ces changements aidera.

import can

def abcd():
    bus = can.interface.Bus(channel= '1', bustype='vector',app_name = 'python-can')
    MSG = bus.recv(0.5)
    while MSG is not None:
        MSG = bus.recv(1)
        yield MSG

if __name__ == '__main__':
    for op in abcd():
        print(op)  # or you can use next() as well.


2 commentaires

À la place de l'impression, je veux retour


Vous pouvez collecter tous les rendements dans une liste et faire votre traitement.



0
votes

Je ne suis pas complètement sûr de ce que vous voulez, mais je pense que l'un des problèmes est que l'objet code> code> est créé à chaque fois. Vous pourriez essayer le code suivant. Je ne peux pas le tester moi-même depuis que je n'ai pas de bus Can disponible. Je ne sais pas non plus quelle est la méthode de retour. Si vous pouvez améliorer la question, je peux aussi améliorer la réponse: -)

import can

def read_from_can(bus):
    msg = bus.recv(0.5)
    while msg is not None:
        msg = bus.recv(1)
    return msg


def main():
    # create bus interface only once
    bus = can.interface.Bus(channel='1', bustype='vector', app_name='python-can')
    # then read (for example) 10 times from bus
    for i in range(10):
        result = read_from_can(bus)
        print(result)


if __name__ == '__main__':
    main()  # Tip: avoid putting your code here; use a method instead


0 commentaires