有时候,要是一件事能同时搞定两个需求,那自然美美哒。
话说有这么一道题。我们都知道时间的其中一种表达方式是使用冒号来分割,例如:
十二点整,那就可以写为 ‘12:00’
下午三点半,就可以写为 ‘15:30’
…
然后尝试计算两个此格式的时间相加之后得到的时间,如果小时溢出,则忽略天数。
本着面向对象思想的教诲吧,那这次就优先封装成一个函数,这好办:
def func():
pass
函数封装完毕。
然后就是考虑输入参数的格式了,已知输入的参数是两个,且都是字符串,那就有两种可能:
一种是直接将字符串放进去
func('12:00', '15:30')
另一种是将两个字符串放在一个列表(元组)内传参
func(['12:00', '15:30'])
其实无非就是一个参数还是两个参数的区别,这里就优先考虑列表传参的方式吧。
def func(t):
ft = t[0] # 第一个时间
st = t[1] # 第二个时间
这里有点麻烦,因为对象里面的这俩时间是俩字符串,字符串又不能直接计算参数,所以还得把里面的字符转化为整数
def func(t):
ft = []
st = []
for i in t[0].split(':'):
ft.append(int(i))
for j in t[1].split(':'):
st.append(int(i))
嗯…看着有点臃肿,不符合python那种优雅简洁的feel。那既然只是把这个字符转成列表然后对列表里的每个元素进行批量且相同的操作,那不妨这里先推荐一下map吧:
map(F函数名, L列表) ==> 可以将左侧看做是对*L列表*内的每一个元素,都放到*F函数*中过一遍
-------理解了上面再看下面----------
list(map(**内容省略**)) ==> 新版本的map只能返回一个迭代器,可以通过外面再套一层list将其转换为列表
根据上面的案例,再加上map可以跟内置函数打一个配合,就成了下面这个样子:
a = [字符,字符,字符,字符...]
b = list(map(int, a))
print(b)
[整数,整数,整数,整数...]
ok,那么把刚才的那个函数简写一下:
def func(t):
ft = list(map(int, t[0].split(':')))
st = list(map(int, t[1].split(':')))
舒服了。
扯了半天,接下来就是今天的主题了。
我需要计算这个时间相加,说白了就是要分钟和分钟相加,小时和小时相加,而且重点是分钟是60进制的,而小时是24进制的,而且分钟相加多出来的小时还要补到小时位上去。
嗯…
先别想那么多,一个个来,分钟和分钟相加吧:
分钟相加 = ft[1] + st[1]
那万一加在一起等于62,那就等于是1小时零2分钟了,所以分钟相加后的结果取余60,余数就是分钟数,而相除的除数就是小时数
62分钟 ==》 62 // 60 = 1小时; 62 % 60 = 2分钟
那么就要说说神奇的内置小函数divmod了,它好在哪儿?
它好就好在,
它好在它就能一次给你俩结果,一个除数,一个余数:
a, b = divmod(62, 60) # 计算 62 与 60 相除的结果和余数
a ==> 1
b ==> 2
那,分钟计算就可以了
m = divmod(ft[1] + st[1], 60)
这样,m[0]就是多出的小时数,m[1]就是剩下的分钟数。
那小时数相加就是:
h = (ft[0]+st[0]+m[0]) % 24
代码如下:
def func(t):
ft = list(map(int, t[0].split(':')))
st = list(map(int, t[1].split(':')))
m = divmod(ft[1] + st[1], 60)
return (ft[0] + st[0]+ m[0]) % 24 , m[1]
当然了也可以点缀一下,比如担心输入的时间不合规矩啦,毕竟来个‘250:250’算什么事嘛;或者干脆输入个‘男他:女她’也扛不住,所以可以加点判断:
def func(t):
try:
ft = list(map(int, t[0].split(':')))
st = list(map(int, t[1].split(':')))
if (ft[0] > 24 or st[0] > 24 or ft[1] > 60 or st[1] > 60):
return '数字大于时间格式'
m = divmod(ft[1] + st[1], 60)
return (ft[0] + st[0]+ m[0]) % 24 , m[1]
except:
return '输入格式不正确'