一个函数为另一个函数生成数字

one function generating numbers for another

我想创建一个可以递增和递减计数的函数,我想每隔 500 毫秒从另一个函数访问计数值。

我怎样才能每 500 毫秒 return 这个值 'a' 这样我就可以在外部读取它,例如500 毫秒?

PS。我正在使用 Python 2.7

这是我到目前为止使用 yield 的代码,但它没有给出我想要的:

import time

class PLCApplication(object):
    def generate_data(self):
        a = 0
        countup = True
        while a >= 0:
            time.sleep(0.5)
            if countup == True:
                a += 2
            else:
                a -= 2
            if a < 0:
                countup = True
                a += 2
            if a == 12:
                countup = False
                a -= 2
            yield a

while True:
    plc = PLCApplication()
    b = plc.generate_data()
    for z in b:
        time.sleep(0.5)

打印'z...',z


编辑:

这就是我想要实现的功能。感谢:

import time
from drawnow import *
import matplotlib.pyplot as plt

x = []
y = []
plt.ion()

class PLCApplication(object):
    def generate_data(self):
        a = 0
        countup = True
        while a >= 0:
            time.sleep(0.5)
            if countup:  # no need to do test if it equals True
                a += 2
            else:
                a -= 2
            if a < 0:
                countup = True
                a += 2
            if a == 12:
                countup = False
                a -= 2
            yield a

    def makefig(self):
        plt.ylim(-10,30)
        plt.plot(x, 'ro-', label='testgraph')
        plt.grid(True)


if __name__ == '__main__':
    plc = PLCApplication()
    cnt = 0
    for t in plc.generate_data():
        i = t
        x.append(int(i))
        cnt=cnt+1
        if cnt > 20:
            x.pop(0)
        print x, cnt
        drawnow(plc.makefig)

Python Coroutine page 中的这个示例似乎使用新的 asyncio 以非阻塞方式执行此操作。

import asyncio
import datetime

@asyncio.coroutine
def display_date(loop):
    end_time = loop.time() + 5.0
    while True:
        print(datetime.datetime.now())
        if (loop.time() + 1.0) >= end_time:
            break
        yield from asyncio.sleep(1)

loop = asyncio.get_event_loop()
# Blocking call which returns when the display_date() coroutine is done
loop.run_until_complete(display_date(loop))
loop.close()

更新:根据 C14L 的评论更新了答案,下面是原始答案。

import time

class PLCApplication(object):
    def generate_data(self):
        a = 0
        countup = True
        while a >= 0:
            time.sleep(0.5)
            if countup:  # no need to do test if it equals True
                a += 2
            else:
                a -= 2
            if a < 0:
                countup = True
                a += 2
            if a == 12:
                countup = False
                a -= 2
            yield a

def do_stuff(b):
    print b

if __name__ == '__main__':
    plc = PLCApplication()
    for t in plc.generate_data():
        do_stuff(t)

原回答:

您需要 print awhile 循环内的适当位置:

[...]
while a >= 0:
    print a
    time.sleep(0.5)
[...]