Python入门【生成器推导式创建元组、字典、字典元素添加、修改、删除、序列解包、字典核心底层原理、集合 】(六)

news2024/11/25 23:25:21

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白
📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人

🔥🔥🔥 python入门到实战专栏:从入门到实战
🔥🔥🔥 Python爬虫开发专栏:从入门到实战
🔥🔥🔥 Python办公自动化专栏:从入门到实战
🔥🔥🔥 Python数据分析专栏:从入门到实战
🔥🔥🔥 Python前后端开发专栏:从入门到实战  

目录

生成器推导式创建元组

字典

字典元素添加、修改、删除

序列解包

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

集合 


 

生成器推导式创建元组

1 、从形式上看,生成器推导式与列表推导式类似,只是生成器推导式使用小括号。

2 、列表推导式直接生成列表对象,生成器推导式生成的不是列表也不是元组,而是一个生成器对象。

3、我们可以通过生成器对象,转化成列表或者元组。也可以使用生成器对象的 __next__() 方法进行遍历,或者直接作为迭代器对象来使用。不管什么方式使用,元素访问结束后,如果需要重新访问其中的元素,必须重新创建该生成器对象。

【操作】生成器的使用测试 

#列表推导式: [0, 2, 4, 6, 8]
#a = [x*2 for x in range(5)]
#print(a)
s = (x*2 for x in range(5))
print(s)   #<generator object <genexpr> at 0x0000021C80BE2880>
b = tuple(s)
print(b)    #(0, 2, 4, 6, 8)
c = tuple(s)
print(c)    #()
s2 = (x for x in range(3))
print(s2.__next__())        #0
print(s2.__next__())        #1
print(s2.__next__())        #2
print(s2.__next__())        #报错:StopIteration

元组总结

1 、元组的核心特点是:不可变序列。

2 、元组的访问和处理速度比列表快。

3 、与整数和字符串一样,元组可以作为字典的键,列表则永远不能作为字典的键使用。

 实时效果反馈

1. 如下代码,如下说法正确的是:

s = (x*2 for x in range(5))

A s是一个元组

B s是一个列表

C s是一个生成器对象,只能被迭代一次

D s是一个生成器对象,可以被反复迭代多次

字典

字典是“键值对”的无序可变序列,字典中的每个元素都是一个“键值 对”,包含:“键对象”和“值对象”。可以通过“键对象”实现快速获取、 删除、更新对应的“值对象”。

一个典型的字典的定义方式:

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

列表中我们通过“下标数字”找到对应的对象。字典中通过“键对象”找到对应的“值对象”。

1 “键”是任意的不可变数据,比如:整数、浮点数、字符串、元组。

2 但是:列表、字典、集合这些可变对象,不能作为“键”。

3 并且“键”不可重复。

4 “值”可以是任意的数据,并且可重复。 

字典的创建 

1 、我们可以通过{}、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()  #空的字典对象

2、 通过zip()创建字典对象

k = ['name','age','job']
v = ['gaoqi',18,'teacher']
d = dict(zip(k,v))
print(d) #{'name': 'gaoqi', 'age': 18, 'job': 'techer'}

3 、通过fromkeys创建值为空的字典

f = dict.fromkeys(['name','age','job'])
print(f)  #结果:{'name': None, 'age': None, 'job': None}

实时效果反馈

1. 关于字典,如下说法错误的是:

A 字典是“键值对”的有序可变序列

B 字典中的“值对象”可以是任意类型

C 列表对象不可以作为字典的“键对象”

D 元组对象可以作为字典的“键对象”

字典元素的访问

为了测试各种访问方法,我们这里设定一个字典对象:

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

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

a = {'name':'gaoqi','age':18,'job':'programmer '}
b = a['name']
print(b)

2、通过get()方法获得“值”。❤️推荐使用。优点是:指定键不存在, 返回None;也可以设定指定键不存在时默认返回的对象。推荐 使用get()获取“值对象”

a = {'name':'gaoqi','age':18,'job':'programmer '}
b = a.get('name')
c = a.get('gender', '不存在')
print(b)
print(c)

3、 列出所有的键值对

a = {'name':'gaoqi','age':18,'job':'programmer '}
b = a.items()
print(b)  #dict_items([('name', 'gaoqi'),('age', 18), ('job', 'programmer')])

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

a = {'name':'gaoqi','age':18,'job':'programmer'}
k = a.keys()
v = a.values()
print(k)  #dict_keys(['name', 'age','job'])
print(v)  #dict_values(['gaoqi', 18,'programmer'])

5、 len() 键值对的个数

a = {'name':'gaoqi','age':18,'job':'programmer '}
num = len(a)
print(num)  #3

6 、检测一个“键”是否在字典中

a = {'name':'gaoqi','age':18,'job':'programmer '}
print("name" in a)  #True

实时效果反馈

