小甲鱼python听课笔记 p26 - p29 字典 & 集合 & 文件
p26 字典1 { }:当索引不好用时
pyhton中 键、值
字典是python唯一的映射类型
创建和访问字典:
字典用大括号{}
dict()
创建一个字典
这里有三个括号,是因为dict()里面只有一个参数,于是将元组用一个()括起来,伪装成一个参数
改变键值:
添加一个键值:
课后练习:
1.尝试一下将数据('F':70,'C':67,'h':104,'i':105,'s':115)创建为一个字典并访问键‘C’对应的值。
六种方法:
data.split()
0.尝试利用字典的特性编写一个通讯录程序吧。
p27 字典2:当索引不好用时
字典dict()严格来说是一个工厂函数,是一个类型
还有学过的工厂函数如:str()、tuple()、list()
fromkeys()
用这个创建并返回一个新的字典
访问字典的几个方法:
keys()、values()、items()
keys()
返回字典里面每一个的“键”
value()
返回字典里面每一个的“值”
items()
打印出每一项:键 + 值
输出键值,访问某一个值
但是存在问题,即输出不存在的键的值是会报错,于是有了get方法
get()
在找不到键的时候,返回的是none
可以设置在找不到键的时候的输出值
比如:找不到32,于是返回的值是“没有!”,在找得到31的时候,于是返回的就是31自己的键值
成员资格操作符:in、not in
可以查看这个键存在不
【注意这里查找的是键,不是值,而在序列里面查找的是值,而不是键(即不是索引)】
clear():清空
copy():全拷贝
注意区分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()
setdefault():可以用作添加
setdefault可以添加键值
update():可以用作添加
利用字典或映射方式去更新一个字典
课后练习:
0. Python的字典是否支持一键(Key)多值(Value)?
答:不支持,对相同的键再次赋值会将上一次的值直接覆盖。
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
- 写一个登录系统
p28 集合set
{ }并不是字典的特权
集合特性
唯一性
集合会自动清除重复的数
无序性
集合是无序的,即不能试图通过索引得到某个值
创建集合
使用{ }
set()
使用set()工厂函数可以创建集合
课堂练习:
删除重复元素:[0, 1, 2, 3, 4, 5, 5, 4, 3, 2, 0]
答:不用集合:(最后答案是按照原来的顺序排序的)
用集合:(要注意用集合会自动排序,并不是按照原来的顺序)
分解开后即:
访问集合中的值:
add()、remove()
frozen()
不可变集合,即不可以删除或增加集合中的元素
课后练习:
2. 请问如何确定一个集合里边有多少个元素?
答:没错,len()函数正好可以满足你此刻的需求。
p29 文件1:永恒
在E盘下创建了一个text文件,record.txt
文件打开模式
打开模式 |
执行操作 |
'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()
当返回‘’时说明一开始的read()已经读到了末尾
read(size)如果设置了size=10,例如f. read(10),将返回什么?
答:将返回从文件指针开始(注意这里并不是文件头哦
)的连续10个字符。
tell()
seek()
seek(偏移量,0/1/2): f.seek(3,0)即从头开始偏移3个量
这样可以竖着打印:
但是效率不高
可以这用做,直接用for把文件对象迭代出来:
直接in f 这样效率更高
文件写入:
写入文件需确保之前的打开文件有权限w或者a
课后练习:
3.尽管Python有所谓的“垃圾回收机制”,但对于打开了的文件,在不需要用到的时候我们仍然使用f. close()将文件对象“关闭”,这是为什么呢?
答:Python拥有垃圾收集机制,会在文件对象的引用计数降至零的时候自动关闭文件,所以在Python编程里,如果忘记关闭文件并不会带来什么危险。
但并不是说就可以不要关闭文件,如果你对文件进行了写入操作,那么你应该在完成写入之后进行关闭文件。因为Python可能会缓存你写入文件中的数据,如果这中间断电了神马的,那些缓存的数据根本就不会写入到文件中。所以,为了安全起见,要养成使用完文件后立刻关闭的优雅习惯。
4. 如何将一个文件对象(f)中的数据存放进列表中?
答:list(f)即可。
1. 编写代码,将文件(OpenMe.mp3)保存为新文件(OpenMe. txt)