不可变映射类型
标准库里所有的映射类型都是可变的,从 Python 3.3 开始,types 模块中引入了一个封装类名叫 MappingProxyType。
只需要给它一个映射,它会返回一个只读的映射类型。
但是如果修改了原有的映射,其也会动态跟着一起被修改。
自己不被修改,原形被修改了,自己跟着一起被改。
coding 实例如下
from types import MappingProxyType
d = {'公众号':'瓦力人工智能'}
d_proxy = MappingProxyType(d)
print(d)
print(d_proxy)
print(d_proxy['公众号'])
# 这里会报错:'mappingproxy' object
# does not support item assignment
# 无法添加和修改映射
# d_proxy['知乎号'] = "瓦力人工智能"
# d_proxy['公众号'] = "瓦力人工智能2"
# 通过d来修改是可行,也就是d_proxy可以捕捉
# d的任何消息,所以d_proxy是动态的
d['知乎号'] = "瓦力人工智能"
print(d)
print(d_proxy)
{'公众号': '瓦力人工智能'}
{'公众号': '瓦力人工智能'}
瓦力人工智能
{'知乎号': '瓦力人工智能', '公众号': '瓦力人工智能'}
{'知乎号': '瓦力人工智能', '公众号': '瓦力人工智能'}
集合论
集合的概念
什么是集合?这是一个数学概念,在数学分析中第一章就会详细介绍各种集合。在这里我们只需要理解其一个本质就好了:许多唯一对象的聚集
根据这点,可以利用集合来去重,具体coding 如下。
集合中的元素必须是可散列。但是set本身是不可散列。
集合运算符
- 并集: 两个集合 a 和 b,a | b 返回的是它们的合集
- 交集: a & b 得到的是交集
- 差集: a - b 得到的是差集
灵活利用集合的这些运算的好处:
- 提高 Python 程序的运行时间
- 让代码的行数变少,省去不必要的循环和逻辑操作
- 更容易判断程序的正确性
l = ['瓦力','瓦力人工智能','瓦力','瓦力人工智能']
myset = set(l)
print(l)
print(myset)
['瓦力', '瓦力人工智能', '瓦力', '瓦力人工智能']
{'瓦力', '瓦力人工智能'}
# 判断程序集needles 的元素在 haystack 里出现的次数
found = len(needles & haystack)
# 以上代码等价于
found = 0
for n in needles:
if n in haystack:
found +=1
# 如果不是集合又可以如下做
found = len(set(needles) & set(haystack))
#或者这样写
found = len(set(needles).intersection(haystack))
集合字面量
集合的定义:s = {1,2,3}
,如果是空集,需要写成set()的形式
s={}
python会认其建立一个空字典类型。
当然也可以通过列表来定义集合例如:
s =set(l)
这样做的话也是可以的,而且很多场合都是这样用的,但是这里有一个技术细节。
直接定义比通过使用set([1,2,3])
要更快更容易阅读,具体如下反汇编的代码。
s = {1}
print(type(s))
s2 = {}
print(type(s2))
# 如果建立set后,即使后面的操作让其变为空集
# python依然知道其为集合类型
s.pop()
print(type(s))
# 利用list来定义集合
l = [i for i in range(10)]
print(l)
s3 = set(l)
print(s3)
<class 'set'>
<class 'dict'>
<class 'set'>
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
# 利用反汇编来查看两种不同的
# 集合定义方式
from dis import dis
dis('{1}')
print("-----------------------")
dis('set[1]')
1 0 LOAD_CONST 0 (1)
2 BUILD_SET 1
4 RETURN_VALUE
-----------------------
1 0 LOAD_NAME 0 (set)
2 LOAD_CONST 0 (1)
4 BINARY_SUBSCR
6 RETURN_VALUE
集合推导
具体的格式如下:就是再大括号里加入推导的语法。
{ i for i in range(1,100)}
# 新建一个 Latin-1 字符集合,该集合里的每个
# 字符的 Unicode 名字里都有“SIGN”这个单词
from unicodedata import name
{chr(i) for i in range(32,256) if 'SIGN' in name(chr(i),'')}
{'#',
'$',
'%',
'+',
'<',
'=',
'>',
'¢',
'£',
'¤',
'¥',
'§',
'©',
'¬',
'®',
'°',
'±',
'µ',
'¶',
'×',
'÷'}
集合的操作
可变和不可变集合所拥有的方法UML类图。
集合的数学运算
集合的比较运算
集合类型的其他方法
分享关于人工智能,机器学习,深度学习以及计算机视觉的好文章,同时自己对于这个领域学习心得笔记。想要一起深入学习人工智能的小伙伴一起结伴学习吧!扫码上车!