集合
1、什么是集合
我们可以把集合看作是没有存储value的字典,也就是说可以把集合看作是只有key的字典。
我们知道字典中的key它必须是不可变的类型,因为我们要根据key调用哈希函数hash()来计算出哈希码,也就是说key-value对的存储位置,为了保证每次存取的这个key-value对呢它是固定的,所以key要求是不可变的类型。所以集合中的数据可以是任何不可变的类型。
我们还是根据集合的示意图来把这些特点再来回顾一下:
这个示意图其实就是把字典的那个示意图中的value给去掉了,只保留了key,然后这个key呢其实就是集合保存的数据,也就是我把key也换成了数据,这样呢在计算存储位置的时候,也就是计算哈希码的时候,传入给hash函数的这个参数就是集合中保存的这个数据。
2、集合的创建
3、集合间的关系
因为集合中的元素是无序的,所以顺序不重要。
dis表示没有的意思,joint就是交集、连接的意思,所以disjoint就是没有交集。
4、集合的数学操作
差集,它指的是包含在集合a中,但是不包含在集合b中的那部分元素。
对称差集,它指的是a、b两个集合的并集,再除去a、b两个集合的交集,就是两个集合的对称差集。
接下来我们就来学习下,如何在Python程序中集合的这4种数学操作。
5、集合的查操作
6、集合的增操作
大家注意,因为集合中不存在重复的数据,所以呢集合中已经存在的元素就不会再次被添加到集合中。
因为集合中的元素具有唯一性,也就是说集合中不能存在重复的元素,所以不管你使用上面这两种方式中的哪一种,集合中已经存在的元素都不会被再次添加到集合中。
7、集合的删操作
我调用方法pop的时候并没有指定参数,因为集合中的元素和字典是类似的,都是没有顺序的,所以我们无法指定我们要删除的那个元素,只能是不传入参数,这样就会删除任意一个元素。
调用clear方法,清空集合中的所有元素,再来打印s的话,它就是一个空集合了。
8、不可变集合frozenset
frozen,被冻结的,顾名思义,frozenset的意思是,被冻结的集合,也就是不可变的集合。
frozenset之于set呢就好比是tuple之于list,在前面的课程中我们已经学习了,tuple是不可变的,而list是可变的,这是list和tuple的一个最主要的区别。
同样,set是可变的,而frozenset是不可变的,这也是set与frozenset的最主要的一个区别。
前面的课程中我们已经讲过了,只有不可变类型的对象才存在哈希值。
字典的key只能是不可变类型的对象。
frozenset可以作为set中的元素,因为我们说集合中的元素呢就相当于是把字典中的key-value对中的value去除掉。
如果我不传入任何参数的话,这样就创建了一个空frozenset对象,也就是说这个frozenset中呢不包含任何的元素。
与set对象的创建是类似的,我们在调用这个内置函数frozenset的时候,传入的这个参数可以是多种类型的。
前面的课程中,我们有讲到过,我们在程序中要尽量的使用不可变类型的对象,因为不可变类型的对象呢是有好处的:
它的第一个好处是,一旦我们创建了一个不可变类型的对象,那么它的所有数据都不能够被修改了,这样呢就不会产生由于修改数据而导致的错误;
第二个好处是,在多任务环境下,同时操作对象时,不需要加锁,所以在程序中我们应该尽可能的选择使用不可变类型的对象。