S17_Day5
一、字典
键值对数据: 键取得是不可变得数据类型,,即可哈希的
值是随意的 ,即不了哈希的
不可变数据类型:(可哈希)
# 数字 字符串 元组 布尔值
可变数据类型:(不可哈希)
#列表 字典
字典是无序的,但是py36是有序打印的,3.5及以下版本是无序打印
字典里的键必须保证是唯一的
增加:
1.dic = {}
dic[' '] = ' ' #很暴力,直接添加就好了.#如果这个键不在字典中就是添加,在字典中就是修改
2.dic.setdefault(' 键',' 值') #如果在列表中键存在就不进行添加,不存在进行添加.如果不写值就默认值为None
删除:
#字典中没有remove()方法 注意!!!!!!!!!!!!!!!!!
.pop(键) #删除这个键所对应的键值对,有返回值 #返回这个键所对应的值
.popitem() #随机删除,在3.6版本以上删除最后一个,3.5及以下版本随机删除有返回值 #返回的是这个键所对应的键值对,一元组的形式输出.第一个是键,第二个是值
del dic #删除整个字典
del dic['键'] #通过键删除一个键值对
.clear() #清空
改:
dic['键'] #如果这个键在字典中就是修改,不在就是添加
.update('键':'值') #更新 如果这个键在字典中就是修改,不在就是添加
查:
.get('键',返回值) #查询的是键所对应的值,如果没有该建,则默认返回None,返回值可以自己定义.
print(dic['键']) #也是查询键所对应的值,但是没有该键,则报错.
字典的其他操作:
dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]} for i in dic: print(i) #遍历的是字典的键 if i in dic: print(dic[i]) #没有返回值 print( dic.get(i)) #有返回值
字典独有的方法:
.keys() #对应字典的键 以元组的方式将键放在一个高仿列表里
.value() #对应字典的值 一元组方式将值放在一个高仿列表里
.items() #对应字典的键值对 以元组形式将键值对放在一个高仿列表里之所以叫高仿列表是因为无索引所以叫高仿
for k,v in dic.items(): #通过解构赋值
print('这是键',k)
print('这是值',v)
#解构赋值:
a,b = 1,2 即将ab分别赋值1和2 ,位置对应即可。
1.数字:
a,b = 1,2
print(a,b)
结果:
1 2
2.元组:
a,b = ('你好','汪峰') print(a,b)
结果:
你好 汪峰
3.列表:
a,b = ['你好','汪峰'] print(a,b)
结果:
你好 汪峰
4.字典:
a,b = {'汪峰':'男的','章子怡':'女的'} print(a,b)
结果:
汪峰 章子怡
#面试题: 用一行代码将ab的值调换 a=10 b=20
利用解构赋值即可:
a,b = b, a print(a,b)
这个解构赋值适用于数字,字符串,列表,元组,字典等数据类型
字典的嵌套:
dic1 = { 'name':['alex',2,3,5], 'job':'teacher', 'oldboy':{'alex':['python1','python2',100]} } dic1['name'].append('wusir') print(dic1) s = dic1['name'][0].title() print(s) dic1['oldboy']['alex'].remove('python2') print(dic1)
二、id is ==
id : #查询内存地址
== : #是判断两边的数据是不是一样
is : #是判断两边的数据是不是一个 内存地址
在一个py文件中只要顶行写都是代码块,同一个代码块的内存地址是一个的。
总结: ‘ ==’ 是 比较 符号 两边表达式 的值是否相等,而 ‘is' 是比较两边的对象是否是同一个内存地址。如内存地址相等,那么这两边指向同一个内存空间。
可以说,如果内存地址相同,那么值一定相同; 值相同,内存地址不一定相同。.
a = 100
b = 100 这两个是在一个代码块中
#### Python 程序是由代码块构造的,块是一个python程序的文本,它是作为一个执行单元的。
代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块。
三、小数据池
小数据池只针对数字,字符串和布尔值!
bool值 ,True False,i无论创建多少个变量指向它,他在内存中的地址都是一个
数字的小数据池是-5到256
字符串小数据池的规则:
1.自己定义的且不含有特殊字符的字符串没有限制,有特殊字符的字符串长度必须是为0或者1时,才能没有限制
2. 没有特殊字符的用乘法得到的字符串时:
a.当乘数为 0或者1的时候,是,是可以使用小数据池的
b.当乘数大于1的时候,字符串乘完以后的字符串数量y 要小于等于20.
3.当含有特殊字符进行乘法运算时:
a.字符串的长度要大于一
##满足以上的条件的数据才能使用小数据池!!
代码块内的缓存机制是和代码块之间的缓存机制不同的!
在执行一个代码块内的命令时,python会先检查这个值是不是已经存在,如果存在,则会直接调用这个存在的数据,这样就会导致在一个代码块中的两个变量指向同一个内存地址.
多个代码块中是使用小数据池的.!!!!
在进行,不同的代码块之间的命令时,pythonh会先查询小数据池,看看这个数据是否是满足小数据池的数据e如果是那会指向同一个地址,所以当两个代码块执行的时候,不满足小数据池的数据会得到两个不同的对象
综上所述,要通过 is 查看两个数据是否是一个对象,主要是查看内存地址是否一样.
#字典 #增加: ''' dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]} dic['k4'] = 'v4' dic['k3'] = 'v3' dic.setdefault('k5') print(dic) ''' #.setdefault() 里面的参数是键和值,如果没有值默认值得None,如果在字典里 #有这个键则是不进行添加,如果没有就添加 ''' dic = {} dic['歌手'] = '汪峰' print(dic) dic.setdefault('王菲','歌手') print(dic) dic. ''' #对字典进行修改 ''' dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]} dic['k4'] = 'v4' dic['k1'] = 'alex' dic['k3']= [11,22,33,44] dic['k3'] = [18,22,33,44] print(dic) ''' #循环遍历字典 dic = {'剑圣':'易','哈啥给':'剑豪','大宝剑':'盖伦'} key_list = dic.keys() value_list = dic.values() key_value_list = dic.items() #for i in : print(key_list) for i in value_list: print(i) for k,j in key_value_list: print(k,j) #字典的嵌套 ''' dic1 = { 'name':['alex',2,3,5], 'job':'teacher', 'oldboy':{'alex':['python1','python2',100]} } dic1['name'].append('wusir') print(dic1) s = dic1['name'][0].title() print(s) dic1['oldboy']['alex'].remove('python2') print(dic1) '''