python学习034-----python之字典(二):工厂函数简介及字典的部分内建函数

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', '小白': '狗'}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值