1.工厂函数:
什么是“工厂函数”?工厂函数顾名思义就是一个能产生函数的工厂,其目的是对一个需要输入多个参数的函数分类封装,不同使用者只需要输入更少的参数或单个参数就能调用。具体示例可以参考如下博文:
https://www.cnblogs.com/generaotr/p/10565320.html
严格地来说,dict()函数并不是一个BIF,它是一个工厂函数,实际上它是一个类型,调用它会生成该类型的一个实例,就像工厂一样,所以我们把它称为工厂函数。此前我们学习的str()、int()、list()、tuple()等都是工厂函数。2.新建字典的工厂函数
这一节主要介绍字典函数的内建方法以及它们的使用方式。
1.fromkeys()
语法:dict.fromkeys( S[, V] )
我们可以用该方法创建并返回一个新的字典,这个方法有两个参数(S、V),第一参数S是字典的键值,第二个参数V是对应键值的值(可选参数,如果不提供,则默认为none。下面举例说明:
dict0 = {}
dict1 = dict0.fromkeys( (1, 2, 3) )
dict2 = dict0.fromkeys( (1, 2, 3), 'Number' )
dict3 = dict0.fromkeys( (1, 2, 3), ('one', 'two', 'three') )
print(dict1) #【输出】: {1: None, 2: None, 3: None}
print(dict2) #【输出】: {1: 'Number', 2: 'Number', 3: 'Number'}
print(dict3) #【输出】: {1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')}
要注意,fromkeys()这个方法只能创建新字典,并不能修改。举例:
demo = {}
demo1 = demo.fromkeys( (1,2,3), ('Number') )
'''此处我们定义了字典:{1: 'Number', 2: 'Number', 3: 'Number'},现在我们试图用fromkeys来修改键值1,3的值:'''
demo1 = demo1.fromkeys( (1, 3), '数字' )
print(demo1)
'''结果并不会出现我们预想的结果:{1: '数字', 2: 'Number', 3: '数字'},而是会创建一个新的字典:'''
{1: '数字', 3: '数字'}
2.访问字典的几个方法
1. keys()
2. values()
3. items()
2.1 keys() ----- 返回字典的键的引用
dict1 = dict1.fromkeys( range(32), '赞' )
for eachkey in dict1.keys():
print( eachkey, end = ' ' )
#【输出】:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
2.2 values() ----- 返回字典键的值
for eachvalue in dict1.values():
print(eachvalue, end = ' ' )
#【输出】:赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞 赞
2.3 items() ----- 返回字典的项
for eachitem in dict1.items():
print(eachitem, end = ' ')
#【输出】:(0, '赞') (1, '赞') (2, '赞') (3, '赞') (4, '赞') (5, '赞') (6, '赞') (7, '赞') (8, '赞') (9, '赞') (10, '赞') (11, '赞') (12, '赞') (13, '赞') (14, '赞') (15, '赞') (16, '赞') (17, '赞') (18, '赞') (19, '赞') (20, '赞') (21, '赞') (22, '赞') (23, '赞') (24, '赞') (25, '赞') (26, '赞') (27, '赞') (28, '赞') (29, '赞') (30, '赞') (31, '赞')
下面再介绍一个get方法,这个方法可以使得在读取字典索引时,若索引溢出而不报错。举例说明:
A. 不使用get()方法时:
print( dict1[32] )
#【输出】:Traceback (most recent call last)
B. 使用get()方法时:
print( dict1[32] )
#【输出】:Traceback (most recent call last)
使用get()方法时,若值不存在,我们还可以设置其返回值:
print( dict1.get(32, '索引溢出!') )
#【输出】:索引溢出!
3. 判断某个键是否在字典中的成员资格操作符(即 in 和 not in )
print( 31 in dict1 ) #【输出】:True
print( 32 in dict1 ) #【输出】:False
print( 32 not in dict1 ) #【输出】:True
值得注意的是,在序列中,我们查找的是序列的值;在字典中,我们查找的是字典的键。
4. 清空某个字典使用的 clear() 方法
dict1.clear()
print(dict1) #【输出】:{}
【注意】:
在某些时候,这个语句也能达到和clear()一样的效果: dict1 = {}
这两句的代码区别是:
clear()是将字典真正的清空;而给字典赋空值只是将指向这个字典的指针断开,如果之前该字典被赋值给了另一个字典dict2,那么dict2不会随着dict1被清空而清空。
5. 浅拷贝 copy() :浅拷贝是一种对数据的浅层拷贝。它只拷贝数据,不拷贝数据的地址。通过赋值进行的复制是拷贝地址的。举例说明:
a = {1:'one', 2:'two', 3:'three'}
b = a.copy()
c = a
print( id(a) ) #【输出】:2584879935280
print( id(b) ) #【输出】:2584879824040
print( id(c) ) #【输出】:2584879935280
#此时我们给c加一个项:
c[ 4 ] = 'four'
print( c ) #【输出】:{1: 'one', 2: 'two', 3: 'three', 4: 'four'}
print( a ) #【输出】:{1: 'one', 2: 'two', 3: 'three', 4: 'four'}
print( b ) #【输出】:{1: 'one', 2: 'two', 3: 'three'}
6. pop() 和 popitem():
pop() 是弹出字典中指定的项,而popitem()是随机弹出一个字典中的项。(因为字典中是没有所谓的顺序的,所以弹出也没有顺序,是随机弹出。)
【语法】:
字典名.pop( 键 ) #弹出指定项
字典名.popitem() #弹出随机项
示例:
a = {1:'one', 2:'two', 3:'three'}
print( a.pop(2) ) #【输出】:two
print( a.popitem() ) #【输出】:( 3, 'three' )
print( a ) #【输出】:{ 1:'one' }
7. setdefault():
setdefault()方法类似于get()方法,但是default()在找不到对应的项时会自动进行添加,举例说明:
a = {1:'one', 2:'two', 3:'three'}
print(a.setdefault(3)) #【输出】:three(查找已存在的元素,效果和get类似)
print(a.setdefault(4)) #【输出】:none(查找不存在的元素,会自动添加该项进字典)
print(a.setdefault(5, 'five')) #【输出】:five(查找不存在的项,会自动添加该项进字典)
print(a) #【输出】:{1: 'one', 2: 'two', 3: 'three', 4: None, 5: 'five'}
8. update():
该方法利用一个字典或映射关系去更新另外一个字典,举例说明:
b = {'小白': '狗'}
a.update(b)
print(a) #【输出】:{1: 'one', 2: 'two', 3: 'three', 4: None, 5: 'five', '小白': '狗'}