Python练手(一)
来源:互联网 发布:java magic number 编辑:程序博客网 时间:2024/04/30 11:35
Python的一个习题
这段时间一直在学习Python,把基础语法看完之后,就像找一点小练习来测试一下学习的程度,但是网络上大部分的东西都是一些算术题,比如水仙花算法,杨辉三角等等问题,做起来没什么意思,旁边一个前端开发的哥们给我出了一个题,挺有意思的,发出来给大家看看,一起学习学习。
前提的前提:
- 你需要了解Python的基本语法,循环等知识
- 你需要了解Python对文件的读写
歌词动态显示:
- 打开百度,搜索光辉岁月(当然也可以是其他的歌词,前端开发那哥们很喜欢这首歌,就让我搜索了这首歌)
- 把歌词文件光辉岁月.lrc下载下来
- 把lrc文件中的文本贴到一个ghsy.txt的文本中(据说直接读取lrc文件也是可以的,我没有试过)
- 用Python把歌词按照演唱的顺序一句一句打印出来
最终的效果:
把音乐打开的同时启动脚本,音乐放到哪句,Python程序就会打印出唱的那句的歌词。
上面说完了习题的内容,现在说说我的思想
- 首先需要分析一下文件的内容
[00:00.08]光辉岁月
[00:00.82]演唱:Beyond
[00:01.51]
[00:29.09]钟声响起归家的讯号
[00:33.65]在他生命里
[00:36.87]彷佛带点唏嘘
[00:42.10]黑色肌肤给他的意义
[00:46.58]是一生奉献 肤色斗争中
上面是歌词文件的格式,最关键的内容就是时间与歌词的剥离,简单来说就是我们要把每一句的时间取出来,按照时间的顺序做一个延迟,然后根据时间的延迟,把歌词一句一句打出来
需要引用的模块
- OS模块。当然也不一定就一定要OS模块,你直接指定一个路径也是可以的(我就是这么懒,没有使用OS模块)
- time模块。我们需要时间延迟,那必须要用到时间的模块
开工
time模块的使用方法大家可以自行百度,但是使用time模块之后,返回的时间是微秒(坑爹啊,为毛线不是毫秒),我们可以看歌词文件中的时间格式是【分:秒:毫秒】,并没有微秒啊!!!!没有微秒啊!!!!没有微秒啊!!!
只能自己去执行一个转换了,我是把歌词文件中的时间全部转成微秒来计算,代码如下:
def changenum(shijian): return float(shijian[0:2]) * 60 * 100000 + float(shijian[3:5]) * 100000 + float(shijian[6:])*100
这样歌词的时间和Python的时间格式就一致了
处理时间对应歌词
只处理时间肯定是不行的,我们需要把时间和歌词关联起来,每一行歌词和时间都是对应的,我们需要吧他做一个切片处理,把时间和歌词分隔开后再做一个映射,有两种方法
1.使用字典,时间为key歌词内容为value,用k-v对的方式来处理映射
2.使用列表,因为列表是有顺序的,我们可以按顺序吧时间插入一个列表,再按顺序把歌词插入另一个列表,这样只要按顺序走,L1[0]就是对应L2[0]
以上两种方法理论上都是OK的,笔者这里使用的是列表的方式。
新建3个列表L1L2L3,分别用于存放:记录歌词时间、记录歌词内容和记录时间差,把文档内容切片存储到L1和L2之后,再把计算出来的时间差存到L3中,最后只要按照时间差用for循环打印出歌词就行了
后记
本文属于新手的练习题,比起网络上那些乱七八糟的数学题做起来有意思的多,在编写的过程中会遇到很多很多奇葩的问题,在解决问题的过程中自己慢慢摸索,当你看到打印出歌词的那一刻,心里会有莫大的成就感。当然,把这个写完之后可以在这个基础上做一些扩展:
1. 从网络上获取歌词进行打印
2. 写一个gui,让歌词在gui上显示
3. 做一个播放器,链接网上的歌曲和歌词,变成一个自己的播放器
最后的最后,放上源码。
#coding:utf-8import time#把字符创时间换算成微秒def changenum(shijian): return float(shijian[0:2]) * 60 * 100000 + float(shijian[3:5]) * 100000 + float(shijian[6:])*100list1 = [] #记录歌词时间list2 = [] #记录歌词内容list3 = [] #记录每句歌词的时间差myFile = open("guanghuisuiyue.txt")#把歌词中的时间和歌词内容分别插入两个列表for x in myFile: if x.strip(): list1.append(x[1:9]) list2.append(x[10:])#计算出时间差插入一个列表for i in range(len(list1)-1): list3.append(changenum(list1[i+1])-changenum(list1[i]))#按时间差输出歌词for j in range(len(list3)): time.sleep(list3[j]/100000) print list2[j] print "end"myFile.close()
- Python练手(一)
- python练手之爬虫篇(一)
- Python 练手程序合集(一)
- 练手小程序(一)
- php学习练手(一)
- Python 练手程序合集(二)
- Python 练手程序合集(三)
- python练手--自制俄罗斯方块(文末附源码)
- Python练手项目(来源于知乎)
- python 练手 -- 媒体播放器
- #python#异常处理练手
- Python练手程序
- python-socket练手
- python爬虫练手二
- python练手项目0005
- Python练手项目0006
- python练手项目0007
- Python练手项目0008
- 3种编程范式间的异同
- “firefox profile cannot be loaded" "server cannot be found"
- 单例模式的七种写法
- C++类的常量对象与常量成员函数
- 手把手教你在ios上开发web应用
- Python练手(一)
- Spring RESTful服务接收和返回JSON最佳实践
- test
- 【Leetcode】Merge k Sorted Lists
- Semaphore使用
- 机器学习实战python版归一化数值和测试kNN算法以及构建完整可用系统
- win7系统下安装VS2010和IIS7问题汇总
- POJ 3259 *** Wormholes
- linux的文件结构详解