大作业day02

'''此文作者为金元'''

'''
练习题:
1、有变量name = "aleX leNb" 完成如下操作:
'''
''' 1) 移除 name 变量对应的值两边的空格,并输出处理结果'''
# name = " aleX leNb "
# print(name.strip())

''' 2) 移除name变量左边的"al"并输出处理结果'''
'''解法一'''
# name = "aleX leNb"
# print(name[2:])
'''解法二'''
# print(name.strip("al"))

''' 3) 移除name变量右面的"Nb",并输出处理结果'''
'''解法一'''
# name = "aleX leNb"
# print(name[:-2])
'''解法二'''
# print(name.strip('Nb'))

''' 4) 移除name变量开头的a"与最后的"b",并输出处理结果'''
# name = "aleX leNb"
# print(name[1:-1])

''' 5) 判断name变量是否以 "al" 开头,并输出结果'''
# name = "aleX leNb"
# print(name.startswith('al'))

''' 6) 判断name变量是否以"Nb"结尾,并输出结果'''
# name = "aleX leNb"
# print(name.endswith('Nb'))

''' 7) 将name变量对应的值中的所有的"l" 替换为 "p",并输出结果'''
# name = "aleX leNb"
# print(name.replace('l','p'))

''' 8) 将name变量对应的值中的第一个"l"替换成"p",并输出结果'''
# name = "aleX leNb"
# print(name.replace('l','p',1))

''' 9) 将name变量对应的值根据所有的"l" 分割,并输出结果。'''
# name = "aleX leNb"
# print(name.rsplit('l'))

''' 10) 将name变量对应的值根据第一个"l"分割,并输出结果。'''
# name = "aleX leNb"
# print(name.rsplit('l'))

''' 11) 将name变量对应的值变大写,并输出结果'''
# name = "aleX leNb"
# print(name.upper())

''' 12) 将name变量对应的值变小写,并输出结果'''
# name = "aleX leNb"
# print(name.lower())

''' 13) 将name变量对应的值首字母"a"大写,并输出结果'''
# name = "aleX leNb"
# print(name.capitalize())

''' 14) 判断name变量对应的值字母"l"出现几次,并输出结果'''
# name = "aleX leNb"
# print(name.count('l'))

''' 15) 如果判断name变量对应的值前四位"l"出现几次,并输出结果'''
# name = "aleX leNb"
# print(name[:4].count('l'))

''' 16) 从name变量对应的值中找到"N"对应的索引(如果找不到则报错),并输出结果'''
# name = "aleX leNb"
# print(name.index('N'))

''' 17) 从name变量对应的值中找到"N"对应的索引(如果找不到则返回-1)输出结果'''
# name = "aleX leNb"
# print(name.find('N'))

''' 18) 从name变量对应的值中找到"X le"对应的索引,并输出结果'''
# name = "aleX leNb"
# print(name.find('X le'))

''' 19) 请输出 name 变量对应的值的第 2 个字符?'''
# name = "aleX leNb"
# print(name[1])

''' 20) 请输出 name 变量对应的值的前 3 个字符?'''
# name = "aleX leNb"
# print(name[2])

''' 21) 请输出 name z变量对应的值的后 2 个字符?'''
# name = "aleX leNb"
# print(name[-2:])

''' 22) 请输出 name 变量对应的值中 "e" 所在索引位置?'''
# name = "aleX leNb"
# print(name.find('e'),name.rfind('e'))


'''
2、有字符串s = "123a4b5c"
'''
''' 1)通过对s切片形成新的字符串s1,s1 = "123"'''
# s = "123a4b5c"
# s1 = s[:3]
# print(s1)

''' 2)通过对s切片形成新的字符串s2,s2 = "a4b"'''
# s = "123a4b5c"
# s2 = s[3:-2]
# print(s2)

''' 3)通过对s切片形成新的字符串s3,s3 = "1345"'''
# s = "123a4b5c"
# s3 = s[::2]
# print(s3)

''' 4)通过对s切片形成字符串s4,s4 = "2ab" '''
# s = "123a4b5c"
# s4 = s[1:-2:2]
# print(s4)

