首页 > 编程语言 >循环语法之编程模拟音乐播放器

循环语法之编程模拟音乐播放器

时间:2023-10-17 21:46:16浏览次数:37  
标签:播放器 index singer url 编程 语法 歌单 print songname

以音乐播放器软件的界面作为导入


提问学生:如果需要自己生成一个歌单,在歌单中有哪些较为重要的组成部分?
提取关键元素:歌曲名;歌手;歌曲顺序

编程实现一:利用顺序结构实现一个简单的歌单

回顾字符串类型与print()函数,实现下列代码

songname1 = "画"
songname2 = "借我"
songname3 = "秋酿"
print(songname1)
print(songname2)
print(songname3)

提问学生:如果这个歌单中有一百首歌曲,那么这样写法的代码存在什么问题?
答:代码行数过多,重复性过高

编程实现二:利用列表与循环结构实现歌单

回顾列表类型的使用,新学for循环结构语法,实现下列代码

songname = ["画", "借我", "秋酿"]
for i in songname:
    print(i)

编程实现三:补充其余歌单元素

提问学生:一个歌单中如果只有歌曲名字是否完整?
回答:不完整,还需要序号和歌手名
如何补充其余元素?

实现方法1: 写多个循环输出

#输出序号
index = ["1", "2", "3"]
for i in index:
    print(i)
#输出歌曲名
songname = ["画", "借我", "秋酿"]
for i in songname:
    print(i)
#输出歌手名
singer = ["赵雷", "谢春花", "房东的猫"]
for i in singer:
    print(i)

输出结果

1
2
3
画
借我
秋酿
赵雷
谢春花
房东的猫

提问学生:这样的写法好吗?
回答:不够直观,序号与歌曲名字、歌手名对应不上
提问学生:一个合格的歌单中是怎么呈现这三种元素的?
回答:在同一行中呈现一首歌曲的所有信息
总结:因此希望在一个for循环中,就能将歌曲所有的信息输出

实现方法2: 通过下标来索引列表元素(range函数实现)

思考同一首歌曲的信息在元素中的存在位置?
列表的索引下标相同
因此可以通过只循环下标参数,一次获取到每一首歌曲的所有信息
且对应的下标应该是:0, 1, 2
介绍新函数,range()函数的使用方法

for i in range(3):
    print(i)

现在下标的表示方法已知,可以通过一个循环打印完整的歌单

index = ["1", "2", "3"]
songname = ["画", "借我", "秋酿"]
singer = ["赵雷", "谢春花", "房东的猫"]
for i in range(3):
    print(index[i] + " " +  songname[i] + " " + singer[i])

实现方法三(不用range函数实现)

引导学生思考,除了用range函数来索引下标,我们定义的哪个元素与下标形式很像?
是否可以通过index作为下标?

index = ["1", "2", "3"]
songname = ["画", "借我", "秋酿"]
singer = ["赵雷", "谢春花", "房东的猫"]
for i in index:
    print(index[i-1] + " " +  songname[i-1] + " " + singer[i-1])

编程实现四:实现列表循环播放歌单

提问学生:普通的音乐播放软件中除了顺序播放,还有哪些播放选项?
学生回答:列表循环、随机循环、单曲循环
提问:现在时间长度为30,歌单中只有三首歌,如何体现该情景下的列表循环?
引导学生归纳思考不同时间段对应的歌曲下标,从而得出通过取余操作实现列表循环

songname = ["画", "借我", "秋酿"]
singer = ["赵雷", "谢春花", "房东的猫"]
for i in range(30):
    print(str(i+1) + " " +  songname[i%3] + " " + singer[i%3])

编程实现五:实现在歌单中存储五十首歌的信息

提问学生:之前学习的批量获取信息的方法还有印象吗?
回答:python爬虫
介绍python爬虫相关库以及xlrt库,实现用爬虫获取五十首歌曲并且打印输出
爬虫代码:

import xlwt
import requests
from bs4 import BeautifulSoup
import re


def get_url(url):
    try:
        r = requests.get(url)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print('wrong!!!!!!!!!!!!!')


def singer_url(url):
    # 只抓取前10位的歌手
    html = get_url(url)
    soup = BeautifulSoup(html, 'html.parser')
    top_10 = soup.find_all('div', attrs={'class': 'u-cover u-cover-5'})
    singers = []
    for i in top_10:
        singers.append(
            re.findall(r'.*?<a class="msk" href="(/artist\?id=\d+)" title="(.*?)的音乐"></a>.*?', str(i))[0])  # 问号有问题
        # 解析的代码和源代码的顺序不同,在用正则表达式的时候要注意
    song_info(singers)


def song_info(singers):
    url = 'http://music.163.com'

    for singer in singers:
        try:
            new_url = url + str(singer[0])
            songs = get_url(new_url)
            soup = BeautifulSoup(songs, 'html.parser')

            Info = soup.find_all('textarea', attrs={'style': 'display:none;'})[0]
            songs_url_and_name = soup.find_all('ul', attrs={'class': 'f-hide'})[0]
            # print(songs_url_and_name)

            datas = []
            data1 = re.findall(r'"album".*?"name":"(.*?)".*?', str(Info.text))
            data2 = re.findall(r'.*?<li><a href="(/song\?id=\d+)">(.*?)</a></li>.*?', str(songs_url_and_name))

            for i in range(len(data2)):
                datas.append([data2[i][1], data1[i], 'http://music.163.com/#' + str(data2[i][0])])
            # print(datas)
            save_excel(singer, datas)
        except:
            continue


