字典
字典是"键值对"的无序可变序列,字典中的每一个元素都是一个'键值对',包含"键对象"和"值对象"
字典通过"键对象"找到对应的"值对象",键是任意不可变数据:数字、字符串、元组,但列表、字典、集合这些可变对象不能作为键。
键不可重复
字典的创建
1.花括号{}
如a={"name":"gaoqi","age":"18"}
a={} 空的字典对象
2.dict() 空的字典对象
b=dict(name='gaoqi',age='18')
3.dict[]
a=dict[("name","gaoqi"),("age","18")]
4.zip()
如k=["a","b","c"]
v=[100,200,300]
d=dict(zip(k,v)) 在前的是键,在后的是值
5.dict.fromkeys(['name','age','job'])
字典元素的访问
1.直接使用中括号 a.[]
2.使用a.get() 推荐,若键不存在返回None
a.items() 列出所有的键值对
a.keys() 列出所有的键
a.values() 列出所有的值
len()键值对的个数
检测一个键是否在字典中
'name' in a
True
字典元素添加、修改、删除
1.给字典新增''键值对",如果"键"已存在,则覆盖旧的键值对,如果不存在,则新增键值对
>>>
2.使用update()将新字典中的所有键值对全部添加到旧字典上,如果key有重复,则直接覆盖。
>>>a={'name':'gaoqi','age':'18','job':'programmer'} >>>b={'name':'gaoxixi','money':'1000','sex':'男的'} >>>a.update(b) >>>a {'name':'gaoxixi','age':'18','job':'programmer','money':'1000','sex':'男的'}
指定元素的删除:del() 删除所有:clear()
pop()删除指定键值对,并返回值对象
>>>a={'name':'gaoqi','age':'18','job':'programmer'} >>>del(a['name'])
popitem():随机删除和返回该键值对。字典是'无序可变序列',因此没有第一个、最后一个或其他关于顺序的概念,可以使用popitem()弹出随机的项,若想一个接一个地移除并处理项,此方法很有效。
序列解包
序列解包可用于列表、元组、字典,方便地对多个变量进行赋值
>>>x,y,z=10,20,30 >>>[x,y,z]=[10,20,30] >>>(x,y,z)=(10,20,30)
当对字典进行操作时,默认是对'键'进行操作,若需要对键值对进行操作,使用items(),若需要对值进行操作,使用values()
>>>s={'name':'gaoqi','age':'18','job':'teacher'} >>>name,age,job=s #默认对键进行操作 >>>name name >>>name,age,job=s.items() #对键值对进行操作 >>>name ('name','gaoqi') >>>name,age,job=s.values() #对值进行操作 >>>name 'gaoqi'
表格数据使用字典和列表存储,并实现访问
biaoge.py
所有的数据都可以使用表格来表示
字典核心底层原理
字典对象的核心是散列表,散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫bucket(表元)。
每个bucket有两个部分:键对象的引用、值对象的引用
由于bucket大小一致,可以通过偏移量来引用、读取指定bucket
1.将键值对放进字典的底层过程
把'name'='gaoqi'这个键值放入字典对象中,第一步需要计算'name'的散列值(哈西值),可通过hash()来计算
由于数组长度为8,则可以拿出最右边3个数作为偏移量,即101,即为5,查看5是否为空,若不为空则再取右边三位,即100,4,再看4是否为空,直到找到空的bucket放进去为止。
扩容
python根据散列表的拥挤程度扩容,当接近2/3时,数组就会扩容。
根据键查找键值对的底层过程
>>>a.get("name") 'gaoqi'
Step1:计算"name"对象的散列值:
同上,找到偏移量,若为空,返回None,若不为空,返回值对象
总结
1.键必须可散列:数字、字符串、元组。自定义对象需满足三点
2.字典内存开销巨大,空间换时间
3.往字典中添加新键可能导致扩容
集合
集合是无序,可变,元素不能重复(集合的底层是字典,全是键对象)
,因此是不能重复且唯一的
集合创建和删除
1.{}创建,add()方法添加元素
2.set()将列表、元组等可迭代对象转成集合,若有重复元素只能把保留一个
3.remove()删除指定元素,clear()清空
集合相关操作
>>>a={1,3,'sxt'} >>>b={'he','it','sxt'} >>>a|b #并集 {1,3,'sxt','he','it'} >>>a&b #交集 {'sxt'} >>>a-b #差集 {1,3} >>>a.union(b) #并集 {1,3,'sxt','he','it'} >>>a.intersection(b) #交集 {'sxt'} >>>a.difference(b) #差集 {1,3}
控制语句
选择结构
单分支选择结构
if 条件表达式:+语句/语句块
条件表达式
条件表达式值为False的情况如下:
False,0,0.0,空值,空序列对象、空range对象
条件表达式中不能出现赋值符号=
需用等于判断 ==
双分支结构
if :
else:
python给了三元运算符,用于简单双分支赋值情况,语法如下:
条件为真时的值 if (条件表达式) else 条件为假时的值
num=input("请输入一个数字") print(num if int(num)<10 else "数字太大")
多分支结构
语法结构如下:
if expression1:
phrase1
elif expression2:
phrase2
·
·
·
elif expression n:
phrase n
[else:
phrase n+1
]
几个分支之间是有逻辑关系的,不能随意调换顺序
选择结构的嵌套
选择结构可以嵌套,但一定要注意好缩进量
循环结构
while循环
语法如下:
while 条件表达式:
循环体语句