Week 3
本周学习主要内容包括IPython,集合,字典,封装和解构
IPython
特殊变量
- _表示前一次输出
- __表示倒数第二次输出
- ___表示倒数第三次输出
- _dh 目录历史
- _oh 输出历史
Shell命令
- 使用 !command 执行shell命令
魔术方法
- %: linemagic
- %%:cellmagic
集合(Set)
性质:
- !!集合是可变的,无序的,不重复的元素的集合,是非线性数据结构之一!!
- 可哈希类型 (数值型int、float、complex;布尔型True、False;字符串string、bytes;tuple;None。以上都是不可变类型,哈希类型,hashable)
不可哈希类型(list,bytearray,set)
不管嵌套多少次,内部不能有不可哈希类型,否则集合创建过程中报错 - 去重性:{‘a’,‘b’,‘c’,‘d’,‘d’} => {‘a’, ‘b’, ‘c’, ‘d’}
- 无序性:{‘a’,‘b’,‘c’,‘d’,‘d’} => {‘a’, ‘c’, ‘d’, ‘b’,‘d’}
因为无序,不可索引 - 可迭代:set中虽然元素不一样,但所有元素都可以迭代出来
- 可遍历(for循环即可,且遍历也无序),增加,移除,但不可修改
增加:
- add:直接添加值,且就地修改
- update:update可以放入可迭代对象,且就地修改
- 集合有集合运算,不能用+
移除:
- remove(elem):元素值移除,无返回值就地修改,非常好,set非线性,remove效率极高 O(1),背后原理与hash有关
与线性数据结构的remove区别:
s.remove('e') #KeyError 你给的key我找不到,key在计算机中指唯一不重复的值 O(1)
[].remove('a') #ValueError 就是你给的值我找不到,遍历
- discard(elem):弃用,更温和;有就移除,没有也不报错,效率极高O(1)
- clear():全部清空
- pop:随机弹出 / 集合无序
遍历:
-
in操作符在列表中效率高吗?–不高,相当于做index或finde,从前向后找,时间复杂度O(n)。
set类型中效率高吗?–高,用key,时间复杂度O(1) - 如果内存中有线程列表,你需要做的操作里面用到了遍历,O(n),n规模越大效率越低下,微秒 => 毫秒。index、count
- 如果内存中有集合,不管数据规模多大,他检索元素的时间不随规模增大,时间复杂度O(1),效率极高,纳秒级。key、in
- 比如:100万个url,可以用类似集合方式检索;频繁搜索建议使用set
概念:
- 全集
- 子集subset / 超集superset
- 真子集 / 真超集
- 集合运算:并集 、交集、 差集
|:并集
^:对称差集
-:差集 (a-b != b-a)
&:交集
字典(Dict)
初始化:
dict() -> new empty dictionary
dict(mapping) -> new dictionary initialized from a mapping object's
(key, value) pairs
dict(iterable) -> new dictionary initialized as if via:
d = {}
for k, v in iterable:
d[k] = v
dict(**kwargs) -> new dictionary initialized with the name=value pairs
in the keyword argument list. For example: dict(one=1, two=2)
元素访问:
- d.fromkeys
- d.setdefault
- d.get
删除:
- pop
- popoitem
- clear
遍历:
- keys:返回一个类set对象,可以看成一个set,具有去重性,且无序,可以进行集合运算。
- values:values()不能保证唯一,不一定能hash,values方法返回可迭代对象,不是类set对象。
- items:items()如果所有values值可hash,那么items就是kv对,items()返回对象是类set对象。
- 以上三种都返回一个类似生成器的可迭代对象,Dictionary view对象(惰性),可以使用len(), iter(),in操作,而且不会产生副本(实时更新反映变化)。
key:
字典的key和set的元素要求一致
- set元素可以看作key,set可以看作dict的简化版
- hashable可哈希才可以做key,可以使用hash()测试
- 使用可以访问就如set中使用index,时间复杂度都是O(1),也是最好的访问元素方式
有序性:
字典元素是按照key’的hash值无需储存的!!
python 3 中字典在3.6开始记录kv中k的录入序,但不表示key是排序。set集合key没有记录这个顺序,不要依赖记录的顺序,你还是认为字典中kv对是无序的,set一定是无序的。
如果一定需要这种有序可以使用OrderedDict。
封装和解构(packaing/unpacking)
解构:
- 右边只要是可迭代对象即可,可以线性或非线性结构
- 左边标识符与右边值要相等