仅在IDLE中为Python 3.3创建秒表程序

时间:2016-06-01 20:42:54

标签: python python-3.x

我有一项任务,我需要创建一个秒表,但仅限于IDLE。这是我到目前为止所做的,我不知道如何将时间转换为正常时间。

import time
start = 0
def stopwatch():
    while True:
        command = input("Type: start, stop, reset, or quit: \n")
        if (command == "quit"):
            break
        elif (command == "start"):
            start = time.time()
            print(start)
            stopwatch2()
        elif (command == "stop"):
            stopwatch()
        elif (command == "reset'"):
              stopwatch()
        else :
            break

def stopwatch2():
    while True:
        command = input("Type: stop, reset, or quit: \n")
        if (command == "quit"):
            break
        elif (command == "stop"):
            total = time.time() - start
            print(total)
            stopwatch()
        elif (command == "reset'"):
              stopwatch()
        else:
            break

stopwatch()

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您可以使用datetime.timedelta()

import datetime

print(datetime.timedelta(seconds=total))

例如:

In [10]: print datetime.timedelta(seconds=10000000)
115 days, 17:46:40

答案 1 :(得分:0)

把它想象成这样......空闲与我一直在做的交互式python解释器编码没什么不同(好吧,我使用ipython)。

将秒表视为物体。它有什么功能?像开始,停止,重置等事情。

这可能不是解决问题的最有效方法,但我会这样做。

>>> import time
>>> class StopwatchException:
    pass

>>> class IsRunningException(StopwatchException):
    pass

>>> class NotRunningException(StopwatchException):
    pass

>>> class Stopwatch():
    def __init__(self):
        self._times = []
        self._is_running = False
    def start(self):
        if self._is_running:
            raise IsRunningException
        self._is_running = True
        tracker = {
            'start': time.time(),
            'stop': None,
            }
        self._times.append(tracker)
    def stop(self):
        if not self._is_running:
            raise NotRunningException
        tracker = self._times[-1]
        # the dict is mutable, and tracker is a shallow copy
        tracker['stop'] = time.time()
        #print(self._times[-1])
        self._is_running = False
    def reset(self):
        if self._is_running:
            raise IsRunningException
        self._times = []
    def total(self):
        if self._is_running:
            raise IsRunningException
        total = 0.0
        for t in self._times:
            total += t['stop'] - t['start']
        return total

>>> s = Stopwatch()
>>> s.start()
>>> s.stop()
>>> s.total()
6.499619960784912
>>> s.reset()
>>> s.total()
0.0

对我来说,无论何时你想要建模一个真实世界的对象或者#34;事物都是最有意义的。对于程序的每个元素,只有一个简单的参数:

  • StopwatchException
    • 秒表类的基本异常类。
  • IsRunningException
    • 如果秒表在停止时正在运行,则会抬起。
  • NotRunningException
    • 如果秒表未运行则抬起。
  • 秒表
    • 这代表实际的秒表。

秒表类

  • 初始化
      

    基本的秒表类实际上只需要实例变量。存储每个开始/停止时间的变量(允许它们稍后计算)和存储"状态的变量"秒表(开/关或跑/停)。

  • start
    1. 首先,我们需要确保秒表尚未运行。
    2.   

      然后我们需要将其状态设置为运行并将时间存储在self._times中。   我选择使用局部变量,并将每个时间对存储为字典,并使用键“开始”#39;并且'停止'我选择了一本字典,因为它是可变的。您还可以有一个列表,其中索引0是开始时间,索引1是停止时间。你不能使用元组,因为元组是不可变的。   此外,"临时"变量不是必需的,但我将其用于可读性。

  • stop
    1. 首先我们需要确保秒表实际上正在运行。
    2.   

      然后我们将状态设置为“停止”' (使用我们的布尔值self._is_running)并存储我们的停止时间,类似于我们对start所做的操作。我认为你是否在开头或结尾设置布尔值并不重要,尽管我选择将它设置在start函数的开头和stop函数的结尾,以便时间不包括时间需要更新一个布尔变量(即使它是一项微不足道的任务,在更复杂的程序中它可能要复杂得多)。

  • reset
    1. 确保秒表不运行
    2. self._times设为空列表。
  • total
    1. 确保秒表不运行。
      • 可选:如果秒表正在运行,您可以在此停止秒表,但我更愿意提出异常。
    2. 遍历self._times中的每个列表项,并计算停止和开始之间的差异。