【问题标题】:one function generating numbers for another一个函数为另一个生成数字
【发布时间】:2016-05-22 16:53:07
【问题描述】:

我想创建一个向上计数和向下计数的函数,并且我想每隔 500 毫秒从另一个函数访问计数值。

如何每 500 毫秒返回一次这个值 '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)

【问题讨论】:

  • 有什么要求?您是否尝试生成随机数?
  • 你有什么问题?
  • roadrunner66:我想将值 a 分配给例如另一个函数中的值 b 并每隔例如更新值 b 500 毫秒。因此,想象函数 generate_data 每 500 毫秒计数一次并增加值“a”,同时另一个函数读取“generate_data”并将“a”的值分配给另一个函数中的“b”值。
  • martineau:我应该更清楚地说明我的问题。目前我产生了价值,但我不知道如何从外部访问它并在不中断 while 循环的情况下以“实时”模式读取它。如果我只是运行我粘贴的代码而不是进入 while 循环并不断倒数……

标签: python python-2.7 numbers counter


【解决方案1】:

更新:根据 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)

原答案:

您需要在while 循环内的适当位置print a

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

【讨论】:

  • 打印没有给我任何东西?我应该考虑像线程这样的东西吗?
  • 您是要打印还是实际退回?
  • 根据我的问题:我想在 while & for 循环期间返回它,这样我就可以在 generate_data 函数中循环遍历“a”时将“a”的值分配给另一个函数中的另一个值。
  • 对不起,我刚才看了你的问题后面的cmets。恐怕我帮不了你。你需要搜索异步执行,如果python 2.7什么都没有,我会感到惊讶...
  • print 设为yield
【解决方案2】:

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()

【讨论】:

  • 它返回 SyntaxError: invalid syntax
  • 如果您至少使用 Python 3.4 则不会,因为 asyncio 和协程是非常新的。
  • 哈哈,好的。如何在 v2.7 中做到这一点?
  • 不知道,但您可能应该更新您的问题并指定您需要它在 2.7 上工作。
猜你喜欢
  • 2013-05-20
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多