2007-08-08
Python Cookbook 3.4 计算播放歌曲的时长
需求:
你需要知道播放列表中歌曲的总时长。
讨论:
使用datetime模块的内建函数sum来作统计工作:
import datetime
def totaltimer(times):
td = datetime.timedelta(0) # initial value of sum (must be a timedelta)
duration = sum([
datetime.timedelta(minutes=m, seconds=s) for m, s in times],
td)
return duration
if _ _name_ _== '_ _main_ _': # test when module run as main script
times1 = [(2, 36), # list containing tuples (minutes, seconds)
(3, 35),
(3, 45),]
times2 = [(3, 0),
(5, 13),
(4, 12),
(1, 10),]
assert totaltimer(times1) == datetime.timedelta(0, 596)
assert totaltimer(times2) == datetime.timedelta(0, 815)
print ("Tests passed.\n"
"First test total: %s\n"
"Second test total: %s" % (
totaltimer(times1), totaltimer(times2)))
当我工作的时候,会播放一个很大的播放列表。我想知道自己选择的歌曲的总时长,而不是重新建立一个播放列表,所以写下了这个脚本。
一个datetime.timedelta对象一般返回两个给定的datetime对象的差值 。当然,你也可以创建自己的timedelta对象来衡量任意之间的差值。在在这里,我们需要计算时长,所以timedelta正是我们需要的。
datetime.timedelta函数可以有很多可选参数:days,seconds,microseconds,milliseconds,minutes,hours,weeks.所以,创建对象的时候,你需要使用命名参数,否则自己会被搞混的。如果你仅仅使用了datetime.timedelta(m,n),而没有使用命名参数,该类会认为m表示days,n表示seconds,那真的会产生很奇怪的结果。
使用内建的sum函数来计算一个列表中的值比如timedelta,你需要给sum传递第二个参数来表示初始值,否则它会初始为0,整数0,而你会得到一个异常,因为将整数和timedelta相加。列表中的对象需要支持数字加法。(strings是没有加法的,所以,不要用sum来加string或者别的列表!)。在Python2.4中,对于sum的第一个参数,我们可以用生成表达式来替换[],这样我们可以方便的处理具有大数据量的列表。
为了测试目的,我自己手动创建了一个列表,里面的元组表示分钟和秒。这个脚本可以修改为加强版,比如支持更多的格式(如mm:ss)或者直接从文件中读取数据。
相关说明:
sum(...)
sum(sequence, start=0) -> value
Returns the sum of a sequence of numbers (NOT strings) plus the value
of parameter 'start'. When the sequence is empty, returns start.
你需要知道播放列表中歌曲的总时长。
讨论:
使用datetime模块的内建函数sum来作统计工作:
import datetime
def totaltimer(times):
td = datetime.timedelta(0) # initial value of sum (must be a timedelta)
duration = sum([
datetime.timedelta(minutes=m, seconds=s) for m, s in times],
td)
return duration
if _ _name_ _== '_ _main_ _': # test when module run as main script
times1 = [(2, 36), # list containing tuples (minutes, seconds)
(3, 35),
(3, 45),]
times2 = [(3, 0),
(5, 13),
(4, 12),
(1, 10),]
assert totaltimer(times1) == datetime.timedelta(0, 596)
assert totaltimer(times2) == datetime.timedelta(0, 815)
print ("Tests passed.\n"
"First test total: %s\n"
"Second test total: %s" % (
totaltimer(times1), totaltimer(times2)))
当我工作的时候,会播放一个很大的播放列表。我想知道自己选择的歌曲的总时长,而不是重新建立一个播放列表,所以写下了这个脚本。
一个datetime.timedelta对象一般返回两个给定的datetime对象的差值 。当然,你也可以创建自己的timedelta对象来衡量任意之间的差值。在在这里,我们需要计算时长,所以timedelta正是我们需要的。
datetime.timedelta函数可以有很多可选参数:days,seconds,microseconds,milliseconds,minutes,hours,weeks.所以,创建对象的时候,你需要使用命名参数,否则自己会被搞混的。如果你仅仅使用了datetime.timedelta(m,n),而没有使用命名参数,该类会认为m表示days,n表示seconds,那真的会产生很奇怪的结果。
使用内建的sum函数来计算一个列表中的值比如timedelta,你需要给sum传递第二个参数来表示初始值,否则它会初始为0,整数0,而你会得到一个异常,因为将整数和timedelta相加。列表中的对象需要支持数字加法。(strings是没有加法的,所以,不要用sum来加string或者别的列表!)。在Python2.4中,对于sum的第一个参数,我们可以用生成表达式来替换[],这样我们可以方便的处理具有大数据量的列表。
为了测试目的,我自己手动创建了一个列表,里面的元组表示分钟和秒。这个脚本可以修改为加强版,比如支持更多的格式(如mm:ss)或者直接从文件中读取数据。
相关说明:
sum(...)
sum(sequence, start=0) -> value
Returns the sum of a sequence of numbers (NOT strings) plus the value
of parameter 'start'. When the sequence is empty, returns start.
标签: Python