1.is和==的区别
1)==比较的是左右两边的值,无论是字符串、数字、列表,元组、若两边的值相等,则返回True
a = "zdz" b = "zdz" print(a==b) 输出: True
②列表:若两个列表元素相同,则返回True 若不相同,返回False
li = [1,2,4] li_2 = [1,2,4] print(li==li_2) 输出: True
2) is 是比较:比较的是内存地址
补充:id是python中的内置函数,用来打印对象内存地址
a = "zdz" print(id(a)) 输出: 1673496780448
①字符串
str_1 = "zdz" str_2 = "zdz" print(str_1 is str_2) 输出: True
②数字
num1 = 10 num2 = 10 print(num1 is num2) 输出: True
③列表
list_1 = [1,2,3] list_2 = [1,2,3] print(list_1 is list_2) 输出: False
④元组
tup_1 = (1,2,3) tup_2 = (1,2,3) print(tup_1 is tup_2) 输出: False
⑤字典
dic_1 = {'1':"zdz",'2':"zzm"} dic_2 = {'1':"zdz",'2':"zzm"} print(dic_1 is dic_2 ) 输出: False
总结: 1)==比较左右两边的值 2)is 比较的是内存地址,通过id()内置函数比较 一个py文件中所有相同的字符串,一般都是使用一样的内存地址
2.小数据池
只适用于数字和字符串,在小数据池中的数据内存地址相同(在终端测试正常,在pycharm会改变这个规则)
①数字小数据池范围:-5~256
②字符串小数据池范围:字符产中如果有特殊字符(空格、加减乘除等),内存地址就不一样(终端测试正常,pycharm中会改变该规则)
#字符串中单个*20以为的内存地址一样;单个*21以上内存地址不一致
a = 'a' * 20 b = 'a' * 20 print(a is b) 输出: True ================================== a = 'a' * 21 b = 'a' * 21 print(a is b) 输出: False
3.编码和解码
1)常见编码
①ascii码:不支持中文,支持英文,数字,字母,符号;8位,即一个字节
②GBK码:支持中文,英文,数字,符号;英文和中文都占16位,即2个字节
③unicode:万国码:支持中文,英文,数字,符号;英文和中文都占32位,即4字节
④utf-8长度可变的外国码:最少用8位,英文占8位,中文占24位,即3个字节
注:python2的默认编码为ascii;python3的默认编码为utf-8;python3中,在程序运行阶段,使用的是unicode编码(即unicode是一个桥梁);unicode是不可以做文件传输和存储的;所有的传输和存储都是使用bytes;pycharm存储的时候默认使用的是utf-8
2)编码(encode):即拿到明文编码后对应的字节
s = "lpl" print(s.encode('utf-8')) #指定要编码成什么样的编码类型 输出: b'lpl'
#中文
s = "吃了吗" print(s.encode('utf-8')) #指定要编码成什么样的编码类型 输出: b'xe5x90x83xe4xbax86xe5x90x97' #一个字三个字节(文件存储时,存在硬盘中的就是类似这样的数据)
2)解码(decode):用什么编码方式编码,就要用什么编码方式解码,否则解码报错或者解码后的字符乱码;即将编码后的字节编码成对应的明文
s = "吃了" s1 = s.encode('utf-8') print(s1) print(s1.decode("gbk")) print(s1.decode("utf-8")) 输出: b'xe5x90x83xe4xbax86' 鍚冧簡 吃了
编码和解码的本质:通过unicode这个桥梁,进行编码和解码
4.练习
1)好声音大赛评委打分时,可以进行输入,假设有10个评委,让10个评委进行打分,要求,分树必须大于5分,小于10分
i =1 while i <= 10: score = input("请%d号评委打分:"%i) if int(score) > 5 and int(score) < 10: print("分数合理") else: print("分数不合理") continue i = i + 1 输出: 请1号评委打分:1 分数不合理 请1号评委打分:8
2)电影投票:程序先给出一个目前正在上映的电影列表,由用户给每一个电影打分,最终将该用户投票信息公布出来lst=['烈日灼心','美国往事','西西里的美丽传说','憨豆先生'],最终结果如下:{'烈日灼心':88,'美国往事':85,'西西里的美丽传说':90,'憨豆先生':89}
lst=['烈日灼心','美国往事','西西里的美丽传说','憨豆先生'] dic={} for i in lst: score = input("请给%s打分:" % i) dic[i] = score print(dic) 输出: 请给烈日灼心打分:88 请给美国往事打分:85 请给西西里的美丽传说打分:90 请给憨豆先生打分:89 {'美国往事': '85', '西西里的美丽传说': '90', '烈日灼心': '88', '憨豆先生': '89'}
3)念数字:给出一个字典,在字典中表示2每个数字的发音,包括相关符号,然后由用户输入一个数字,让程序读出相应的读音(不需要语音输出,单纯的打印即可)
dic = { '-':"fu", '1':"yi", '2':"er", '3':"san", '4':"si", '5':"wu", '6':"liu", '7':"qi", '8':"ba", '9':"jiu" } num = input("请输入一个数字:") for i in num: print(dic[i],end=" ") #用空格分割每一个元素 else: print() #换行 print("输入完毕") 输出: 请输入一个数字:127 yi er qi 输入完毕
4)现有主播的收益信息,按照要求,完成相应操作:
zhubo = {'卢本伟':122000,'冯提莫':189999,'PDD':'200000','老贼':188888}
①计算主播的平均收益
zhubo = {'卢本伟':122000,'冯提莫':189999,'PDD':200000,'老贼':188888} sum = 0 for value in zhubo.values(): sum = sum + value print(sum/len(zhubo)) #计算平均值 输出: 175221.75
②干掉收益小于平均值的主播
zhubo = {'卢本伟':122000,'冯提莫':189999,'PDD':200000,'老贼':188888} sum = 0 for value in zhubo.values(): sum = sum + value print(sum/len(zhubo)) #计算平均值 avg = sum/len(zhubo) #循环的时候记录要删除的key #注:字典循环的时候,不允许修改被迭代的元素,所以先将key放入到列表中 lst = [] for k,v in zhubo.items(): if v < avg: lst.append(k) #列表保存要删除的key for i in lst: zhubo.pop(i) print(zhubo) 输出: 175221.75 {'老贼': 188888, '冯提莫': 189999, 'PDD': 200000}
③干掉卢本伟
zhubo.pop('卢本伟')
总结:
1)==比较左右两边的值
2)is 比较的是内存地址,通过id()内置函数比较
一个py文件中所有相同的字符串,一般都是使用一样的内存地址