决战Python之巅(七)

前言

本篇呢,先补充介绍一下字符串数据类型,然后介绍哈希、字典、元祖、集合。由于几种数据类型的函数比较多,我这里就不一一列出来了,有兴趣的同学可以去看源码。
…源码怎么看?打开Pycharm,新建一个python文件,输入你要使用的函数,然后按住键盘上的ctrl键(winows系统),然后鼠标指针移动到函数名上,点击即可。

知识回顾

1.字符串知识补充

前面我们已经学习过也使用过了字符串,那字符串有哪些特性呢?
1.有序;2.不可变;

有序

有序很好理解吧,就是你初始化了一个字符串:

name = 'Kris'

每次你调用name的时候计算机不会给你’risK’,或者’sKir’,只会按照你提供的顺序来。

不变性

这个可能有的同学会有疑惑,说我初始化了一个name:

name = 'Kris'

然后我又这样:

name = 'Alex'

那不是变了吗? 变没变,我们看一下id就知道了:
在这里插入图片描述
事实上,我们在进行name的初始化时,系统开辟了一个内存空间来存放Kris,当我们对name重新赋值时,系统又开辟了一个内存空间来存放新的值,原先的那个内存空间还在,并没有改变,只是现在name指向了新的内存空间。
这就有了另一个问题:如果我没事干,给name赋了很多次值,假如说有成千上万次,那么内存不会爆掉吗? 在实际中,并不会,Python有一个“垃圾回收”机制,就是说每隔一段默认的时间,它会把不再用到的内存空间清理回收。具体的细节在后面的章节中会有。
下面是字符串的函数:
在这里插入图片描述

在这里插入图片描述
具体的功能试一下就知道了。

元组

下面介绍一个新的“列表”,元组。它跟列表差不多,只不过一旦创建了就不可修改,所以又叫只读列表(就是只能读取不能写入)。
因此,它跟字符串一样,也是一种不可变的数据类型。但是,事情远远没有这么简单,这里说的不可变只是相对的,只限于它自己的元素,什么意思呢:
在这里插入图片描述
我定义了一个名叫name的元组(元组使用小括号(),列表使用中括号[],别搞混了~),然后我想将第一个元素改为99,会报错,因为是不可变的。但是我将元组的最后一个元素,一个小列表的第一个元素改为99,却是可以的。大家可以想象是为什么?

----------------------------------------就这样过了5分钟-----------------------------------------
我们知道,列表是可变的,而现在元组里嵌套了一个小列表,就相当于一个大杯子里放了一个小杯子,因为大杯子的特性导致这个小杯子不能变,但是小杯子里的东西是可以改变的,小杯子里的东西是单独存在的个体。 这里注意不要跟列表的知识搞混了。
也就是说,元组里的元素的内存地址不能变,但这个内存地址指向的内存空间里的东西是可以改变的,就像上面的元组里嵌套了一个列表,元组的元素不能变,但是列表的元素可变。

功能

切片
索引index
count
这三个功能与列表类似,我就不再赘述(这句话好像出现过很多次了…恐怖如斯)。
至于元组的用处么…
在这里插入图片描述

Hash

上面我们讲了两种不可变的数据类型,一是字符串,二是元组,还有一种是数字,这个都能理解吧。
那么Hash(哈希)是什么呢?
在这里插入图片描述
最后一句,将任意长度的消息压缩到某一固定长度的消息摘要的函数。
我的理解是,将一些消息通过函数计算变成一堆固定长度的数字…效果如下:
在这里插入图片描述
Hash是根据值的一些特征来计算的,这就要求这个值是不能变的,所以只有字符串、数字、元组可以被哈希,列表不行。
那这有什么用呢?
在这里插入图片描述
前两个我也不太清楚,有兴趣的可以去研究下。密码验证我可以稍微讲一下,几乎所有的登录都是用的Hash。密码验证是个什么过程呢? 假如你注册一个QQ号,要设置密码吧,设置完之后系统会将你的密码进行哈希,然后将得到的值存入数据库,而不是将你的密码直接存进去。当你登录时,会将你输入的密码进行哈希,然后与数据库中的比对,比对通过就登陆成功。
Hash还有一个特性,就是不可逆。意思是当一个值进行hash运算,得到的哈希值不可能也不能够反推出初始值,这样你就不用担心万一哪天哪个工程师拿到你存储密码的数据库,你的账号会被泄露,他只拿到一堆数字,根本不能反推出你的密码。

Hash有一个缺点,就是说两个完全不同的数据,他可能会哈希出同一个值,这就需要我们每次使用hash时都要考虑这个问题。

字典

之前我们讲过列表,列表有什么用呢? 诶,假如我现在要求你创建一个可以存取的,包含你的所有同事、或者同学姓名的这么一个东西,你可能会想到列表。
那现在我需要不仅可以存取姓名,还可以存取他们的年龄、手机号码等等,那列表就无法满足我的这个需求。这里我们介绍一个新的数据类型,字典。
与我们实际生活中使用的字典一样,你需要通过这个字来找到这个字所有相关的内容,而在Python中,我们将这个字称为key,这个字的相关内容称为value,字典中存放的就是key : value这样的组合(注意字典是用大括号括起来):
在这里插入图片描述
字典有这几个特性:
在这里插入图片描述
我们着重讲一下无序吧,查找速度快会在后面讲。由前面所学的可以知道,list是有序的,字符串也是有序的,它们都有index索引值。而字典没有,它是无序的。
下面是一些基本用法:
在这里插入图片描述
查找
在这里插入图片描述
查找还有另一种方法但是这里不讲,那种方法假如说查找的内容不存在,会报错,所以一般用in。
其他用法
在这里插入图片描述

dict循环
这里我也只介绍一种循环:

for key in info:
    print(key,info[key])

这样就能遍历输出所有的key以及对应的value。

集合

集合比较有意思,原理跟我们高中学的知识差不多。
首先,集合是一个无序的,不重复的数据类型。它有两个主要作用,一是去重,而是关系测试。

去重以及其他函数

在这里插入图片描述
在这里插入图片描述
最后为什么会报错呢?集合元素的特征之一就是确定性,也就是要求是不可变的,可以被哈希的。其他两个特性是互异性无序性

关系测试

1.交集

取出两个集合的交集:
在这里插入图片描述

2.差集

在这里插入图片描述

3.并集

在这里插入图片描述
还有一个写法是:s1 | s2

这里补充一个:

对称差集

上面的差集只把某一个集合的元素取出来,现在我要取出两个集合的差集。
在这里插入图片描述

最后的话是集合的一个包含关系,就是判断一个集合是不是另个一个集合的子集或者父集(也叫超集)。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_33267875/article/details/84674324