1. 如下代码,如下说法正确的是:

a = {'name':'gaoqi','age':18,'job':'programmer'}
c = a.get('gender', '一个男人')

A 会报错

B 变量 c 是 None

C 变量 c 是 一个男人

D 变量 c 是 空字符串

字典元素添加、修改、删除

1、 给字典新增“键值对”。如果“键”已经存在,则覆盖旧的键值对; 如果“键”不存在,则新增“键值对”

 

a = {'name':'gaoqi','age':18,'job':'programmer '}
a['address']='西三旗1号院'
a['age']=16
print(a)
#{'name': 'gaoqi', 'age': 16, 'job': 'programmer', 'address': '西三旗1号院'}

2、 使用 update() 将新字典中所有键值对全部添加到旧字典对象上。如 果 key 有重复,则直接覆盖

a = {'name':'gaoqi','age':18,'job':'programmer '}
b = {'name':'gaoxixi','money':1000,'gender':'男的'}
a.update(b)
print(a)
#{'name': 'gaoxixi', 'age': 18, 'job': 'programmer', 'money': 1000, 'gender': '男的'}

 3 、字典中元素的删除,可以使用 del() 方法;或者 clear() 删除所有键值 对; pop() 删除指定键值对,并返回对应的“值对象”

a = {'name':'gaoqi','age':18,'job':'programmer '}
del(a['name'])
print(a)       #{'age': 18, 'job': 'programmer'}
age = a.pop('age')
print(age)     #18

4 、popitem() :随机删除和返回该键值对。字典是“无序可变序列”, 因此没有第一个元素、最后一个元素的概念; popitem 弹出随机的项,因为字典并没有"最后的元素"或者其他有关顺序的概念。若想一个接一个地移除并处理项,这个方法就非常有效(因为不用首先获取键的列表)

 

a = {'name':'gaoqi','age':18,'job':'programmer '}
r1 = a.popitem()
r2 = a.popitem()
r3 = a.popitem()
print(a)    #{}

实时效果反馈

1. 如下代码,说法正确的是:

a = {'name':'gaoqi','age':18,'job':'programmer'}
a['address']='西三旗1号院'
a['age']=16

A 字典a中会有两个age键值对: age:18, age:16

B 字典a中只有一个age: age:18

C 字典a中只有一个age: age:16

D 会报错。

序列解包

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

x,y,z=(20,30,10)
(a,b,c)=(9,8,10)
[m,n,p]=[10,20,30]

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

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

实时效果反馈

1. 如下代码,如下说法正确的是:

s = {'name':'gaoqi','age':18,'job':'teacher'}
a,b,c=s

A 变量a的值是s

B 变量a的值是字符串"name"

C 变量a的值是字符串"gaoqi"

D 会报错

表格数据使用字典和列表存储和访问

r1 = {"name":"高小一","age":18,"salary":30000,"city":"北京"}
r2 = {"name":"高小二","age":19,"salary":20000,"city":"上海"}
r3 = {"name":"高小五","age":20,"salary":10000,"city":"深圳"}
tb = [r1,r2,r3]
#获得第二行的人的薪资
print(tb[1].get("salary"))
#打印表中所有的的薪资
for i in range(len(tb)):   # i -->0,1,2
    print(tb[i].get("salary"))
#打印表的所有数据
for i in range(len(tb)):
  print(tb[i].get("name"),tb[i].get("age"),tb[i].get("salary"),tb[i].get("city"))

 实时效果反馈

1. 如下代码,打印输出的是:

r1 = {"name":"高小一","age":18,"salary":30000,"city":"北京"}
r2 = {"name":"高小二","age":19,"salary":20000,"city":"上海"}
r3 = {"name":"高小五","age":20,"salary":10000,"city":"深圳"}
tb = [r1,r2,r3]
print(tb[2].get("city"))

A "city":"深圳"

B 上海

C 北京

D 深圳

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

字典对象的核心是散列表。散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做 bucket 。每个 bucket 有两部分:一 个是键对象的引用,一个是值对象的引用。

由于,所有 bucket 结构和大小一致,我们可以通过偏移量来读取指定 bucket 。

将一个键值对放进字典的底层过程

a = {}
a["name"]="xiao"

 假设字典a对象创建完后,数组长度为8:

我们要把”name”=”gaoqi”这个键值对放到字典对象a中,首先第一步需要计算键”name”的散列值。Python中可以通过hash()来计算。 

>>> bin(hash("name"))
'-0b1010111101001110110101100100101'

由于数组长度为8,我们可以拿计算出的散列值的最右边3位数字作为偏移量,即“101”,十进制是数字5。我们查看偏移量5,对应的 bucket是否为空。如果为空,则将键值对放进去。如果不为空,则 依次取右边3位作为偏移量,即“100”,十进制是数字4。再查看偏移量为4的bucket是否为空。直到找到为空的bucket将键值对放进去。流程图如下:

 

 

