第二章 集合 字符编码
集合
定义:有一个或多个确定的元素所构成的整体叫做集合.
特征:
1. 确定性(元素必须可hsah)
2. 互异性(去重)
3. 无序性(集合中的元素没有先后之分)
集合存在的意义就在于去重和关系运算
集合的创建:
- s = {} 创建一个字典
- s = {1} 创建一个集合
集合的关系运算
- 交集
- 取出两个集合中共有的元素
- s.intersection(s1)
- s & s1
- 差集
- s.difference(s1)
- s - s1
- 从s中把s1中有的元素都去掉,通俗来讲就是:你有的我通通不要.
- 并集
- s.union(s1)
- s | s1
- 合并s和s1成一个新的集合
- 对称差集
- s.symmetric_difference(s1)
- s ^ s1
- 合并s和s1,并且去掉两个共有的元素成一个新集合
- 包含关系
- 两个集合之间一般有三种关系,相交,包含,不相交.
- set.isdisjoint(s) 判断两个集合是不是不想交
- set.issuperset(s) 判断集合是不是包含其他集合,等同意 a<=b
- set.issubset(s) 判断集合是不是被其他集合包含,等同于a<=b
- 两个集合之间一般有三种关系,相交,包含,不相交.
字符编码
看这篇文章前,你应该已经知道了为什么有编码,以及编码的种类情况
- ASCII 占1个字节,只支持英文
- GB2312 占2个字节,支持6700+汉字
- GBK GB2312的升级版,支持21000+汉字
- Shift-JIS 日本字符
- ks_c_5601-1987 韩国编码
- TIS-620 泰国编码
由于每个国家都有自己的字符,所以其对应关系也涵盖了自己国家的字符,但是以上编码都存在局限性,即:仅涵盖本国字符,无其他国家字符的对应关系。应运而生出现了万国码,他涵盖了全球所有的文字和二进制的对应关系,
Unicode 2-4字节 已经收录136690个字符,并还在一直不断扩张中...
- Unicode 起到了2个作用:
直接支持全球所有语言,每个国家都可以不用再使用自己之前的旧编码了,用unicode就可以了。(就跟英语是全球统一语言一样)
unicode包含了跟全球所有国家编码的映射关系,为什么呢?后面再讲
Unicode解决了字符和二进制的对应关系,但是使用unicode表示一个字符,太浪费空间。例如:利用unicode表示“Python”需要12个字节才能表示,比原来ASCII表示增加了1倍。
由于计算机的内存比较大,并且字符串在内容中表示时也不会特别大,所以内容可以使用unicode来处理,但是存储和网络传输时一般数据都会非常多,那么增加1倍将是无法容忍的!!!
为了解决存储和网络传输的问题,出现了Unicode Transformation Format,学术名UTF,即:对unicode中的进行转换,以便于在存储和网络传输时可以节省空间!
- UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个
- UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。
- UTF-32: 使用4个字节表示所有字符;
总结:UTF 是为unicode编码 设计 的一种 在存储 和传输时节省空间的编码方案。
Python3的执行过程
- 解释器找到代码文件,把代码字符串按文件头定义的编码加载到内存,转成unicode
- 把代码字符串按照语法规则进行解释,
- 所有的变量字符都会以unicode编码声明**
想在py3里看字符,必须得是unicode编码,其它编码一律按bytes格式展示。
最后再提示一下,Python只要出现各种编码问题,无非是哪里的编码设置出错了
常见编码错误的原因有:
- Python解释器的默认编码
- Python源文件文件编码
- Terminal使用的编码
- 操作系统的语言设置
- 掌握了编码之前的关系后,挨个排错就好啦
小结扩展
基本数据类型
可变数据类型 | 不可变数据类型 |
---|---|
list | 数字类(bool,int,float,complex) |
dict | str |
set | tuple |
. | frozenset |
扩展数据类型collectins
- namedtuple(): 生成可以使用名字来访问元素内容的tuple子类
- deque:双端队列,可以快速的从另外一侧追加和推出对象
- Counter:计数器,主要用来计数
- OrderedDict:有序字典
- defaultdict:带有默认值的字典