''' 5)通过对s切片形成字符串s5,s5 = "c" '''
# s = "123a4b5c"
# s5 = s[-1]
# print(s5)

''' 6)通过对s切片形成字符串s6,s6 = "ba2" '''
# s = "123a4b5c"
# s6 = s[-3::-2]
# print(s6)

'''3、使用while或for循环分别打印字符串s="asdfer"中每个元素。'''
''' 1)while方法'''
# s = "asdfer"
# b = len(s)
# a = 0
# while a < b:
# print(s[a])
# a += 1

''' 2)for方法'''
# s = "asdfer"
# for i in s:
# print(i)


''' 4、使用for循环对s="asdfer"进行循环,但是每次打印的内容都是"asdfer"。'''
# s = "asdfer"
# for i in s:
# print(s)


''' 5.使用for循环对s="abcdefg"进行循环,每次打印的内容是每个字符加上sb, 例如:asb, bsb,csb,...gsb。'''
# s="abcdefg"
# for i in s:
# print(i+'sb')


''' 6、使用for循环对s="321"进行循环,打印的内容依次是:"倒计时3秒","倒计时2秒","倒计时1秒","出发!"。'''
# s = '321'
# for i in s:
# print('倒计时'+i+'秒')
# else:
# print("出发")


''' 7. 实现一个整数加法计算器(两个数相加)
如:content = input("请输入内容:") 用户输入:5+9或5+ 9或5 + 9,然后进行分割再进行计算。'''
# num = input("请输入你相加的数字:").replace(' ','')
# print(int(num[0])+int(num[2]))


'''8、升级题:实现一个整数加法计算器(多个数相加)
如:content = input("请输入内容:") 用户输入:5+9+6 +12+ 13,然后进行分割再进行计算。'''
# content = input("请输入内容:").replace(' ','').replace('+','')
# # print(content)
# # a = []
# # for i in content:
# # a.append(int(i))
# # print(sum(a))


'''9、计算用户输入的内容中有几个整数(以个位数为单位)。
如:content = input("请输入内容:") # 如fhdal234slfh98769fjdla'''
# content = input("请输入内容:")
# a = []
# b = []
# for i in content:
# a.append(i)
# for w in a:
# if '0' <= w <= '9':
# b.append(w)
# print(len(b))

''' 10、写代码,完成下列需求:
用户可持续输入(用while循环),用户使用的情况:
输入A,则显示走大路回家,然后在让用户进一步选择:
是选择公交车,还是步行?
选择公交车,显示10分钟到家,并退出整个程序。
选择步行,显示20分钟到家,并退出整个程序。
输入B,则显示走小路回家,并退出整个程序。
输入C,则显示绕道回家,然后在让用户进一步选择:
是选择游戏厅玩会,还是网吧?
选择游戏厅,则显示 ‘一个半小时到家,爸爸在家,拿棍等你。’并让其重新输入A,B,C选项。
选择网吧,则显示‘两个小时到家,妈妈已做好了战斗准备。’并让其重新输入A,B,C选项。'''
'''解法一'''
# while True:
# num = input("你要怎么回家,提示A、B、C回家方法:").replace(' ','').upper()
# if num == 'A':
# print("显示走大路回家")
# bus = input("你选择公交还是车还是步行,提示公交为1步行为2").replace(' ','')
# if bus == '1':
# print("10分钟到家")
# break
# elif bus == '2':
# print("20分钟到家")
# break
# elif num == 'B':
# print("显示走小路回家")
# break
# elif num == 'C':
# gram = input("是选择游戏厅玩会,还是网吧?提示1网吧、2游戏厅").replace(' ','')
# if gram == '1':
# print("一个半小时到家,爸爸在家,拿棍等你。必须回家")
# continue
# elif gram == '2':
# print("两个小时到家,妈妈已做好了战斗准备。必须回家")
# continue
# else:
# print("找死啊,赶紧回家")

