1. 列表、元组
列表
特性:有序的,可修改。
任意的成员都可以通过下标来进行访问。话句话说,Python 对列表数据中的所有成员按序编号,称为索引,从而实现对成员变量的访问和修改。
-
定义
names = ['Alex',"Tenglan",'Eric']
-
增加
names.append("我是新来的")
-
修改
>>> names = ['Alex',"Tenglan",'Eric'] >>> names[1]='Tom' >>> names ['Alex', 'Tom', 'Eric']
-
删除
name.remove('Alex') name.pop() name.pop(i) #i是列表元素的下标,对应删除
-
插入
>>> names = ['Alex',"Tenglan",'Eric'] >>> names.insert(1,"shabi") >>> names ['Alex', 'shabi', 'Tenglan', 'Eric']
-
拓展
names1 = ['Alex',"Tenglan",'Eric'] names2 = ['1','2','3'] names1.extend(names2) >>> names1 ['Alex', 'Tenglan', 'Eric', '1', '2', '3']
-
拷贝
-
浅复制(适合无嵌套字典列表)
import copy names1 = ['Alex',"Tenglan",'Eric'] #四种浅复制的方式 names2 = names1[:] names3 = names1.copy() names4 = copy.copy(names1) names5 = list(names1)
-
深复制(适合嵌套字典列表)
names1 = ['Alex',"Tenglan",'Eric'] names2 = copy.deepcopy(names1)
-
例子1
import copy print("----list_1=list_2,内存指向同一空间----") list_1 = [ "Alex", "money", {"names": "Tom"},2 ] list_2 = list_1 list_1[0] = "shabi" list_1[2]["names"] = "doubi" list_1[3]=4 print(list_1) print(list_2) print("----浅复制1----") list_1 = [ "Alex", "money", {"names": "Tom"},2 ] list_2 = list_1.copy() list_1[0] = "shabi" list_1[2]["names"] = "doubi" list_1[3]=4 print(list_1) print(list_2) print("----浅复制2----") list_1 = [ "Alex", "money", {"names": "Tom"},2 ] list_2 = list(list_1) list_1[0] = "shabi" list_1[2]["names"] = "doubi" list_1[3]=4 print(list_1) print(list_2) print("----浅复制3----") list_1 = [ "Alex", "money", {"names": "Tom"},2 ] list_2 = list_1[:] list_1[0] = "shabi" list_1[2]["names"] = "doubi" list_1[3]=4 print(list_1) print(list_2) print("----浅复制4----") list_1 = [ "Alex", "money", {"names": "Tom"},2 ] list_2 = copy.copy(list_1) list_1[0] = "shabi" list_1[2]["names"] = "doubi" list_1[3]=4 print(list_1) print(list_2) print("----深复制----") list_1 = [ "Alex", "money", {"names": "Tom"},2 ] list_2 = copy.deepcopy(list_1) list_1[0] = "shabi" list_1[2]["names"] = "doubi" list_1[3]=4 print(list_1) print(list_2) print("----字符和数字类型------") a = 5 b = a a = 7 print(a, " ", b) print("----字典和列表类型------") a = [1, 2, 3] b = a a [0] = 4 print(a, " ", b)
-
-
统计
num = [1,2,3,2,4,5,7] >>> num.count(2) 2 >>> num.count(1) 1
-
排序
num = [1,2,3,2,4,5,7] >>> num.sort() >>> num [1, 2, 2, 3, 4, 5, 7]
-
获取下标
-
第一种方法:知道列表的值(重复的获取第一个的值)
num = [1,2,3,2,4,5,7] >>> num.index(3) 2 >>> num.index(2) 1
-
第二种方法:遍历整个列表获取的下标值
num = [1,2,3,2,4,5,7] for i,j in enumerate(num): print(i," ",j) #i是列表的下标,j是列表的元素
-
-
切片
>>> names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"] >>> names[1:4] #取下标1至下标4之间的数字,包括1,不包括4 ['Tenglan', 'Eric', 'Rain'] >>> names[1:-1] #取下标1至-1的值,不包括-1 ['Tenglan', 'Eric', 'Rain', 'Tom'] >>> names[0:3] ['Alex', 'Tenglan', 'Eric'] >>> names[:3] #如果是从头开始取,0可以忽略,跟上句效果一样 ['Alex', 'Tenglan', 'Eric'] >>> names[3:] #如果想取最后一个,必须不能写-1,只能这么写 ['Rain', 'Tom', 'Amy'] >>> names[3:-1] #这样-1就不会被包含了 ['Rain', 'Tom'] >>> names[0::2] #后面的2是代表,每隔一个元素,就取一个 ['Alex', 'Eric', 'Tom'] >>> names[::2] #和上句效果一样 ['Alex', 'Eric', 'Tom'] >>> names[::-1]#倒序 ['Amy', 'Tom', 'Rain', 'Eric', 'Tenglan', 'Alex']
元组
特性:有序的,只读的。
只有访问和统计两种方法
- count
- index
2.字典
特性:无序,可修改,key是唯一值
-
定义
info = { 'stu1101': "TengLan Wu", 'stu1102': "LongZe Luola", 'stu1103': "XiaoZe Maliya", }
-
增加
>>> info['stu1104'] = "卡萨丁" >>> info {'stu1101': 'TengLan Wu', 'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1104': '卡萨丁'}
-
修改
>>> info['stu1104'] = "阿萨姆" >>> info {'stu1101': 'TengLan Wu', 'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1104': '阿萨姆'}
-
删除
-
方法1,pop 返回删除的值
>>> info {'stu1101': 'TengLan Wu', 'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1104': '阿萨姆'} >>> info.pop('stu1101')
-
方法2,del 没有返回值
>>> info {'stu1101': 'TengLan Wu', 'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1104': '阿萨姆'} >>> del info['stu1101']
-
方法3 随机删除 返回key-value的元组
>>> info = {'stu1101': 'TengLan Wu', 'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1104': '阿萨姆'} >>> info.popitem() ('stu1104', '阿萨姆')
-
-
查找
方法1:通过key值获取(当key不存在的时候会报错,最好获取前判断key in dict)
方法2:get方法(当key不存在的时候不会报错)
>>> info = {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'} >>> "stu1102" in info #标准用法 True >>> info.get("stu1102") #获取,找不到默认返回None 'LongZe Luola' >>> info["stu1102"] #同上,但是看下面 'LongZe Luola' >>> info["stu1105"] #如果一个key不存在,就报错,get不会,不存在只返回None Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'stu1105'
-
遍历字典
#方法1 for key in info: print(key,info[key]) #方法2 for k,v in info.items(): #会先把dict转成list,数据里大时莫用 print(k,v)
-
常用函数
#values >>> info.values() dict_values(['LongZe Luola', 'XiaoZe Maliya']) #keys >>> info.keys() dict_keys(['stu1102', 'stu1103']) #setdefault >>> info.setdefault("stu1106","Alex") 'Alex' >>> info {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'} >>> info.setdefault("stu1102","龙泽萝拉") 'LongZe Luola' >>> info {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'} #update >>> info {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'} >>> b = {1:2,3:4, "stu1102":"龙泽萝拉"} >>> info.update(b) >>> info {'stu1102': '龙泽萝拉', 1: 2, 3: 4, 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'} #items info.items() dict_items([('stu1102', '龙泽萝拉'), (1, 2), (3, 4), ('stu1103', 'XiaoZe Maliya'), ('stu1106', 'Alex')]) #通过一个列表生成默认dict,有个问题如下:fromkeys 函数把所有 key 都指向了同一个空列表。改动其中任何一个,其他的都改掉了。 >>> a = dict.fromkeys([1,2,3],[]) >>> a {1: [], 2: [], 3: []} >>> a[1].append(1) >>> a {1: [1], 2: [1], 3: [1]}
3.集合
特性:无须,无重复
作用:
- 去重,把一个列表变成集合,就自动去重了
- 关系测试,测试两组数据之前的交集、差集、并集等关系
s = set([3,5,9,10]) #创建一个数值集合
t = set("Hello") #创建一个唯一字符的集合
a = t | s # t 和 s的并集
b = t & s # t 和 s的交集
c = t – s # 求差集(项在t中,但不在s中)
d = t ^ s # 对称差集(项在t或s中,但不会同时出现在二者中)
基本操作:
t.add('x') # 添加一项
s.update([10,37,42]) # 在s中添加多项
使用remove()可以删除一项:
t.remove('H')
len(s)
set 的长度
x in s
测试 x 是否是 s 的成员
x not in s
测试 x 是否不是 s 的成员
s.issubset(t)
s <= t
测试是否 s 中的每一个元素都在 t 中
s.issuperset(t)
s >= t
测试是否 t 中的每一个元素都在 s 中
s.union(t)
s | t
返回一个新的 set 包含 s 和 t 中的每一个元素
s.intersection(t)
s & t
返回一个新的 set 包含 s 和 t 中的公共元素
s.difference(t)
s - t
返回一个新的 set 包含 s 中有但是 t 中没有的元素
s.symmetric_difference(t)
s ^ t
返回一个新的 set 包含 s 和 t 中不重复的元素
s.copy()
返回 set “s”的一个浅复制
4.文件
对文件操作流程
- 打开文件,得到文件句柄并赋值给一个变量
- 通过句柄对文件进行操作
- 关闭文件
关键函数
open()
open(name[, mode[, buffering]])
参数说明:
- name : 一个包含了你要访问的文件名称的字符串值。
- mode : mode 决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
- buffering : 如果 buffering 的值被设为 0,就不会有寄存。如果 buffering 的值取 1,访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
不同模式打开文件的完全列表:
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
三种方式
方法1.直接open(),close()
f = open('lyrics') #打开文件,默认是读取
data = f.read()# 对文件读取
f.close() #关闭文件
方法2.try..finally open().close()
比方法1安全,比如说文件操作出错,后续的程序不再运行,通过finally保证安全关闭文件
try:
f = open('lyrics') #打开文件,默认是读取
data = f.read()# 对文件读取
finally:
f.close() #关闭文件
方法3.with语法
with open('log1') as obj1, open('log2') as obj2:
pass
常用文件操作
- file.read([size]):size 未指定则返回整个文件,如果文件大小 >2 倍内存则有问题,f.read()读到文件尾时返回""(空字串)。
- file.readline():返回一行。
- file.readlines([size]) :返回包含size行的列表, size 未指定则返回全部行。
- for line in f: print line :通过迭代器访问。
- f.write("hello "):如果要写入字符串以外的数据,先将他转换为字符串。
- f.tell():返回一个整数,表示当前文件指针的位置(就是到文件头的比特数)。
- f.seek(偏移量,[起始位置]):用来移动文件指针。
- 偏移量: 单位为比特,可正可负
- 起始位置: 0 - 文件头, 默认值; 1 - 当前位置; 2 - 文件尾
- f.close() 关闭文件