Python基础六(小数据池、编码进阶)
一、练习试题
元素分类
有如下值li= [11,22,33,44,55,66,77,88,99,90],
将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
即: {'k1': 大于66的所有值列表, 'k2': 小于66的所有值列表}
方法一、 li= [11,22,33,44,55,66,77,88,99,90] dic={'k1':[],'k2':[]} for i in li: if i > 66: dic['k1'].append(i) elif i <66: dic['k2'].append(i) print(dic) 方法二、 li= [11,22,33,44,55,66,77,88,99,90] dic={} for num in li: dic.setdefault('k1',[]) dic.setdefault('k2',[]) if num > 66: dic['k1'].append(num) elif num < 66: dic['k2'].append(num) else: continue print(dic)
二、小知识点补充
1、id 查询内存地址
name = 'alex' print(id(name)) li = [1,2,3] print(id(li))
2、is 判断的是内存地址
==是比较值,is 是内存地址是否相同
name1 = 'alex@' name2 = 'alex@' print(name1 == name2)---Ture print(name1 is name2)-----Ture
3、小数据池
Python中 int 与 str 存在小数据池,其他类型没有
int 范围 -5 ---256---指向一个内存地址
str 如果是全部由字母组成的字符串 都是指向一个内存地址.
如果是数字与str(单个字母)想乘,则20以内(包含20)的是同一个内存地址.
其他数据类型 则没有小数据池概念.
三、编码进阶
1、编码回顾
unicode :万国码
A : 0000 0001 0000 0001 0000 0001 0000 0001 32位
中: 0000 0101 0000 0001 0000 0001 0000 0001 32位
升级:utf-8 :用最少8位表示一个字符
A : 0000 0001 8位
欧洲 : 0000 0001 0000 0001 16位
亚洲 中 : 0000 0101 0000 0001 0000 0001 24位
gbk :国标
a : 0000 0001 8位
中 : 0000 0101 0000 0001 16位
1,不同编码之间是不能互相识别对方的二进制,会报错,或者产生乱码.
2,在你的字符串(文件),存储,传输时,必须使用非unicode的二进制(01010101).
py3:
字符串:编码方式(在内存中的运行方式):默认都是unicode.
2、byte 表现形式
byte
对于非中文: 表现形式: b'alex'
内部编码: utf-8 gbk,gb2312...(非unicode) 你设定的.
对于中文: 表现形式: b'xe3\xf2\x36\xe3\xf2\x36\'
内部编码: utf-8 gbk,gb2312...(非unicode) 你设定的.
str
对于非中文: 表现形式: 'alex'
内部编码: unicode
对于中文: 表现形式: '中国'
内部编码: unicode
str >>> byte
b = s.encode('utf-8')
s = 'alex' b = s.encode('utf-8') b1 = s.encode('gbk') print(s,type(s))-----alex <class 'str'> print(b,type(b))-----b'alex' <class 'bytes'> print(b1,type(b1))--b'alex' <class 'bytes'>
s = '中国' b = s.encode('utf-8') b1 = s.encode('gbk') print(s,type(s)) print(b,type(b))------b'\xe4\xb8\xad\xe5\x9b\xbd' <class 'bytes'> print(b1,type(b1))----b'\xd6\xd0\xb9\xfa' <class 'bytes'>