J'ai le code ci-dessous et je veux retourner msg à chaque fois comment puis-je faire?
quelqu'un peut-il m'aider? p> p>
3 Réponses :
Vous voulez probablement envisager de tourner votre fonction en générateur, à l'aide du mot-clé code> de rendement code> au lieu de Lorsque votre générateur se termine, donc conclure, vous Peut structurer votre code comme suit: P> 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.
msg code > est
Aucun code>, un
STOVITÉTÉTRAITATION code> sera soulevé, rendant le
pour code> Terminez la boucle comme prévu. P>
def callee():
while ...:
elem = ...
yield elem
def caller():
for elem in callee():
...
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 b> == ' Main b > ': 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?
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.
À la place de l'impression, je veux retour
Vous pouvez collecter tous les rendements dans une liste et faire votre traitement.
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
Pouvez-vous essayer de décrire le comportement que vous voulez? Je suppose que la méthode
bus.recv () code> 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.