本節內容: 1.集合及其運算 2.文件讀與寫詳解(1-3) 3.文件修改詳解 4.字元編碼轉化詳解(1-2) 5.函數與函數式編程(1-2) 6.函數式編程之參數詳解(1-2) 7.函數式編程與函數不同 8.局部變數與全局變數的作用域(1-2) 9.遞歸 10.高階函數 一.集合及其運算 1.集合的 ...
本節內容:
1.集合及其運算
2.文件讀與寫詳解(1-3)
3.文件修改詳解
4.字元編碼轉化詳解(1-2)
5.函數與函數式編程(1-2)
6.函數式編程之參數詳解(1-2)
7.函數式編程與函數不同
8.局部變數與全局變數的作用域(1-2)
9.遞歸
10.高階函數
一.集合及其運算
1.集合的概念
集合是一個無序的,不重覆的數據組合,它的主要作用如下
*去重,把一個列表變成集合,就自動去重了
*關係測試,測試兩組數據之前的交集、並集、差集、子集、父級、對稱差集,判斷沒有交集等關係
2.常用操作:
1):集合的增刪改查:
1 #Author Jame-Mei 2 #集合的增刪改查等基本操作 3 4 list1=set([1,3,5,7]) 5 6 #1.增加 7 list1.add(9) #添加單項,update添加多項。 8 print (list1): 9 {1, 3, 5, 7, 9} 10 11 ======================================= 12 #2.刪除 13 list1.remove(1) #刪除指定單個,如果指定不存在報錯 14 list1.pop() #刪除任意並返回 15 list1.discard('absdf') ##刪除指定單個,如果指定不存在返回None值(不報錯) 16 17 print (list1): 18 {3, 5, 7} 19 ======================================= 20 21 #3.修改 22 list1.update([2,4,6]) #註意這裡格式,為列表的格式!! 23 list1.update(['a','A','b','C']) 24 25 print (list1)#(輸出後,原來的數據不變,會添加到集合里,順序是隨機的!) 26 {1, 2, 3, 4, 5, 6, 7, 'b', 'C', 'a', 'A'} 27 28 ======================================== 29 30 #4.查看 31 32 #1):長度 33 print(len(list1)) 34 35 #2):查看元素是否在集合中(列表,字典,集合,字元串都可以用in 或者not in來判斷!!!) 36 print (5 in list1) 37 #3):查看元素是否不是list1中 38 print (9 not in list1) 39 40 #4):測試list1是否是list2的子集 41 list2=set([1,3,5,7,9]) 42 43 44 print(list1.issubset(list2)) 45 #運算符 46 print (list1<=list2) 47 48 #5):測試list2是否是list1的父級 49 print(list2.issuperset(list1)) 50 #運算符 51 print (list2>=list1) 52 53 #還有並集 | ,差集 - ,對稱差集 ^,淺coyp: list1.copy等等View Code
2):常見的集合運算和集合運算符
1 #Author Jame-Mei 2 3 #1.去除除列表中重覆值 4 list1=[1,3,5,7,1,2,4,7] 5 6 list1=set(list1) 7 print (list1,type(list1)) 8 9 output: 10 {1, 2, 3, 4, 5, 7} <class 'set'> 11 =========================================================================================>>>>>>>> 12 13 14 #2.取交集:關係測試 15 list1=set([1,3,6,7,9]) 16 list2=set([2,4,6,7,8]) 17 #其中重覆為6,7 18 print (list1,list2): 19 {1, 3, 6, 7, 9} {2, 4, 6, 7, 8} 20 21 #list3為交集的元素 22 list3=list1.intersection(list2) 23 print (list3): 24 {6, 7} 25 26 #交集元算符:& (兩邊無先後順序) 27 list1 & list2 28 =========================================================================================>>>>>>>> 29 30 31 #2.取並:union() 32 list1=set([1,3,5]) 33 list2=set([2,4,6]) 34 35 list3=list1.union(list2) 36 print (list3): 37 {1, 2, 3, 4, 5, 6} 38 39 #並集運算符:| (兩邊無先後順序) 40 list1 | list2 41 =========================================================================================>>>>>>>> 42 43 44 #3.差集:求list1和list2共有的以外的,各自的元素。 45 list1=set([1,3,5,7,9]) 46 list2=set([2,4,6,7,9]) 47 48 #取list1的差集,list2中沒有的,屬於list1的。 49 list3=list1.difference(list2) 50 print (list3): 51 {1, 3, 5} 52 53 #取list2的差集,list1中沒有的,屬於list2的。 54 list4=list2.difference(list1) 55 print (list4): 56 {2, 4, 6} 57 58 #差集運算符: - (在左邊,不在右邊) 59 list1 - list2 60 61 list2 - list1(差集的元素在list2中,不在list1中) 62 =========================================================================================>>>>>>>> 63 64 65 #4.子集:list1是否是list2的子集(兒子),list1裡面有的list2都有,list2裡面有的,list1不一定有(list2包括list1) 66 list1=set([1,3,5]) 67 list2=set([1,3,5,7,9]) 68 print (list1.issubset(list2)): 69 True 70 =========================================================================================>>>>>>>> 71 72 73 74 #5.父級:list1是否是list2的父級(父親),list1包括list2,list1裡面有的list不一定有,list2有的list1一定有。 75 list2=set([1,3,5]) 76 list1=set([1,3,5,7,9]) 77 print(list1.issuperset(list2)): 78 True 79 =========================================================================================>>>>>>>> 80 81 82 #6.對稱差集:去除2者重覆後的所有元素,或者這兩者的差集相加,(互相都沒有的和)就是對稱差集。 83 list2=set([1,3,5,8,10,12]) 84 list1=set([1,3,5,7,9]) 85 86 print (list1.symmetric_difference(list2)): 87 {7, 8, 9, 10, 12} 88 89 #對稱差集的元算符: ^ (返回一個新的 set 包含 list1 和 list2 中不重覆的元素 ,無順序關係!) 90 list1 ^ list2 91 92 =========================================================================================>>>>>>>> 93 #7.判斷沒有交集,True=沒有交集,False=有交集。 94 list1=set([1,3,5]) 95 list2=set([2,4,6]) 96 97 flag=list1.isdisjoint(list2) 98 print(flag): 99 TrueView Code
二.文件的讀與寫(操作1-3實例)
*對文件操作流程:
1):打開文件,得到文件句柄並賦值給一個變數
2):通過句柄對文件進行操作
3):關閉文件
*打開文件的模式有:
- r,只讀模式(預設)。
- w,只寫模式。【不可讀;不存在則創建;存在則刪除內容;】
- a,追加模式。【可讀; 不存在則創建;存在則只追加內容;】
"+" 表示可以同時讀寫某個文件:
- r+,可讀寫文件。【可讀;可寫;可追加】
- w+,寫讀
- a+,同a
"U"表示在讀取時,可以將 \r \n \r\n自動轉換成 \n (與 r 或 r+ 模式同使用)
- rU
- r+U
"b"表示處理二進位文件(如:FTP發送上傳ISO鏡像文件,linux可忽略,windows處理二進位文件時需標註)
- rb
- wb
- ab
1.文件的基本操作
1 #Author:Jame Mei 2 #在當前目錄新建yesterdaytext和yesterday兩個文件 3 4 '''#1.預設方式為'r'的方式打開讀取文件 5 file1=open("yesterdaytext",encoding='UTF-8').read() 6 print (file1) 7 ''' 8 9 10 """ 11 #2.讀取改進款,f為文件句柄(記錄文件的文件名、文件位置,文件大小等等),'r'打開文件的模式:註意位置,不寫預設r模式。 12 f=open('yesterdaytext','r',encoding='utf-8') 13 data1=f.read() 14 data2=f.read() 15 print (data1) #data1正常輸出!! 16 print ("=========data2=====發現data2為空....無法再從頭讀一遍!===") 17 print (data2) 18 """ 19 20 '''#3.寫覆蓋模式w 21 f=open("yesterday",'w',encoding='utf-8') 22 f.write("我愛北京天安門\n") 23 f.write("天安門上紅旗飄揚") 24 ''' 25 26 '''#4.寫追加模式a 27 f=open("yesterday",'a',encoding='utf-8') 28 29 f.write("one night beijin,我留下很多情!") 30 f.write('\n不敢在午夜問路,怕驚醒了帝都的魂!') 31 '''View Code
2.文件操作的一些方法
1 #Author:Jame Mei 2 3 '''#1.讀文件的前五行 4 f=open('yesterdaytext','r',encoding='utf-8') 5 6 for i in range(5): 7 print (f.readline()) 8 ''' 9 10 11 '''#2.讀取文件,跳過第十行! 12 f=open('yesterdaytext','r',encoding='utf-8') 13 for index,line in enumerate(f.readlines()): 14 if index==9: 15 print ('-------------------------------------我是分割線------------------------------') 16 continue 17 print (line.strip()) 18 ''' 19 20 '''#3.readline只適合讀取小文件,用下麵的方式來讀,效率高,記憶體中只保存一行,適合數據了大的場景!! 21 #f相當於迭代器 22 count=0 23 f=open('yesterdaytext','r',encoding='utf-8') 24 for line in f: 25 if count==9: 26 print ('---------------------------過濾第10行-------------------------->>>>>>>>>>>>>>') 27 count += 1 28 continue 29 print (line.strip()) 30 count+=1 31 ''' 32 33 '''#4.對於read()讀過一遍後,無法再從頭讀,進行解答。 34 #重要函數readline(),seek()! 35 上文疑問實例預覽: 36 data1=f.read() 37 data2=f.read() 38 print (data1) #data1正常輸出!! 39 print ("=========data2=====發現data2為空....無法再從頭讀一遍!===") 40 print (data2) 41 42 #解決: 43 f=open('yesterdaytext','r',encoding='utf-8') 44 print (f.tell()) #告訴目前游標的位置! 45 print (f.readline()) #讀取一行 46 print (f.readline()) #讀取2行後,我現在想返回? 47 #print (f.read(5)) #去讀指定的個數字元 48 print (f.tell()) 49 50 f.seek(0)#返回開頭的游標的位置! 51 #f.seek(10) #把游標移動到第10個字元前,readline()從第10個字元讀到第一行的結尾。 52 print (f.readline()) 53 print (f.tell()) #又到了讀完第一行的游標位置! 54 ''' 55 56 '''#5.enconding()方法,fileno()方法讀取文件的記憶體里的編號,isatty()判斷是否一個底層不可列印設備。 57 f=open('yesterdaytext','r',encoding='utf-8') 58 print(f.encoding): 59 utf-8 60 print (f.fileno()): 61 3 62 print (f.isatty()): 63 False 64 ''' 65 66 '''#6.seekable ,判斷是否可以移動。readable(),writeable() 67 f=open('yesterdaytext','r',encoding='utf-8') 68 69 print (f.seekable()): 70 True 71 print (f.readable()): 72 True 73 print (f.writable()): 74 False 75 ''' 76 77 '''#7.flush(),在windows或者linux的終端視窗下效果比較明顯,防止斷電沒有從記憶體中寫入到磁碟。 78 #closed判斷文件是否關閉了,沒有關閉False! 79 f=open('yesterday02','w',encoding='utf-8') 80 f.write("hello") #在dos下寫過之後,查看yesterday02並沒有寫入,flush()之後才能看到存儲到文件中。 81 f.flush() 82 83 print (f.closed): 84 False 85 ''' 86 87 '''#8.truncate()截斷,w如果不寫會清空文件,a如果不寫預設不操作。寫了10,從第10個字元截斷,後面的刪除。 88 f=open('yesterday02','a',encoding='utf-8') 89 #f.truncate() 90 f.seek(10) #游標跳到第10個字元,截圖前20個,後面的刪除!! 91 f.truncate(20) 92 '''View Code
實現windows or linux安裝進度條列印效果:
1 #Author:Jame Mei 2 import sys,time 3 4 #實現windows安裝進度條顯示.......... 5 for i in range(30): 6 sys.stdout.write("#") 7 sys.stdout.flush() 8 time.sleep(0.3)View Code
3.文件操作的重要參數操作:
r+、w+、a+、rb、wb等
1 #Author:Jame Mei 2 3 '''#1.open()的r+(讀寫)參數實例,打開讀並追加這個比較常用!! 4 f=open('yesterdaytext','r+',encoding='utf-8') 5 count=0 6 for lin in f: 7 if count==3: 8 f.write("\n>>>>>列印前三行,開始w的操作>>>") #發現無論如何都無法在第三行之後寫,只能從最後開始追加寫入!! 9 count+=1 10 11 print(f.readline()) 12 count+=1 13 ''' 14 15 16 '''#2.open()的w+(寫讀)參數實例,依然和r+一樣,只能從文件的末尾追加寫入!這個應用場景比較少 17 f=open('yesterday02','w+',encoding='utf-8') 18 f.write("123456789\n") 19 f.write("23456789\n") 20 f.write("3456789\n") 21 22 print(f.tell()) 23 f.seek(10) 24 print (f.tell()) 25 26 print (f.readline()) 27 28 f.write("456789") 29 f.close() 30 ''' 31 32 33 34 '''#3.open()的a+ 追加讀寫,a不能讀其他和a+一樣 35 f=open('yesterdaytext','a+',encoding='utf-8') 36 print(f.readline()): 37 結果是列印出空白,不知道a+模式不是可以讀嗎?? 38 39 ''' 40 41 42 43 44 '''#4.open()的rb,wb:以二進位格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是預設模式。一般用於非文本文件如圖片等。 45 f=open('yesterdaytext','rb') #可以以2進位的方式讀出來,不進行解碼decode()的話,會帶b''的方式顯示。 46 print (f.readline()) 47 print (f.readline().decode()) #解碼成utf-8格式顯示 48 #如果不去掉enconfing='utf-8'則會valueError: binary mode doesn't take an encoding argument 49 50 51 f=open('yesterday02','wb') #二進位寫模式,要把字元串轉換bytes 52 f.write("cedfg".encode()) #encode預設utf-8 53 #字元串如果不轉換成bytes,則出現:TypeError: a bytes-like object is required, not 'str' 54 '''View Code