'''解法二'''
# dic = {'A': {'走大路回家': {"公交车": "10分钟到家", "步行": "20分钟到家"}},
# 'B': {"直接回家": "10分钟到家"},
# 'C': {'绕道回家': {'游戏厅': "一个半小时到家,爸爸在家,拿棍等你",
# "网吧": "两个小时到家,妈妈已做好了战斗准备"}}}
# while True:
# for i in dic:
# print(i, dic[i].keys())
# num = input("你要怎么回家:")
# if num == 'A':
# bus = input("请选择公交还是步行1为公交、2为步行:")
# if bus == '1':
# print(dic['A']['走大路回家']['公交车'])
# break
# elif bus == '2':
# print(dic['A']['走大路回家']['步行'])
# break
# elif num == 'B':
# print(dic['B']['直接回家'])
# break
# elif num == 'C':
# rao = input("你想先去游戏厅(1)还是网吧(2):")
# if rao == '1':
# print(dic['C']['绕道回家']['游戏厅'])
# continue
# elif rao == '2':
# print(dic['C']['绕道回家']["网吧"])
# continue
# else:
# print("重新输入")


''' 11、写代码:计算 1 - 2 + 3 ... + 99 中除了88以外所有数的总和?'''
# sum = 0
# for i in range(100):
# if i == 88:
# continue
# elif i % 2 == 0:
# sum -= i
# else:
# sum += i
# print(sum)


''' 16、制作趣味模板程序需求:等待⽤户输⼊名字、地点、爱好,根据⽤户的名字和爱好进⾏任意现实
如:敬爱可亲的xxx,最喜欢在xxx地⽅⼲xxx'''
# name = input("名字:")
# who = input("地点:")
# habby = input("爱好:")
# print("敬爱可亲的{},最喜欢在{}地⽅⼲{}".format(name,who,habby))


''' 17、等待⽤户输⼊内容,检测⽤户输⼊内容中是否包含敏感字符?如果存在敏感字符提示
“存在敏感字符请重新输⼊”,并允许⽤户重新输⼊并打印。敏感字符:“⼩粉嫩”、“⼤铁锤”'''
# a = ['小粉嫩','大铁锤']
# while True:
# av = input("输入你想看的电视剧:")
# if av in a:
# print("敏感字符请重新输⼊")
# else:
# print("期待更好的相遇")
# break


''' 18、写代码,有如下列表,按照要求实现每一个功能'''
'''li = ["alex", "WuSir", "ritian", "barry", "wenzhou"]'''
''' 1)计算列表的长度并输出'''
# li = ["alex", "WuSir", "ritian", "barry", "wenzhou"]
# print(len(li))

''' 2)列表中追加元素"seven",并输出添加后的列表'''
# li = ["alex", "WuSir", "ritian", "barry", "wenzhou"]
# li.append('seven')
# print(li)

''' 3)请在列表的第1个位置插入元素"Tony",并输出添加后的列表'''
# li = ["alex", "WuSir", "ritian", "barry", "wenzhou"]
# li.insert(0,'Tony')
# print(li)

''' 4)请修改列表第2个位置的元素为"Kelly",并输出修改后的列表'''
# li = ["alex", "WuSir", "ritian", "barry", "wenzhou"]
# li.insert(1,'Kelly')
# print(li)

''' 5)请将列表l2=[1,"a",3,4,"heart"]的每一个元素添加到列表li中,一行代码实现,不允许循环添加。'''
# li = ["alex", "WuSir", "ritian", "barry", "wenzhou"]
# l2=[1,"a",3,4,"heart"]
# li.append(l2)
# print(li)

''' 6)请将字符串s = "qwert"的每一个元素添加到列表li中,一行代码实现,不允许循环添加。'''
# li = ["alex", "WuSir", "ritian", "barry", "wenzhou"]
# s = 'qwert'
# li.extend(s)
# print(li)

''' 7)请给列表添加元素"eric",并输出添加后的列表'''
# li = ["alex", "WuSir", "ritian", "barry", "wenzhou"]
# li.append('eric')
# print(li)

''' 8)请删除列表中的第2个元素,并输出删除的元素和删除元素后的列表'''
'''解法一'''
# li = ["alex", "WuSir", "ritian", "barry", "wenzhou"]
# li.remove("WuSir")
# print(li)
'''解法二'''
# li = ["alex", "WuSir", "ritian", "barry", "wenzhou"]
# del li[1]
# print(li)

''' 9)请删除列表中的第2至4个元素,并输出删除元素后的列表'''
# li = ["alex", "WuSir", "ritian", "barry", "wenzhou"]
# del li[1:4]
# print(li)