扩容

1、python会根据散列表的拥挤程度扩容。“扩容”指的是:创造更大的数组,将原有内容拷贝到新数组 中。

 2 、接近2/3时,数组就会扩容。 

根据键查找“键值对”的底层过程 

明白了,一个键值对是如何存储到数组中的,根据键对象取到值对象,理解起来就简单了。

>>> a.get("name")
'tong'

 当调用a.get(“name”),就是根据键“name”查找到“键值对”,从而找到值对象“gaoqi”。 我们仍然要首先计算“name”对象的散列值:

>>> bin(hash("name"))
'-0b1010111101001110110101100100101'

和存储的底层流程算法一致,也是依次取散列值的不同位置的数 字。 假设数组长度为8,我们可以拿计算出的散列值的最右边3位数 字作为偏移量,即 101 ,十进制是数字5。我们查看偏移量5,对应的 bucket 是否为空。如果为空,则返回 None 。如果不为空,则将这个 bucket 的键对象计算对应散列值,和我们的散列值进行比较,如果相等。则将对应“值对象”返回。如果不相等,则再依次取其他几位 数字,重新计算偏移量。依次取完后,仍然没有找到。则返回 None 。流程图如下:

 

用法总结:

 1 字典在内存中开销巨大,典型的空间换时间。

2 键查询速度很快

3 往字典里面添加新键值对可能导致扩容,导致散列表中键的 次序变化。因此,不要在遍历字典的同时进行字典的修改

4 键必须可散列

      4.1 数字、字符串、元组,都是可散列的

      4.2 自定义对象需要支持下面三点:(面向对象章节中再展开说)

           4.2.1 支持 hash() 函数

          4.2.2 支持通过 __eq__() 方法检测相等性

          4.2.3 若 a==b 为真,则 hash(a)==hash(b) 也为真

集合 

集合是无序可变,元素不能重复。实际上,集合底层是字典实现, 集合的所有元素都是字典中的“键对象”,因此是不能重复的且唯一 的。 

集合创建和删除 

1、使用{}创建集合对象,并使用add()方法添加元素

a = {3,5,7}
a.add(9)    #{9, 3, 5, 7}

2、 使用set(),将列表、元组等可迭代对象转成集合。如果原来数据 存在重复数据,则只保留一个

a = ['a','b','c','b']
b = set(a)  #{'b', 'a', 'c'}

 3、 remove()删除指定元素;clear()清空整个集合

a = {10,20,30,40,50}
a.remove(20)   #{10, 50, 40,30}

集合相关操作

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

>>> 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}

 实时效果反馈

1. 关于集合,如下说法正确的是:

A 集合是有序可变,元素不能重复

B 集合底层是字典,集合的所有元素都是字典中的“键对象”,因此 不能重复

C 集合是无序可变,元素可以重复

D 集合底层是列表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/778624.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML :深入了解超文本标记语言

文章目录 前言HTML 简介HTML 基本结构HTML 标记HTML 文本标记HTML 图像标记HTML 链接标记 HTML 表单HTML 表格HTML 列表HTML 媒体元素HTML 语义化 前言 欢迎来到本篇博客&#xff0c;我将带你深入了解 HTML&#xff08;超文本标记语言&#xff09;。作为前端开发的基础&#x…

论文工具——ChatGPT结合PlotNeuralNet快速出神经网络深度学习模型图

文章目录 引言正文PlotNeuralNet安装使用使用python进行编辑使用latex进行编辑 样例利用chatGPT使用chatGPT生成Latex代码利用chatGPT生成对应的python代码 总结引用 引言 介绍如何安装PlotNeuralNet工具&#xff0c;并结合chatGPT减少学习成本&#xff0c;快速出图。将按照软…

06-Vue基础之事件处理

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

Cloudreve搭建云盘系统,并实现随时访问

文章目录 1、前言2、本地网站搭建1.环境使用2.支持组件选择3.网页安装4.测试和使用5.问题解决 3、本地网页发布1.cpolar云端设置2.cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了&#xff0c;各互联网大厂也纷纷加入战局&#xff0c;一时间公…

LabelImg 标注工具的使用

目录 1 安装及使用1.1 安装1.2 使用 2 标注格式 1 安装及使用 1.1 安装 Win R输入cmd进入终端界面 LabelImg 安装命令&#xff1a; pip install labelimg没有配置国内 pip 源的&#xff0c;请看 ⇒ \Rightarrow ⇒ 临时办法&#xff1a;在上述命令末尾添加源&#xff0c…

详解C语言自定义类型(结构体,枚举,联合)

❤️ 作者简介 &#xff1a;RO-BERRY 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识&#xff0c;对纯音乐有独特的喜爱 &#x1f4d7; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;如果你也感兴趣的话欢迎关注博主&#xff0c;期待更新 自定义类型 1.结构体1.1 …

