Python基础-4

本文详细介绍了Python中的字典操作,包括创建、访问、修改和删除元素,以及字典的核心底层原理和内存分析。同时,还探讨了集合的创建、删除和相关操作,如并集、交集和差集。此外,文章还涵盖了选择结构,如if语句、条件表达式和多分支选择。
摘要由CSDN通过智能技术生成

字典

  • 字典是“键值对”的无序可变序列,字典中的每个元素都是一个“键值对”,包含:“键对象”和“值对象”。可以通过“键对象”实现快速获取,删除,更新对应的“值对象”。
  • 列表中通过“下表数字”找到对应的对象。字典中通过“键对象”找到对应的“值对象”。“键”是任意的不可变数据,比如:整数,浮点数,字符串,元组。但是:列表,字典,集合这些可变对象,不能作为“键”。并且“键”不可重复。
  • “值”可以是任意的数据,并且可重复。
  • 一个典型的字典的定义方式:
a={'name':'gaoqi','age':18,'job':'programmer'}

字典的创建

  • 我们可以通过{},dict()来创建字典。
>>>a={'name':'gaoqi','age':18,'job':'programmer'}
>>>b=dict(name='gaoqi',age=18,job='programmer')
>>>a=dict({("name","gaoqi"),("age",18)})
>>>c={}		#空的字典对象
>>>d=dict()		#空的字典对象
通过zip()创建字典对象
>>>k=['name','age','job']
>>>v=['gaoqi',18,'teacher']
>>>d=dict(zip(k,v))
>>>d
{'name':'gaoqi','age':18,'job':'teacher'}
通过fromkeys创建值为空的字典
>>>a=dict.fromkeys(['name','age','job'])
>>>a
{'name':None,'age':None,'job':None}

字典元素的访问

通过[键]获得“值”。若键不存在,则抛出异常。

>>>a={'name':'gaoqi','age':18,'job':'programmer'}
>>>a['name']
'gaoqi'
>>>a['age']
18

通过get()方法获得“值”

推荐使用.优点是:指定键不存在,返回None;也可以设定指定键不存在是默认返回的对象。推荐使用get()获取“值对象”。

>>>a.get('name')
'gaoqi'

列出所有键值对

>>>a.items()
dict_items([('name','gaoqi'),('age',18),('job','programmer')])

列出所有的键,列出所有的值

>>>a.keys()
dict_keys(['name','age','job'])
>>>a.values()
dict_values(['gaoqi',18,'programmer'])

字典添加

  • 给字典新增“键值对”。如果“键"已经存在,则覆盖旧的键值对;如果"键"不存在,则新增“键值对”。
>>> a={'name':'yxy','age':20,'job':'programmer'}
>>> a['address']='芙蓉区南三片'
>>> a['age']=18
>>> a
{'name': 'yxy', 'age': 18, 'job': 'programmer', 'address': '芙蓉区南三片'}
  • 使用update()将新字典中所有键值对全部添加到旧字典对象上。如果Key有重复,则直接覆盖。
>>> b={'name':'jzm','age':18,'job':'doctor'}
>>> a={'name':'yxy','age':20,'job':'programmer'}
>>> a.update(b)
>>> a
{'name': 'jzm', 'age': 18, 'job': 'doctor'}
>>> b['sex']='女生'
>>> b
{'name': 'jzm', 'age': 18, 'job': 'doctor', 'sex': '女生'}
>>> a
{'name': 'jzm', 'age': 18, 'job': 'doctor'}
>>> a.update(b)
>>> a
{'name': 'jzm', 'age': 18, 'job': 'doctor', 'sex': '女生'}
  • 字典中元素的删除,可以使用del()方法;或者clear()删除所有键值对;pop()删除指定键值对,并返回指定的"值对象";