''' 10)请将列表所有得元素反转,并输出反转后的列表'''
# li = ["alex", "WuSir", "ritian", "barry", "wenzhou"]
# li.reverse()
# print(li)

''' 11)请计算出"alex"元素在列表li中出现的次数,并输出该次数。'''
# li = ["alex", "WuSir", "ritian", "barry", "wenzhou"]
# a = 0
# for i in li:
# if i == 'alex':
# a += 1
# print(a)


'''19、写代码,有如下列表,利用切片实现每一个功能
li = [1, 3, 2, "a", 4, "b", 5,"c"]'''
''' 1)通过对li列表的切片形成新的列表l1,l1 = [1,3,2]'''
# li = [1, 3, 2, "a", 4, "b", 5,"c"]
# l1 = li[:3]
# print(l1)

''' 2)通过对li列表的切片形成新的列表l2,l2 = ["a",4,"b"]'''
# li = [1, 3, 2, "a", 4, "b", 5,"c"]
# l2 = li[3:-2]
# print(l2)

''' 3)通过对li列表的切片形成新的列表l3,l3 = ["1,2,4,5]'''
# li = [1, 3, 2, "a", 4, "b", 5,"c"]
# l3 = li[::2]
# print(l3)

''' 4)通过对li列表的切片形成新的列表l4,l4 = [3,"a","b"]'''
# li = [1, 3, 2, "a", 4, "b", 5,"c"]
# l4 = li[1:-2:2]
# print(l4)

''' 5)通过对li列表的切片形成新的列表l5,l5 = ["c"]'''
# li = [1, 3, 2, "a", 4, "b", 5,"c"]
# l5 = li[-1]
# print(l5)

''' 6)通过对li列表的切片形成新的列表l6,l6 = ["b","a",3]'''
# li = [1, 3, 2, "a", 4, "b", 5,"c"]
# l6 = li[-3::-2]
# print(l6)


''' 20、写代码,有如下列表,按照要求实现每一个功能。'''
'''lis = [2, 3, "k", ["qwe", 20, ["k1", ["tt", 3, "1"]], 89], "ab", "adv"]'''
''' 1)将列表lis中的"tt"变成大写(用两种方式)。'''
'''解法一'''
# lis = [2, 3, "k", ["qwe", 20, ["k1", ["tt", 3, "1"]], 89], "ab", "adv"]
# lis[3][2][1][0] = lis[3][2][1][0].upper()
# print(lis)
'''解法二'''
# lis = [2, 3, "k", ["qwe", 20, ["k1", ["tt", 3, "1"]], 89], "ab", "adv"]
# lis[3][2][1][0] = 'TT'
# print(lis)

''' 2)将列表中的数字3变成字符串"100"(用两种方式)'''
'''解法一'''
# lis = [2, 3, "k", ["qwe", 20, ["k1", ["tt", 3, "1"]], 89], "ab", "adv"]
# lis[1] = '100'
# lis[3][2][1][1] = '100'
# print(lis)
'''解法二'''
# lis = [2, 3, "k", ["qwe", 20, ["k1", ["tt", 3, "1"]], 89], "ab", "adv"]
# lis[1] = str(lis[1]+97)
# lis[3][2][1][1] = str(lis[3][2][1][1]+97)
# print(lis)

''' 3)将列表中的字符串"1"变成数字101(用两种方式)。'''
'''解法一'''
# lis = [2, 3, "k", ["qwe", 20, ["k1", ["tt", 3, "1"]], 89], "ab", "adv"]
# lis[3][2][1][2] = 100
# print(lis)
'''解法二'''
# lis = [2, 3, "k", ["qwe", 20, ["k1", ["tt", 3, "1"]], 89], "ab", "adv"]
# lis[3][2][1][2] = int(lis[3][2][1][2])+99
# print(lis)


''' 21、请用代码实现li = ["alex", "eric", "rain"]
利用下划线将列表的每一个元素拼接成字符串"alex_eric_rain"'''
# li = ["alex", "eric", "rain"]
# a = '_'.join(li)
# print(a)


