一、集合操作(set)
1、定义:
set集合,是一个无序且不重复的元素集合。
集合对象是一组无序排列的可哈希的值,集合成员可以做字典中的键。集合支持用in和not in操作符检查成员,由len()内建函数得到集合的基数(大小), 用 for 循环迭代集合 的成员。但是因为集合本身是无序的,不可以为集合创建索引或执行切片(slice)操作,也没有键(keys)可用来获取集合中元素的值。
2、特性:
1、无序
2、去重
3、关系测试
3、常用操作:
交集(&)(intersection):两者都存在的
1 >>>a = [1,2,3,4,5] 2 >>>b = [4,5,6,7,8] 3 >>>a_set = set(a) 4 >>>b_set = set(b) 5 >>>rint(a_set.intersection(b_set)) 6 >>>print(a_set.intersection(b_set),type(a_set.intersection(b_set))) 7 >>>{4, 5} <class ‘set‘>#可以看出字典和集合都是{},先将a和b都转成集合,然后求出交集(它们两都有的)
并集(|)(union):去重后所有元素放一起
1 >>>a = [1,2,3,4,5] 2 >>>b = [4,5,6,7,8] 3 >>>a_set = set(a) 4 >>>b_set = set(b) 5 >>>print(a_set.union(b_set))
差集(-)(difference):语法使用规则是你有我没有
1 >>>a = [1,2,3,4,5] 2 >>>b = [4,5,6,7,8] 3 >>>a_set = set(a) 4 >>>b_set = set(b) 5 >>>print(a_set.difference(b_set))#(前后存在顺序问题,a里面有的b里面没有的(有---没有)) 6 >>>print(b_set.difference(a_set))#b里面有的a里面没有
子集(issubset):a是不是b的子集和b是不是a的子集
1 >>>a = [1,2,3,4,5] 2 >>>b = [4,5,6,7,8] 3 >>>a_set = set(a) 4 >>>b_set = set(b) 5 >>>print(a_set.issubset(b_set)) 6 >>>print(b_set.issubset(a_set)) 7 >>>False 8 >>>False
父集(issuperset):a是不是b的父集和b是不是a的子集
1 >>>a = [1,2,3,4,5] 2 >>>b = [4,5,6,7,8] 3 >>>a_set = set(a) 4 >>>b_set = set(b) 5 >>>print(a_set.issuperset(b_set)) 6 >>>print(b_set.issuperset(a_set)) 7 >>>False 8 >>>False
对称差集(^)(symmetric_difference):a和b都互相都没有(去重后放到一起)
1 >>>a = [1,2,3,4,5] 2 >>>b = [4,5,6,7,8] 3 >>>a_set = set(a) 4 >>>b_set = set(b) 5 >>>print(a_set.symmetric_difference(b_set)) 6 >>>{1, 2, 3, 6, 7, 8}
4、基本操作
.add(增加)添加一项
1 >>>a = [1,2,3,4,5] 2 >>>a_set = set(a) 3 >>>print(a_set) 4 >>>a_set.add(55)#一次只能添加一个元素,否则会报错 5 >>>print(a_set)
.update([增加多项])
1 >>>a = [1,2,3,4,5] 2 >>>a_set = set(a) 3 >>>print(a_set) 4 >>>a_set.update(‘88‘,‘lei‘,‘lei‘) 5 >>>print(a_set,type(a_set)) 6 >>>{1, 2, 3, 4, 5} 7 >>>{1, 2, 3, 4, 5, ‘8‘, ‘e‘, ‘l‘, ‘i‘} <class ‘set‘>#通过结果不难看出集合天然去重
.remove(‘删除‘)(没有的话报错)
1 >>>a = [1,2,3,4,5] 2 >>>a_set = set(a) 3 >>>print(a_set) 4 >>>a_set.remove(1)#一次只能删除一个,否则会报错 5 >>>print(a_set,type(a_set))
.copy(复制)
>>>a = [1,2,3,4,5] >>>a_set = set(a) >>>b_set = a_set.copy() >>>print(a_set,type(a_set)) >>>print(b_set,type(b_set)) >>>{1, 2, 3, 4, 5} <class ‘set‘> >>>{1, 2, 3, 4, 5} <class ‘set‘>
.pop(删除任意一个并返回这个元素)
1 >>>a = [1,2,3,4,5] 2 >>>a_set = set(a) 3 >>>b_set = a_set.pop()#随机删除,并返回删除的元素 4 >>>print(a_set,type(a_set)) 5 >>>print(b_set) 6 >>>{2, 3, 4, 5} <class ‘set‘> 7 >>>1
.discard(删除)(没有不会报错)
1 >>>a = [1,2,3,4,5] 2 >>>a_set = set(a) 3 >>>b_set = a_set.discard(5) 4 >>>print(a_set) 5 >>>print(b_set) 6 >>>{1, 2, 3, 4} 7 >>>None#有的话删除后并返回一个None 8 >>>就算没有,不报错,也只会返回一个None
二、文件操作
提示:2.7里面的file文件操作3.x没有
1、标准操作:
f = open("yesterday",‘w‘,encoding="utf-8")#文件句柄(放到了内存什么位置) f.write("哈哈哈")#写入内容,如果没有该文件就自动创建 f.close#(关闭文件)
2、建议操作:
>>>with open("yesterday","w",encoding=‘utf-8‘) as data:#读写完后自动关闭,因为windows上默认的编码是gbk,所以需要转换成utf-8 data.write("哈哈哈")
3、打开模式:
r,只读模式(默认)。 w,只写模式。(不可读;不存在就自动创建;存在则删除内容) a,追加模式。(可读; 不存在则创建;存在则只追加内容) "+" 表示可以同时读写某个文件 r+,可读写文件。【可读;可写;可追加】 w+,写读 a+,同a "U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用) rU r+U "b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
.readlines(读成一个列表,所有内容)#默认每行之间有空行因为有\n,用strip()就行
.readline(默认一次只读一行)
.seek#位置0是开始
.tell#打印当前位置
.encoding#当前编码
.readable#文件是否可读
.writeable#是否可写
.flush#默认是等内存缓存满了才写入,强刷读一条直接写入硬盘
小练习
1 #!/usr/bin/env python 2 #—*—coding:utf-8—*— 3 with open("yesterday","r",encoding=‘utf-8‘) as data_1 , 4 open("yesterdaybak","w",encoding=‘utf-8‘) as data_2:#读写完后自动关闭 5 for line in data_1.readlines(): 6 if "中国石油" in line: 7 line = line.replace("中国石油","中国石化") 8 data_2.write(line)
yesterday#文件更改前 新浪 百度 中国石油 yesterdaybak#更改后文件内容 新浪 百度 中国石化
三、字符编码与转码
1、python3练习
打开文件yesterday(windows上),内容如下 新浪 百度 中国石油 >>>with open("yesterday","r") as data: >>> for line in data: >>> line = line.strip(‘\n‘) >>> print(line) 报错: UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xad in position 18: illegal multibyte sequence 解释: 我们知道utf-8是unicode的扩展,windows上默认编码是gbk,按照上图所示打开文件的时候我们需要将gbk转码直接解码(encoding)成utf-8。 如果是python2,.x的话,如果编码格式是gbk,我们首先需要将gbk转码成unicode,然后再将unicode解码(encoding)成utf-8。
四、函数
1、定义:
函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可
2、特性:
1、减少重复性
2、是程序扩展性好
3、使程序更容易维护
3、语法:
1 >>>def func(): 2 >>> print("你好中国!") 3 >>>func()
4、执行顺序:
>>>def func():#1>>#3(首先python程序通过关键字发现这是个函数)(当执行完func()时候又到了这里) >>> print("你好中国!")#4(最后才执行到这里) >>>func()#2(然后从上往下,这里执行了上面的函数)
5、函数参数
1 #默认参数 2 def func(x,y):#这里的x和y只是形参(形式参数) 3 print(x) 4 print(y) 5 func(1,2)#这里是实参(实际参数,就是真真切切要往函数体里面传的参数) 6 #1对应x,2对应y,也就是说实参合形参是平行对应的,否则打印出的效果就相反了。形参和实参不能多也不能少,否则报错。
1 #关键参数 2 def func(x,y,z): 3 print(x) 4 print(y) 5 print(z) 6 func(x= "中国",y="北京",z = "海淀") 7 #这样的话就没有了顺序的问题,只是要求形参和实参一定要对应,不能多,也不能少