Python学习Day2
1.集合
集合特性:
(1)去重,创造一个集合的时候自动剔除了重复项。
(2)关系测试,测试两组数据之间的交集,并集,差集,对称差集,子集等关系。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 list_1 = [1,2,3,4,5,2,3,5,7] 2 list_1 = set(list_1) 3 4 list_2 = set([2,5,8,9]) 5 print(list_1,list_2) #集合也是无序的,可以去重 6 7 print(list_1.intersection(list_2)) #交集 8 print(list_1 & list_2) #符号表示交集 9 10 print(list_1.union(list_2)) #并集 11 print(list_1 | list_2) #符号表示并集 12 13 print(list_1.difference(list_2)) #差集 14 print(list_1 - list_2) #符号表示差集 15 16 list_3 = set([1,2,3]) 17 print(list_3.issubset(list_1)) #判断子集 18 print(list_1.issuperset(list_3)) #判断父集 19 20 print(list_1.symmetric_difference(list_2)) #对称差集,互相都没有的组合在一起 21 print(list_1 ^ list_2) #符号表示对称差集 22 23 print("------------------------") 24 list_4 = set([4,5,6]) 25 print(list_3.isdisjoint(list_4)) #两集合没有交集返回true 26 27 list_1.add(999) #添加一项 28 list_1.update([888,777,555]) #添加多项 29 list_1.remove(999) #移除一项 30 print(len(list_1)) #长度 31 32 print(list_1) 33 print(list_1.pop()) #任意移除一项并返回 34 35 list_1.discard() #删除元素的时候当元素存在的时候删除,不存在的时候do nothing
2.文件
a.模式:
(1) "r":只读,不可写。第一次读取文件的时候会到一个位置,第二次读取文件的时候会从上次的位置开始,而不是从头开始
(2)"w":只写,不可读,会打开一个新的文件,覆盖掉之前的文件(慎重使用)
(3)"a":只写,不可读,会在原来的文件后面进行追加
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #f = open("apologize",'r+',encoding="utf-8") #文件句柄 读写 2 #f = open("apologize",'w+',encoding="utf-8") #文件句柄 写读 3 #f = open("apologize",'a+',encoding="utf-8") #文件句柄 追加读写 4 #f = open("apologize",'rb') #文件句柄 二进制文件 (网络传输) 5 f = open("apologize",'wb') 6 f.write("hello binary\n".encode()) #字符写入二进制的时候会出现问题,需要转化为二进制 7 f.close()
b.注意点:
(1)每次操作完文件之后一定要f.close()
c.方法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 print(f.tell()) #得出此时读到的光标的位置 2 print(f.tell()) #按字符来计数 3 f.seek(0) #回到指定位置 4 print(f.encoding) #打印文件编码 5 print(f.fileno()) #返回文件句柄在系统的编号 6 print(f.flush()) #强制刷新,强制将数据存储到硬盘中 7 print(f.closed) #判断文件是否关闭 8 f.truncate(10) #从头开始截断
d.进度条实现:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import sys,time 2 3 for i in range(50): 4 sys.stdout.write("#") #在一行中写,不会换行 5 sys.stdout.flush() #强制刷新(因为内存会缓存满数据之后再存储到硬盘中,加一个 6 #强制刷新,可以实时的将数据存储到硬盘中) 7 time.sleep(0.2) #时间延迟
e.文件修改:
修改文件的方法是重新写入一个新的文件,通过一个循环,在原文件中判断,然后replace替换
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 f = open("apologize",'r',encoding="utf-8") 2 f_new = open("apologize.bak",'w',encoding="utf-8") 3 4 for line in f: 5 if "只能沉默无言" in line: 6 line = line.replace("只能沉默无言","有好多话说") 7 8 f_new.write(line) 9 10 f.close() 11 f_new.close()
f.with:
with语句结束之后自动关闭文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 with open("apologize",'r',encoding="utf-8") as f: 2 for line in f: 3 print(line)
3.字符编码与转码:
参考文章:
http://www.cnblogs.com/luotianshuai/articles/5735051.html
http://www.cnblogs.com/yuanchenqi/articles/5956943.html
http://www.diveintopython3.net/strings.html
(1)Python3默认是Unicode编码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # -*- coding: utf-8 -*- 2 3 import sys 4 print(sys.getdefaultencoding()) #查询默认编码方式 5 6 s = "你好" 7 s_gbk = s.encode("gbk") #Python默认是Unicode编码 8 s_gbk_utf8 = s_gbk.decode("gbk").encode("utf-8") 9 print(s.encode("gbk")) 10 print(s_gbk_utf8) 11 print(s.encode("utf-8").decode("utf-8").encode("gb2312"))
(2)编码转换图示:
4.函数:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def func(x,y,z): 2 print(x) 3 print(y) 4 print(z) 5 6 func(1,y=2,z=3) #位置参数不能在关键字参数前面 7 8 #默认参数特点:调用函数的时候,默认参数非必须传递 9 #用途:1.默认安装值 10 11 #*args:接受n个位置参数,转换成元组的方式 12 #**kwargs:把n个关键字参数,转换成字典的方式
a.函数特性:
(1)减少重复代码
(2)使程序变的可扩展
(3)使程序变的易维护
b.局部变量:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 age = 18 2 3 def change_name(name): 4 global age #将局部变量的作用域改为全局变量 5 age = 28 6 print("before name:",name,age) 7 name = "丑女" #这个函数就是这个变量的作用域,但是列表,集合,字典,类不受影响,可以修改 8 print("after name:",name) 9 10 name = "mm" 11 change_name(name) 12 print(name,age)
c.递归:
(1)必须有一个明确的结束条件
(2)每次进入更深一层递归时,问题规模相比上次递归都应有所减少
(3)递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)