def save_excel(singer, datas):
    fpath = '/Users/hsy/Desktop'
    book = xlwt.Workbook()
    sheet1 = book.add_sheet('sheet1', cell_overwrite_ok=True)
    sheet1.col(0).width = (25 * 256)
    sheet1.col(1).width = (30 * 256)
    sheet1.col(2).width = (40 * 256)
    # xlwt中列宽的值表示方法:默认字体0的1/256为衡量单位。
    # xlwt创建时使用的默认宽度为2960,既11个字符0的宽度
    # 所以我们在设置列宽时可以用如下方法:
    # width = 256 * 20    256为衡量单位,20表示20个字符宽度

    heads = ['歌曲名称', '专辑', '歌曲链接']
    count = 0

    print('正在存入文件......')
    for head in heads:
        sheet1.write(0, count, head)
        count += 1

    i = 1
    for data in datas:
        j = 0
        for k in data:
            sheet1.write(i, j, k)
            j += 1
        i += 1

    book.save(fpath + str(singer[1]) + '.xls')  # 括号里写存入的地址
    print('OK!')


def main():
    url = 'http://music.163.com/discover/artist/cat?id=1001'  # 华语男歌手页面
    singer_url(url)


main()

运行效果部分截图

歌曲信息输出代码:

import xlrd #读取excel的库

resArray=[] #先声明一个空list
data = xlrd.open_workbook("/Users/hsy/Desktop/chou.xls") #读取文件
table = data.sheet_by_index(0) #按索引获取工作表,0就是工作表1
songname = table.col_values(0) #读取每行数据,保存在line里面,line是list
album = table.col_values(1)
for i in range(50):
    print("time", i+1)
    print(songname[i], "--", album[i])

标签:播放器,index,singer,url,编程,语法,歌单,print,songname
From: https://www.cnblogs.com/hsy2093/p/17770776.html

相关文章

  • RESTful编程到底是什么?
    内容来自DOChttps://q.houxu6.top/?s=RESTful编程到底是什么?RESTful编程到底是什么?RESTful编程到底是什么?一种称为REST(表述性状态转移)的架构风格主张Web应用程序应该像最初所设想的那样使用HTTP。查找应该使用GET请求。PUT、POST和DELETE请求分别用于变更、创建和删除。R......
  • 课程概论与python3语法
    server端云盘:代替硬盘disk,存图片,视频,几百G、几TMysql:存代码,文本,几十GRedis:占用内存, client端WebStorageds内存 1、注释#......
  • DataWhale DAY2 基础语法1
    DataWhaleDAY2基础语法1今天主要是一点入门语法,import什么的,所以重点不放在上面。语法部分专门开一章:https://www.cnblogs.com/hewo/p/17635277.html关于浮点数精度问题,倒是有点意思。以前学c++的时候,尤其是计算几何的时候,经常设一个极小常量来比较,现在明白本质上是进......
  • Python神经网络编程pdf电子版 Tariq Rashid
    Python神经网络编程pdf电子版TariqRashid作者:[英]TariqRashid原作名:MakeYourOwnNeuralNetwork出版年:2018-4ISBN:9787115474810连接提取码:c75z本书对初学者极为友好,并且篇幅短小精悍,概念讲解明晰易懂,很适合作为神经网络入门第一书。书中作为例子实现的神经网......
  • Vue3.2中setup语法糖的使用教程分享
    这篇文章主要为大家详细介绍了Vue3.2中setup语法糖的具体使用方法,文中的示例代码讲解详细,对我们深入了解Vue有一定的帮助,需要的可以参考一下目录2、data数据的使用3、method方法的使用4、watchEffect的使用5、watch的使用6、computed计算属性的使用7、props父子传值的使用8、emit......
  • 实验一 类与对象_基础编程1
    task1.cpp1#include<iostream>2#include<string>3#include<vector>4#include<array>56template<typenameT>7voidoutput1(constT&obj){8for(autoi:obj)9std::cout<<i<<","......
  • Dockerfile语法
    一、dockerfile简介镜像是多层存储,每一层在前一层的基础上进行修改;容器也是多层存储,以镜像为基础层,在其基础上加一层作为容器运行时的存储层。创建镜像的两个方法:1.手动修改容器内容,然后dockercommit提交容器为新的镜像2.通过在dockerfile中定义一系列的命令和参数构成的......
  • MySQL基本语法和数字马力笔试
    1.DROPDATABASENAME;删除名字为NAME的数据库2.VARCHAR(10);可存储的最大字符长度为103.SELECTIDFROM表;从表中检索出ID的列4.DISTINCT搜索去重5.select两列时,用逗号分隔开6.排序orderby(默认升序,desc降序)7.按两种排序orderbya,b;8.selectquantity,item_pricefromOrderIt......
  • 极限编程
    极限编程(ExtremeProgramming,简称XP)是一种敏捷软件开发方法,旨在改善软件开发项目的质量和效率。XP强调迭代开发、持续反馈和高度协作,以便快速适应需求的变化。以下是XP的一些关键特点:用户故事(UserStories):XP使用用户故事来描述应用程序的功能,这有助于开发团队更好地理解客户需......
  • Java编程之道:巧妙解决Excel公式迭代计算难题
    本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。什么是迭代计算迭代计算其实是在Excel中,一种公式的循环引用,对于了解编程概念的同学,很容易会想到另一个词“递归”。简单的说,就是一段程序调用自己,......