Python 这个倒计时器是怎么工作的?

Python 这个倒计时器是怎么工作的?,python,Python,我已经看了一段时间了,一直在思考它是如何工作的。 我知道它的第一部分,但当我到柜台时,我就被卡住了 hr, sc = divmod(counter, 3600) mn, sc = divmod(sc, 60) 我已经研究了divmod(),但我仍然对它的实际功能感到困惑。为什么sc在其他任何地方都没有定义,却在这里工作 总结如下: 1:什么是divemod() 2:上面的代码在下面的倒计时中做什么?它是如何做的 hours= int(input("Hours: ")) minu

我已经看了一段时间了,一直在思考它是如何工作的。 我知道它的第一部分,但当我到柜台时,我就被卡住了

    hr, sc = divmod(counter, 3600)
    mn, sc = divmod(sc, 60)
我已经研究了divmod(),但我仍然对它的实际功能感到困惑。为什么sc在其他任何地方都没有定义,却在这里工作

总结如下:

1:什么是divemod() 2:上面的代码在下面的倒计时中做什么?它是如何做的

hours= int(input("Hours: "))
minutes= int(input("Minutes: "))
sec= int(input("Seconds: "))

counter=hours*3600+minutes*60+sec
mins=int(counter/60)
hr=int(mins/60)

while counter > 0:
    counter-=1
    hr, sc = divmod(counter, 3600)
    mn, sc = divmod(sc, 60)
    print ('%d hours, %d minutes and %d seconds' % (hr, mn, sc))
    mins=int(counter/60)
    hr=int(mins/60)
    time.sleep(1)

谢谢

Divmod是一个函数,它执行除法运算并返回两个值:整数商和余数。从技术上讲,它返回一个两位数的元组,并将其解压缩到两个变量中

例如,
divmod(10,3)
返回
(3,1)
,其中3是
10/3
的结果,1是
10%3
(10 mod 3)的结果

a,b=divmod(10,3)
相当于
a,b=(3,1)
,它将3分配给
a
,将1分配给
b

在计时器的情况下,这是以秒为值,并根据小时数和分钟数来计算秒数。每3600秒为一小时,每60秒(减去小时后)为分钟

因此,当计时器中剩余的秒数为10000时,第一个divmod表示“这实际上是2小时2800秒”,第二个divmod表示“这实际上是46分40秒。”这两行加在一起表示“10000秒实际上是2小时46分40秒。”


撇开1不说,执行这些计算的代码需要非零时间,因此这个倒计时计时器实际上比预期的慢,因为它每秒钟倒计时所需的时间略多于一秒(它休眠一秒,然后执行一些计算)


除了2,您编写的代码可以简化为以下内容:

hours = int(input("Hours: "))
minutes = int(input("Minutes: "))
seconds = int(input("Seconds: "))

counter = hours*3600 + minutes*60 + seconds

while counter > 0:
    counter -= 1
    hours, seconds = divmod(counter, 3600)
    minutes, seconds = divmod(seconds, 60)
    print('%d hours, %d minutes and %d seconds' % (hours, minutes, seconds))
    time.sleep(1)
hours = int(raw_input("Hours: "))
minutes = int(raw_input("Minutes: "))
seconds = int(raw_input("Seconds: "))

除3外,注意输入函数。如果用户键入表达式而不是数字,则python解释器将对其求值。看

您已经将输入结果强制转换为整数。使用
raw_input
代替
input
!!!!!(除非这是python3,在这种情况下,
raw\u input
已重命名为
input
)。对于python2,请执行以下操作:

hours = int(input("Hours: "))
minutes = int(input("Minutes: "))
seconds = int(input("Seconds: "))

counter = hours*3600 + minutes*60 + seconds

while counter > 0:
    counter -= 1
    hours, seconds = divmod(counter, 3600)
    minutes, seconds = divmod(seconds, 60)
    print('%d hours, %d minutes and %d seconds' % (hours, minutes, seconds))
    time.sleep(1)
hours = int(raw_input("Hours: "))
minutes = int(raw_input("Minutes: "))
seconds = int(raw_input("Seconds: "))

提示:
divmod
对两个数字进行除法,并返回商和余数。你所说的
是什么意思?为什么sc在其他地方没有定义,却在这里工作?
<代码>sc在
hr,sc=divmod(计数器,3600)
行中定义。这一行定义了两个变量。这会让它更有意义吗?只是语法中左边有两个变量吗?这些只是与等号右侧的两个匹配。相关:@user3763447:这称为“元组解包”。您可以在中阅读更多内容。谢谢您的富有洞察力的回答。它完美地解释了一切。还有,你是说这个计时器会关闭一秒钟?如果是这样的话,你有没有一个更好的计时器,可以类似地打印出来?例:1小时20分钟30分钟seconds@user3763447并不是说它会在一秒钟内关闭。这意味着每秒倒计时大约需要1.0005秒(尽管这个数字可能会因您运行的系统和其他运行的系统而异)。@user3763447要制作一个精确的计时器,您需要存储
timer\u start=datetime.datetime.now()
在程序开始时,使用当前时间和
计时器\u start
之间的差值,而不是
计数器
。或者,
timeit
库具有除
datetime
之外的其他选项。