''' 22、利用for循环和range打印出下面列表的索引。
li = ["alex", "WuSir", "ritian", "barry", "wenzhou"]'''
# li = ["alex", "WuSir", "ritian", "barry", "wenzhou"]
# for i in range(len(li)):
# print(i)


''' 23、利用for循环和range找出100以内所有的偶数并将这些偶数插入到一个新列表中。'''
'''解法一'''
# a = []
# for i in range(1,100):
# if i % 2 == 0:
# a.append(i)
# print(a)
'''解法二'''
# a = []
# for i in range(0,100,2):
# a.append(i)
# print(a)

''' 24、利用for循环和range 找出50以内能被3整除的数,并将这些数插入到一个新列表中。'''
'''解法一'''
# a = []
# for i in range(50):
# if i % 3 == 0:
# a.append(i)
# print(a)
'''解法二'''
# a = []
# for i in range(0,50,3):
# a.append(i)
# print(a)

''' 25、利用for循环和range从100~1,倒序打印'''
# a = []
# for i in range(100):
# a.append(i)
# for i in a[::-1]:
# print(i)


''' 26、利用for循环和range从100~10,倒序将所有的偶数添加到一个新列表中,
然后对列表的元素进行筛选,将能被4整除的数留下来。'''
'''解法一'''
# a = []
# b = []
# for i in range(100,9,-1):
# a.append(i)
# for i in a:
# if i % 4 == 0:
# b.append(i)
# print(b)
'''解法二'''
# a = []
# for i in range(100,9,-4):
# a.append(i)
# print(a)

''' 利用for循环和range,将1-30的数字一次添加到一个列表中,并循环这个列表,将能被3整除的数改成*。'''
# lis =[]
# index =0
# for i in range(30):
# lis.append(i)
# for i in lis :
# if i % 3 ==0:
# lis[index] ="*"
# index +=1
# print(lis)


''' 27、查找列表li中的元素,移除每个元素的空格,并找出以"A"或者"a"开头,
并以"c"结尾的所有元素,并添加到一个新列表中,最后循环打印这个新列表。
li = ["TaiBai ", "alexC", "AbC ", "egon", " riTiAn", "WuSir", " aqc"]'''
# li = ["TaiBai ", "alexC", "AbC ", "egon", " riTiAn", "WuSir", " aqc"]
# a = []
# b = []
# for i in li:
# i = i.replace(' ','')
# a.append(i)
# for i in a:
# if i.startswith('A') and i.startswith('a') or i.endswith('c'):
# b.append(i)
# print(b)


''' 28、开发敏感词语过滤程序,提示用户输入评论内容,如果用户输入的内容中包含特殊的字符:
敏感词列表 li = ["苍老师", "东京热", "武藤兰", "波多野结衣"]
则将用户输入的内容中的敏感词汇替换成等长度的*(苍老师就替换***),
并添加到一个列表中;如果用户输入的内容没有敏感词汇,则直接添加到上述的列表中。'''
# name = input('请输入你喜欢的动漫人物:')
# li = ["苍老师", "东京热", "武藤兰", "波多野结衣"]
# a = []
# if name in li:
# for i in li:
# if i in name:
# s = i.replace(i,len(i)*'*')
# print(s)
# a.append(i)
# else:
# li.append(name)
# print(li)


''' 29、有如下变量(tu是个元祖),请实现要求的功能
tu = ("alex", [11, 22, {"k1": 'v1', "k2": ["age", "name"], "k3": (11,22,33)}, 44])'''
''' a. 讲述元祖的特性'''
# 不可变数据类型,没有增删改查,可以存储任意数据类型
# 元组是只读列表。
# 可以索引,可以切片(步长)。
# 不能增删改(儿子不能,孙子有可能),只能查询。

''' b. 请问tu变量中的第一个元素 "alex" 是否可被修改?'''
# k3不能被修改,因为他是元组。

''' c. 请问tu变量中的"k2"对应的值是什么类型?是否可以被修改?如果可以,请在其中添加一个元素 "Seven"'''
# keys:value类型dict
# tu = ("alex", [11, 22, {"k1": 'v1', "k2": ["age", "name"], "k3": (11,22,33)}, 44])
# tu[1][2]['k2'].append('Seven')
# print(tu)

