作为计时器运行的功能会下降?

时间:2013-11-17 18:32:11

标签: python function math testing timer

我是编程新手,我正在尝试为幼儿创建数学测验。他们必须在60秒内回答尽可能多的问题。我有一个计时器和一个问题生成器

然而问题是,我不能让他们同时运行,例如,程序等待1秒,问一个问题,等到用户回答它,然后继续使用计时器等我希望计时器继续前进,而不是在问题得到解答时停止!

这是我的计时器:

timer = 5
time.sleep(1)
timer -= 1

我的问题是通过定义变量(我已将其缩短为加法)生成的:

def questions():
    first_number = random.randint(1, 50)
    second_number = random.randint(1, 50)
    print("What is", first_number, "+", second_number,"?")
    answer = int(input("Answer: "))
    if answer == first_number + second_number:
        print("Correct!")
        addition_score += 1
    else:
        print("Wrong!")

2 个答案:

答案 0 :(得分:1)

打断input()比应该更难。让我们首先关注一个更简单的任务:您想要反复调用questions(),直到总耗用时间为60秒或更长。你可以通过用time.time()测量时间来做到这一点,start_time = time.time() # "now" at the start while time.time() < start_time + 60: # "not 60 seconds later" questions() 返回一些秒,因为......一些随机的“时间零点”---无所谓。代码:

time.sleep()

诀窍不是使用input():在技术术语中,questions()调用已经“阻塞”,并且您只能同时运行一个阻塞函数(除非您引入线程或多个过程,这在这里完全矫枉过正。)

如果答案正确,最后一个问题将计为+1,即使它在超过60秒后得到回答。可以通过让score += 1返回True或False来更改此逻辑,并仅在返回True 时执行signal.alarm(60)部分,如果还有剩余时间则返回

如果你想在60秒后真正中断,那就稍微硬了一点。试试例如signal.signal(signal.SIGALRM, signal.default_int_handler)(不在Windows上)。它会在给定的秒数后发出“闹钟”信号。默认情况下它会杀死进程;如果你想抓住它并做其他事情,请尝试另外做:try: while True: # infinite loop, until interrupted questions() except KeyboardInterrupt: pass # interrupted, now we're out of the loop 。它会在60秒后模拟一个Ctrl-C,你可以使用它来捕捉:

time.time()

(此版本中不再需要{{1}}。)

答案 1 :(得分:0)

Process库中试用multiprocessing。请查看其他答案:https://stackoverflow.com/a/7207336/583834