【GUI】使用PID控制器进行台式过程控制实验,以保持热敏电阻的温度(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码、操作说明 &#x1f4a5;1 概述 本实验是温度控制的反馈控制应用。特别是&#xff0c;本实验讲解&#xff1a; 手动和自动控制的区别 生成动态数据的 步进测试 拟合动态数…

【动态规划part05】| 1049. 最后一块石头的重量 II 、494. 目标和 、474.一和零

目录 &#x1f388;LeetCode 1049.最后一块石头的重量|| &#x1f388; LeetCode494. 目标和 &#x1f388;LeetCode 474.一和零 &#x1f388;LeetCode 1049.最后一块石头的重量|| 链接&#xff1a;1049.最后一块石头的重量 有一堆石头&#xff0c;用整数数组 stones 表示…

深入理解 PostgreSQL 的架构和内部工作原理

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

HTML渐变效果:线性渐变与径向渐变详解

简介 在HTML中,你可以使用CSS来创建渐变效果,给元素添加丰富的背景样式。本文将详细介绍HTML中的渐变效果,并提供示例代码帮助你理解和应用。 线性渐变(Linear Gradient) 线性渐变通过沿一条直线给元素应用颜色的渐变效果。你可以定义起始点和结束点之间的颜色过渡方式。…

西门子plc的通信联网不同网段通讯

你是否曾经遇到过需要将不同品牌的PLC数据进行交换的情况&#xff1f;今天我们要介绍的就是远创智控YC8000-PN的ModbusTCP客户机功能&#xff0c;它可以帮助你实现这一需求。 1, 远创智控YC8000-PN的lan1口连接西门子S7-1200的网口&#xff0c;FX5U自带以太网口与远创智控YC8…

JVM-Java虚拟机

JVM——Java虚拟机&#xff0c;是Java实现平台无关性的基石。 基本概念&#xff1a;JVM 是可运行 Java 代码的假想计算机 &#xff0c;包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收&#xff0c;堆 和 一个存储方法域。JVM 是运行在操作系统之上的&#xff0c;它与…

linux中cgroup的简单使用

文章目录 1 简介1.1 主要功能1.2 cgroups子系统 2 绑定进程到指定cpu核数3 限制进程cpu使用率3.1 示例13.2 示例2 4 限制内存使用量5 限制磁盘读取速度 1 简介 Linux CGroup全称Linux Control Group&#xff0c; 是Linux内核的一个功能&#xff0c;用来限制&#xff0c;控制与…

fastadmin 项目gitee管理

gitee创建一个仓库使用sourcetree等工具拉取代码使用phpstorm远程同步代码到本地设置忽略代码文件 注意&#xff1a;如果是直接把远程代码同步到本地&#xff0c;默认是你在 .gitignore中设置是无效的&#xff0c;代码一样会提交&#xff0c;需要先使用上面的截图去掉缓存&…

进程控制学习笔记

文章目录 进程退出孤儿进程僵尸进程进程回收waitpid()函数 进程退出 子进程的退出需要父进程对其资源的释放&#xff0c;子进程只能对用户区的数据进行释放&#xff0c;无法完成对内核区的释放。 可以获取到。 两个退出的区别&#xff1a; 系统调用不会刷新缓冲区&#xff…

【人工智能】神经网络、M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义、总代价

M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义 文章目录 M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义M-P 神经元模型激活函数(Activation function)神经网络结构举例训练神经网络学习网络参数代价定义均方误差交叉熵(Cross Entropy)…

html input 展示隐藏的密码

<!DOCTYPE html> <html> <meta http-equiv"Content-Type" content"text/html;charsetutf-8"/> <body><h2>登录表格</h2><form action"/action_page.php"><div class"container"><…

vue3-element-plus,控制表格多选的数量

1. 需求描述 控制表格的多选&#xff0c;最多只能选择5条数据&#xff0c;并且其他项禁用 2. 需求描述 <!-- selection-change 当选择项发生变化时会触发该事件--><template><el-tableref"multipleTableRef"v-loading"loading":data"…

微服务基础理论

微服务简介 微服务Microservices之父&#xff0c;马丁.福勒&#xff0c;对微服务大概的概述如下&#xff1a; 就目前而言&#xff0c;对于微服务业界并没有一个统一的、标准的定义&#xff08;While there is no precise definition of this architectural style ) 。但通在其…

flutter开发实战-build编译macos环境可安装dmg

flutter开发实战-build编译macos环境可安装dmg 之前开发中需要变异Macos成dmg的需求&#xff0c;这里记录一下build编译macos环境可安装dmg的过程。 一、工程目录 目录如下 如果工程没有macos&#xff0c;需要增加macos支持的平台。命令 flutter create --platformswindo…