>>> a
{'name': 'jzm', 'age': 18, 'job': 'doctor', 'sex': '女生'}
>>> del(a['name'])
>>> a
{'age': 18, 'job': 'doctor', 'sex': '女生'}
>>> c=a.pop('age')
>>> c
18
>>> a
{'job': 'doctor', 'sex': '女生'}
  • popitem():随机删除和返回该键值对。字典是“无序可变序列”,因此没有第一个元素,最后一个元素的概念;popitem弹出随机的项,因为字典并没有“最后的元素”或者其他有关顺序的概念。若想一个接一个地移除并处理项,这个方法就非常有效(因为不用首选获得键的列表)。
>>> a
{'job': 'doctor', 'sex': '女生'}
>>> a.popitem()
('sex', '女生')
>>> a
{'job': 'doctor'}

序列解包

序列解包可以用于元组,列表,字典。序列解包可以让我们方便的对多个变量赋值。

>>> x,y,z=(20,30,40)
>>> x
20
>>> y
30
>>> z
40

序列解包用于字典时,默认是对“键”进行操作;如果需要对键值对进行操作,则需要使用items();如果需要对“值”进行操作,则需要使用values();

>>> s={'name':'yxy','age':20,'job':'teacher'}
>>> name,age,job=s	#默认对键进行操作
>>> name	
'name'
>>>name,age,job=s.items()	#对键值对进行操作
>>>name
('name','yxy')
>>>name,age,job=s.values()	#对值进行操作
>>>name
'yxy'

小练习x

在这里插入图片描述

@author: ramon
@file: test_2.py
@time: 2020/11/09
@desc:
"""
r1 = {"name": "高小一", "age": 18, "salary": 30000, "city": "北京"}
r2 = {"name": "高小二", "age": 19, "salary": 20000, "city": "上海"}
r3 = {"name": "高小五", "age": 20, "salary": 10000, "city": "深圳"}
R = [r1, r2, r3]
# 获得第三行人的薪资
print(R[2].get("salary"))
# 打印表中所有人的薪资
for i in range(len(R)):
    print(R[i].get("salary"))
# 打印表中所有的数据
for i in range(len(R)):
    print(R[i].get("name"),R[i].get("age"),R[i].get("salary"),R[i].get("city"))

字典核心底层原理(重要)

字典对象的核心是散列表。散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做bucket。每个bucket有两部分:一个是键对象的引用,一个是值对象的引用。
由于,所有bucket结构和大小一致,我们可以通过偏移量来读取指定bucket。
在这里插入图片描述

内存分析

用法总结:
1.键必须可散列

  • 数字,字符串,元组,都是可散列的。
  • 自定义对象需要支持下面三点:
    • 支持hash()函数
    • 支持通过_eq_()方法检测相等性。
    • 若a==b为真,则hash(a)==hash(b)也为真。
  • 字典在内存中开销巨大,典型的空间换时间。
  • 键查询速度很快
  • 往字典里面添加新建可能导致扩容,导致散列表中键的次序变化。因此,不要在遍历字典的同时进行字典的修改。

集合

集合是一种存储结构。无序可变,元素不能重复。集合的底层是字典实现,集合的所有元素都是字典中的“键对象",因此是不能重复的且唯一的。

集合创建和删除

  • 使用{}创建集合对象,并使用add()方法添加元素
>>> a={3,5,7}
>>> a
{3, 5, 7}
>>> a.add(9)
>>> a
{9, 3, 5, 7}
  • 使用set(),将列表,元组等可迭代对象转成集合。如果原来数据存在重复数据,则只保留一个。
>>> a=['a','b','c','d']
>>> b=['b','c','d','b']
>>> c=set(a)
>>> c
{'c', 'd', 'b', 'a'}
>>> d=set(b)
>
>>> d
{'d', 'b', 'c'}
  • remove()删除指定元素;clear()清除整个集合
>>> c
{'c', 'd', 'b', 'a'}
>>> c.remove('a')
>>> c
{'c', 'd', 'b'}

集合相关操作

像数学概念一样,Python对集合也提供了并集,交集,差集等运算。我们给出示例:

>>> a={1,3,5}
>>> b={2,4,6}
>>> a|b
{1, 2, 3, 4, 5, 6}
>>> a&b
set()
>>> a-b
{1, 3, 5}
>>> a.union(b)
{1, 2, 3, 4, 5, 6}
>>> a.intersection(b)
  File "<stdin>", line 1
    a.intersection(b)
                    ^
SyntaxError: invalid character in identifier
>>> a.difference(b)
{1, 3, 5}

选择结构

选择结构通过判断条件是否成立,来决定执行哪个分支。选择结构有多种形式,分为:单分支,双分支,多分支。
在这里插入图片描述

  • 多分支结构图
    在这里插入图片描述

if语句测试

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: ramon
@file: test_3.py
@time: 2020/11/12
@desc:
"""
a = input("请输入一个小于10的数字:")
if int(a) < 10:
    print(a)
