Как вернуть значение каждый раз в цикле while в python - PullRequest
0 голосов
/ 27 апреля 2019

у меня есть следующий код

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)
    return MSG

if __name__ == '__main__':
    abcd()

и я хочу каждый раз возвращать MSG, как мне это сделать? кто-нибудь может мне помочь?

Ответы [ 3 ]

0 голосов
/ 27 апреля 2019

Как упомянул @Elia Geretto, вам может понадобиться преобразовать его в функцию генератора. Дайте мне знать, помогут ли эти изменения.

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.
0 голосов
/ 27 апреля 2019

Я не совсем уверен, что вы хотите, но я думаю, что одна из проблем заключается в том, что объект bus создается каждый раз.Вы можете попробовать следующий код.Я не могу проверить это сам, так как у меня нет шины CAN.Я также не уверен, что метод должен возвращать.Если вы можете улучшить вопрос, я тоже могу улучшить ответ: -)

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 голосов
/ 27 апреля 2019

Возможно, вы захотите превратить свою функцию в генератор, используя ключевое слово yield вместо return. Таким образом, завершив цикл с помощью yield MSG, ваша функция сгенерирует последовательность сообщений, по одному на каждую итерацию в цикле.

Когда ваш генератор заканчивается, поэтому MSG равен None, будет сгенерировано исключение StopIteration, в результате чего цикл for завершится, как и ожидалось.

Итак, вы можете структурировать свой код следующим образом:

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

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