''' d. 请问tu变量中的"k3"对应的值是什么类型?是否可以被修改?如果可以,请在其中添加一个元素 "Seven"'''
# keys:value类型dict,不能修改,因为后面对应元组tuple


''' 30、字典dic,dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]}'''
''' a. 请循环输出所有的key'''
# dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]}
# for i in dic.keys():
# print(i)

''' b. 请循环输出所有的value'''
# dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]}
# for i in dic.values():
# print(i)

''' c. 请循环输出所有的key和value'''
# dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]}
# for i in dic:
# print(i,dic[i])

''' d. 请在字典中添加一个键值对,"k4": "v4",输出添加后的字典'''
# dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]}
# dic['k4'] = 'v4'
# print(dic)

''' e. 请在修改字典中 "k1" 对应的值为 "alex",输出修改后的字典'''
dic = {'k1': "v1", "k2": "v2", "k3": [11, 22, 33]}
# dic['k1'] = 'alex'
# print(dic)

''' f. 请在k3对应的值中追加一个元素 44,输出修改后的字典'''
# dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]}
# dic['k3'].append(44)
# print(dic)

''' g. 请在k3对应的值的第 1 个位置插入个元素 18,输出修改后的字典'''
# dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]}
# dic['k3'].insert(0,18)
# print(dic)

'''31题'''
av_catalog = {
"欧美": {
"www.youporn.com": ["很多免费的,世界最大的", "质量一般"],
"www.pornhub.com": ["很多免费的,也很大", "质量比yourporn高点"],
"letmedothistoyou.com": ["多是自拍,高质量图片很多", "资源不多,更新慢"],
"x-art.com": ["质量很高,真的很高", "全部收费,屌丝请绕过"]
},
"日韩": {
"tokyo-hot": ["质量怎样不清楚,个人已经不喜欢日韩范了", "verygood"]
},
"大陆": {
"1024": ["全部免费,真好,好人一生平安", "服务器在国外,慢"]
}
}

''' a,给此 ["很多免费的,世界最大的","质量一般"]列表第二个位置插入一个 元素:'量很大'。'''
# av_catalog['欧美']['www.youporn.com'].insert(1,'量很大')
# print(av_catalog)

''' b,将此 ["质量很高,真的很高","全部收费,屌丝请绕过"]列表的 "全部收费,屌丝请绕过" 删除。'''
# av_catalog['欧美']['x-art.com'].pop(1)
# print(av_catalog)

''' c,将此["质量怎样不清楚,个人已经不喜欢日韩范了","verygood"]列表的 "verygood"全部变成大写。'''
# av_catalog['日韩']['tokyo-hot'][1] = av_catalog['日韩']['tokyo-hot'][1].upper()
# print(av_catalog)

''' d,给 '大陆' 对应的字典添加一个键值对 '1048' :['一天就封了']'''
# av_catalog['大陆']['1048'] = "['一天就疯了']"
# print(av_catalog)

''' e,删除此"letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"]键值对。'''
# av_catalog['欧美'] = av_catalog['欧美'].pop('letmedothistoyou.com')
# print(av_catalog)

''' f,给此["全部免费,真好,好人一生平安","服务器在国外,慢"]列表的第一个元素,加上一句话:'可以爬下来'''
# av_catalog['大陆']['1024'].append('可以趴下来')
# print(av_catalog)


''' 32、有字符串"k:1|k1:2|k2:3|k3:4" 处理成字典 {'k':1,'k1':2....}'''
# a = "k:1|k1:2|k2:3|k3:4"
# b = {}
# c = a.split('|')
# print(c)
# for i in c:
# k,v = i.split(':')
# b[k] = v
# print(b)


''' 33、元素分类有如下值li= [11,22,33,44,55,66,77,88,99,90],
将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。'''
# li= [11,22,33,44,55,66,77,88,99,90]
# a = []
# b = []
# c = {}
# for i in li:
# if i > 66:
# a.append(i)
# if i < 66:
# b.append(i)
# c['k1'] = a
# c['k2'] = b
# print(c)
努力到无能为力,拼搏到感动自己。
原文地址:https://www.cnblogs.com/jin-yuana/p/9849473.html