print()

条件表达式详解

在选择和循环结构中,条件表达式的值为False的情况如下:
False,0,0.0,空值None,空序列对象(空列表,空元组,空集合,空字典,空字符串),空range对象,空迭代对象。

if  not a:
    print("非空列表")

c="True"
if c:
    print("c")

d=10
if d:
    print("d")
if 3<d<15:
    print("3<d<15")
  1. 条件表达式中,不能有赋值操作符"="
    在Python中,条件表达式不能出现赋值操作符"=",避免了其他语言中经常误将关系运算符"==“写作赋值运算符”="带来的困扰。

双分支选择结构

if 条件表达式:
语句1/语句块1
else:
语句2/语句块2

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: ramon
@file: test_3.py
@time: 2020/11/12
@desc:
"""
num=input("请输入一个数字:")
if int(num)<10:
    print(num)
else:
    print("数字太大")

三元条件运算符

Python提供了三元运算符,用来在某些简单双分支赋值情况。三元条件运算符语法格式如下:

  1. 条件为真时的值
  2. if (条件表达式)
  3. else
  4. 条件为假时的值
num = input("请输入一个数字:")
print("num是小于10的数字" if int(num) < 10 else "数字太大")

多分支选择结构

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: ramon
@file: test_3.py
@time: 2020/11/12
@desc:
"""
score=int(input("请输入您的分数:"))
grade=""
if score<60:
    grade="不及格"
elif score<80:
    grade="及格"
elif score<90:
    grade="良好"
else:
    grade="优秀"
print("分数是{0},等级是{1}".format(score,grade))
#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: ramon
@file: test_3.py
@time: 2020/11/12
@desc:
"""
x = int(input("请输入您的x轴坐标:"))
y = int(input("请输入您的y轴坐标:"))
if (x == 0 and y == 0):
    print("目标在原点")
elif(x == 0):
    print("目标在y轴")
elif(y == 0):
    print("目标在x轴")
elif(x > 0 and y >0):
    print("目标在第一象限")
elif(x < 0 and y >0):
    print("目标在第二象限")
elif(x < 0 and y <0):
    print("目标在第三象限")
else:
    print("目标在第四象限")

选择结构的嵌套

score=int(input("请输入一个0-100之间的分数:"))
grade=""
if(score<0 or score>100):
    print("请重新输入您的数字:")
else:
    if score>90:
        grade="A"
    elif score>=80:
        grade="B"
    elif score>=70:
        grade="C"
    elif score>=60:
        grade="D"
    else:
        grade="E"
    print("分数为{0},等级为{1}".format(score,grade))

循环结构

循环结构用来重复执行一条或多条语句。表达这样的逻辑:如果符合条件,则反复执行循环体里的语句。在每次执行完后都会判断一次条件是否为True,如果为True则重复执行循环体里的语句。如图:
在这里插入图片描述

while循环

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: ramon
@file: test_4.py
@time: 2020/11/13
@desc:
"""
num = 0
sum_all=0
while num <= 100:
    sum_all = num + sum_all
    num += 1
print("1-100所有数字之和为:",sum_all)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值