小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

p26 字典1 { }:当索引不好用时

pyhton中 键、值

字典是python唯一的映射类型

创建和访问字典:

字典用大括号{}

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

dict()

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

创建一个字典

这里有三个括号,是因为dict()里面只有一个参数,于是将元组用一个()括起来,伪装成一个参数

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

改变键值:

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

添加一个键值:

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

课后练习:

1.尝试一下将数据('F':70,'C':67,'h':104,'i':105,'s':115)创建为一个字典并访问键‘C’对应的值。

六种方法:

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

data.split()

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

0.尝试利用字典的特性编写一个通讯录程序吧。

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

p27 字典2:当索引不好用时

字典dict()严格来说是一个工厂函数,是一个类型

还有学过的工厂函数如:str()、tuple()、list()

fromkeys()

用这个创建并返回一个新的字典

 

访问字典的几个方法:

keys()、values()、items()

keys()

返回字典里面每一个的“键”

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

value()

返回字典里面每一个的“值”

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

items()

打印出每一项:键 + 值

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

输出键值,访问某一个值

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

但是存在问题,即输出不存在的键的值是会报错,于是有了get方法

get()

在找不到键的时候,返回的是none

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

可以设置在找不到键的时候的输出值

比如:找不到32,于是返回的值是“没有!”,在找得到31的时候,于是返回的就是31自己的键值

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

成员资格操作符:in、not in

可以查看这个键存在不

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

【注意这里查找的是键,不是值,而在序列里面查找的是值,而不是键(即不是索引)】

 

clear():清空

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

copy():全拷贝

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

注意区分copy和赋值的区别:

         b = a.copy() :可以看到,a和b的地址是不一样的,就好比b是山寨复制品,修改b的内容,a不会变,修改a的内容,b也不会变

         c = a :可以看到c = a是将a的内容赋值给了c,就好比同一件衣服贴上了a、c两个标签,a和c的地址是一样的,所以修改c的内容a会改变,修改a的内容c也会改变

pop()、popitem()

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

setdefault():可以用作添加

setdefault可以添加键值

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

update():可以用作添加

利用字典或映射方式去更新一个字典

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

课后练习:

0. Python的字典是否支持一键(Key)多值(Value)?

答:不支持,对相同的键再次赋值会将上一次的值直接覆盖。

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

2. 成员资格操作符(in和not in)可以检查一个元素是否存在序列中,当然也可以用来检查一个键(Key)是否存在字典中,那么请问哪种的检查效率更高些?为什么?

 

答:在字典中检查键(Key)是否存在比在序列中检查指定元素是否存在更高效。因为字典的原理是使用哈希算法存储,一步到位,不需要使用查找算法进行匹配,因此时间复杂度是O(1),效率非常高。

 

dict字典如何存储

3. Python对键(Key)和值(Value)有没有类型限制?

答:Python对键的要求相对要严格一些,要求它们必须是可哈希(Hash)的对象,不能是可变类型(包括变量、列表、字典本身等)。但是Python对值是没有任何限制的,它们可以是任意的Python对象。

阅读下小甲鱼帮你整理的这篇文章:你知道Python的字典(Dict)是如何存储的吗?http://bbs.fishc.com/thread-45016-1-1.html

  1. 写一个登录系统

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

p28 集合set

{ }并不是字典的特权

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

集合特性

唯一性

集合会自动清除重复的数

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

无序性

集合是无序的,即不能试图通过索引得到某个值

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

创建集合

使用{ }

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

set()

使用set()工厂函数可以创建集合

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

课堂练习:

删除重复元素:[0, 1, 2, 3, 4, 5, 5, 4, 3, 2, 0]

答:不用集合:(最后答案是按照原来的顺序排序的)

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

用集合:(要注意用集合会自动排序,并不是按照原来的顺序)

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

分解开后即:

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

访问集合中的值:

add()、remove()

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

frozen()

不可变集合,即不可以删除或增加集合中的元素

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

课后练习:

2. 请问如何确定一个集合里边有多少个元素?

答:没错,len()函数正好可以满足你此刻的需求。

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

p29 文件1:永恒

在E盘下创建了一个text文件,record.txt

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

文件打开模式

打开模式

执行操作

'r'

以只读方式打开文件(默认)

'w'

以写入的方式打开文件,会覆盖已存在的文件

'x'

如果文件已经存在,使用此模式打开将引发异常

'a'

以写入模式打开,如果文件存在,则在末尾追加写入

'b'

以二进制模式打开文件

't'

以文本模式打开(默认)

'+'

可读写模式(可添加到其他模式中使用)

'U'

通用换行符支持

 

这里要注意的是' x'和' w'均是以“可写入”的模式打开文件,但以' x'模式打开的时候,如果路径下已经存在相同的文件名,会抛出异常,而'w'模式的话会直接覆盖同名文件。
因此,' w'模式打开文件会比较危险,容易导致此前的内容遗失,因此使用' w'模式打开文件前先检查该文件名是否已经存在显得非常重要!

 

 

文件对象方法

文件对象方法

执行操作

f.close()

关闭文件

f.read([size=-1])

从文件读取size个字符,当未给定size或给定负值的时候,读取剩余的所有字符,然后作为字符串返回

f.readline([size=-1])

从文件中读取并返回一行(包括行结束符),如果有size有定义则返回size个字符

f.write(str)

将字符串str写入文件

f.writelines(seq)

向文件写入字符串序列seq,seq应该是一个返回字符串的可迭代对象

f.seek(offset, from)

在文件中移动文件指针,从from(0代表文件起始位置,1代表当前位置,2代表文件末尾)偏移offset个字节

f.tell()

返回当前在文件中的位置

f.truncate([size=file.tell()])

截取文件到size个字节,默认是截取到文件指针当前位置

 

read()

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

当返回‘’时说明一开始的read()已经读到了末尾

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

read(size)如果设置了size=10,例如f. read(10),将返回什么?

答:将返回从文件指针开始(注意这里并不是文件头哦)的连续10个字符。

tell()小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

seek()

seek(偏移量,0/1/2): f.seek(3,0)即从头开始偏移3个量

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

这样可以竖着打印:

但是效率不高

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

可以这用做,直接用for把文件对象迭代出来:

直接in f 这样效率更高

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

文件写入:

写入文件需确保之前的打开文件有权限w或者a

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件

课后练习:

3.尽管Python有所谓的“垃圾回收机制”,但对于打开了的文件,在不需要用到的时候我们仍然使用f. close()将文件对象“关闭”,这是为什么呢?

答:Python拥有垃圾收集机制,会在文件对象的引用计数降至零的时候自动关闭文件,所以在Python编程里,如果忘记关闭文件并不会带来什么危险。
但并不是说就可以不要关闭文件,如果你对文件进行了写入操作,那么你应该在完成写入之后进行关闭文件。因为Python可能会缓存你写入文件中的数据,如果这中间断电了神马的,那些缓存的数据根本就不会写入到文件中。所以,为了安全起见,要养成使用完文件后立刻关闭的优雅习惯。

4. 如何将一个文件对象(f)中的数据存放进列表中?

答:list(f)即可。

 

 

1. 编写代码,将文件(OpenMe.mp3)保存为新文件(OpenMe. txt)

小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件