1.is和==的区别

1)==比较的是左右两边的值,无论是字符串、数字、列表,元组、若两边的值相等,则返回True

a = "zdz"
b = "zdz"
print(a==b)
输出:
True 
View Code

 ②列表:若两个列表元素相同,则返回True 若不相同,返回False

li = [1,2,4]
li_2 = [1,2,4]
print(li==li_2)
输出:
True
View Code

 2) is 是比较:比较的是内存地址

 补充:id是python中的内置函数,用来打印对象内存地址

a = "zdz"
print(id(a))
输出:
1673496780448
View Code

 ①字符串

str_1 = "zdz"
str_2 = "zdz"
print(str_1 is str_2)
输出:
True
View Code

②数字

num1 = 10
num2 = 10
print(num1 is num2)
输出:
True
View Code

③列表

list_1 = [1,2,3]
list_2 = [1,2,3]
print(list_1 is list_2)
输出:
False
View Code

④元组

tup_1 = (1,2,3)
tup_2 = (1,2,3)
print(tup_1 is tup_2)
输出:
False
View Code

⑤字典

dic_1 = {'1':"zdz",'2':"zzm"}
dic_2 = {'1':"zdz",'2':"zzm"}
print(dic_1 is dic_2 )
输出:
False
View Code
总结:
	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
View Code

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'
View Code

#中文

s = "吃了吗"
print(s.encode('utf-8')) #指定要编码成什么样的编码类型
输出:
b'\xe5\x90\x83\xe4\xba\x86\xe5\x90\x97'        #一个字三个字节(文件存储时,存在硬盘中的就是类似这样的数据)
View Code

2)解码(decode:用什么编码方式编码,就要用什么编码方式解码,否则解码报错或者解码后的字符乱码;即将编码后的字节编码成对应的明文

s = "吃了"
s1 = s.encode('utf-8')
print(s1)
print(s1.decode("gbk"))
print(s1.decode("utf-8"))
输出:
b'\xe5\x90\x83\xe4\xba\x86'
鍚冧簡
吃了
View Code

编码和解码的本质:通过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
View Code

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'}
View Code

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 
输入完毕
View Code

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
View Code

②干掉收益小于平均值的主播

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}
View Code

③干掉卢本伟

zhubo.pop('卢本伟')

总结:

         1==比较左右两边的值

         2is 比较的是内存地址,通过id()内置函数比较

一个py文件中所有相同的字符串,一般都是使用一样的内存地址