一、雞湯 1.提高自我修養 2.人醜就要多讀書 3.多走走,開拓眼界 二、目錄: 1.列表、元組操作 2.字元串操作 3.字典操作 dict是無序的 key必須是唯一的 4.集合操作 集合是一個無序的,不重覆的數據組合,它的主要作用如下: 去重,把一個列表變成集合,就自動去重了 關係測試,測試兩組數 ...
一、雞湯
1.提高自我修養
2.人醜就要多讀書
3.多走走,開拓眼界
二、目錄:
1.列表、元組操作
2.字元串操作
3.字典操作
- dict是無序的
- key必須是唯一的
4.集合操作
集合是一個無序的,不重覆的數據組合,它的主要作用如下:
- 去重,把一個列表變成集合,就自動去重了
- 關係測試,測試兩組數據之前的交集、差集、並集、子集、對稱差集(反向差集)等關係
5.文件操作
文件操作流程:
- 打開文件,得到文件句柄並賦值給一個變數
- 通過句柄對文件進行操作
- 關閉文件
文件操作模式:
- 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
6.字元編碼與轉碼
Python2中的字元串進行字元編碼轉換過程是:
- 位元組串-->decode('原來的字元編碼')-->Unicode字元串-->encode('新的字元編碼')-->位元組串
Python3中定義的字元串預設就是unicode,因此不需要先解碼,可以直接編碼成新的字元編碼:
- 字元串-->encode('新的字元編碼')-->位元組串
三、練習
1.列表元組操作練習
#pycharm 5.0.3(python3.6) #定義一個空列表 names = [] print('列印空列表names:',names) #定義一個班級人員的列表 names = ['Alex','Felix','Fion','Susan'] #按下標取列表中的數據下標從0開始 print("取'Felix':",names[1]) #截取中間位置的人員 ,切片所取的位置包含其實位置,不包含結束位置(顧頭不顧尾) print('切片_方法1_明確位置:',names[1:3]) print('切片_方法2_取末尾:',names[-1]) #從右開始往左數是-1,-2.。。 print('切片_方法3_取最後邊:',names[-3:-1]) #如果要取後3個的話,寫-1就不行了,只能取2個: print('切片_方法4_取最後邊:',names[-3:]) #可以省略不寫,這樣就可以取多個了 print('切片_方法5_取前3:',names[0:3]) #起始位置可以寫0,也可以忽略 print('切片_方法5_取前3:',names[:3]) #同上 print('切片_方法6_按步長:',names[0:-1:2]) print('列表的增刪改查:'.center(40,'#')) names.append('Bob') #追加_末位最佳 print('追加_末位追加:',names) names.insert(1,'Jack') #追加_任意位置 print('追加_任意位置:',names) names[2] = 'Wulin' #修改,將列表下邊是2的名稱修改掉 print('修改:',names) names.remove('Wulin') #刪除 print('刪除_remove方式',names) del names[1] print('刪除_del方式',names) print(names.pop()) #不帶下標,刪除最後一個並返回刪除的值 print('刪除_pop方式',names) #刪除後的結果 print('查找_找下標:',names.index('Fion'))#查找人員索引位置,沒有回報錯 print('查找_找下標_借下標列印出名稱:',names[names.index('Fion')]) #看似多此一舉 names.insert(1,'Fion')#班級姓名重覆的情況,可以統計重覆的個數 print('統計重覆個數:',names.count('Fion')) #清除列表clear name.clear names.reverse()#反轉 print('反轉:',names) names.insert(3,'4zhang') #插入數字開頭的 names.insert(3,'!#woaini') #插入特殊字元開始的 names.sort()#排序 print('排序',names) names2 = [12,34,5] names.extend(names2)#將names2併入到name print('列印合併後的兩個列表:',names) print('以下為淺複製相關'.center(50,'-'))#以下淺複製相關,需要記住這個特性,儘管用的較少 #列表中可以包含列表 names.insert(0,['age','grade']) #向列表中插入一個列表 #print('列印包含列表的列表:',names) names3 = names.copy()#後邊用到,淺copy,複製一個列表出來 print('列印copy前的列表:',names) print('列印copy後的列表:',names3) names[0][0] ='sex' #修改列表中列表的值 names[5] ='Wo' #修改names列表中Susan的名稱為Wo,然後對比複製前複製後列表值的變化 print('列印修改後的列表:',names) print('列印copy後的列表:',names3) #對比以上4個列印結果可以發現,列表中列表的值names和names3都被修改了,但是列表中的值只有names裡邊被修改了,這個叫淺copy #即只copy了第一層,由於列表中的列表只是個記憶體地址,所以修改names的列表中的列表的值後names3中的也跟著變了。 print('以下為深copy相關'.center(50,'-'))#一下深複製相關,不隨便用,通常不需要隨便複製一份(比如數據比較大的情況) import copy #此時需要用到copy模塊 print('列印深copy前的列表:',names) names4 = copy.deepcopy(names) #調用copy模塊的深copy names[0][0] = 'home' #修改列表中列表的值 print('列印深copy後的列表:',names) print('列印深copy後的列表:',names4) #可以發現列表沒有變化 print('以下為列表的迴圈'.center(50,'-')) # for i in names: print(i) print('以下為淺複製的一個場景'.center(50,'-')) person = ['name',['saving',100]] ''' #3中淺copy方式 p1 = copy.copy(person) # p2 = person[:] #切片 p3 = list(person) #工廠函數 #淺copy什麼情況下比較有用 ''' #有以下兩個人,都基於person複製過來,兩人有一個共同賬號,如果一個少了50則另一個發現也少了50 p1 = person[:] p2 = person[:] p1[0]='Felix' p2[0]='Fiona' p1[1][1] =50 #公共賬號少了50,那麼兩個人發現都少了50 print(p1) print(p2)列表代碼 元組代碼
2.字元串操作練習
#pycharm 5.0.3(python3.6) name = 'my \tname is felix {first},my age is {age}' #pycharm有提醒功能,當輸入name.的時候就會提醒字元串都有哪些操作,有兩個下劃線開始結尾的不用管 print('首字母大寫:',name.capitalize()) print('統計個數',name.count('i')) print('總共50個字元,不夠的用-補齊:',name.center(50,'-')) print('以什麼結尾,匹配上則為真:',name.endswith('x')) print('將tab轉為多少個空格:',name.expandtabs(tabsize=20)) #在變數值中插入一個tab print('查找,返回值所在的位置',name.find('is')) #字元串的切片 print('字元串的切片:',name[name.find('is'):11]) print('格式化字元串,向{}中傳值:',name.format(first='Song',age=23)) print('格式化字元串,傳字典形式的值:',name.format_map({'first':'Song','age':12})) print('ab23!'.isalnum()) #'是否是阿拉伯數字,如果裡邊有特殊字元返回false print('ab'.isalpha())#是否是存英文字元 print('1A'.isdecimal())#是否是十進位 print('10'.isdigit())#是否是整數 print('1A'.isidentifier()) #是否是一個合法的標識符 關註變數的命名規則,不符合的則為False print('A'.islower()) #判斷是不是小寫 print('22'.isnumeric()) #判斷是不是一個數字,只識別整數 print(' '.isspace())#是否是空格 print('my name is '.istitle()) #判斷一個字元串是不是title,每個首字母大寫 print(''.isprintable())#是否可以列印,字元串不用考慮,比如還是tty文件 print('s'.isupper())#判斷是不是大寫 print('+'.join(['1','2','3','4']))#將列表中的字元串用某一個字元連接 print(name.ljust(50,'*')) #和center類似,50個字元,不夠的用*號補齊 print(name.rjust(50,'*')) print('FELIX'.lower())#把大寫變成小寫 print('felix'.upper())#把大寫變成小寫 print('\nFelix'.lstrip())# strip預設會去除兩邊預設的空格回車 ,lstrip是去除左邊的空格回車 print('Felix\n'.rstrip()) print('Felix\n'.strip())# strip預設會去除兩邊預設的空格回車 print('------') p = str.maketrans('abcdef','123456') # 做映射,可以做隨機密碼來玩 print('Felix'.translate(p))# str = 'http://www.baidu.com/index' print(str.partition('://'))#從左邊找指定的分隔符將字元串進行分割 #返回一個3元的元組,第一個為分隔符左邊的子串,第二個為分隔符本身,第三個為分隔符右邊的子串。 print('Felix'.replace('i','I')) print('felix songi'.rfind('i')) #從做往右,找到最右邊那個值的下標返回 print('123'.rindex('3'))#返回子字元串 str 在字元串中最後出現的位置,如果沒有匹配的字元串會報異常 str = 'http://www.baidu.com/index' print(str.rpartition('/'))##從右邊找指定的分隔符將字元串進行分割 print('fe li xl'.split(' ')) print('fe li\n xl'.splitlines()) #按換行來分 print('felix'.startswith('f')) #判斷是否是什麼開頭的 print('Felix Song'.swapcase()) #大寫邊小寫,小寫邊大寫 print('Felix Song'.zfill(50)) #50個字元不夠數的用0填充練習代碼
3.字典操作練習
#pycharm 5.0.3(python3.6) #定義一個欄位(key-value格式) info = { 'stu1101':'TengLan Wu', 'stu1102':'LonZe Luola', 'stu1103':'XiaoZe Maliya', } print(info) #字典是無序的 #查,方法1,如果key不存在的話會出錯 print('取字典中某一個key對應的值:',info['stu1101']) #查,方法2,有就返回,沒有就返回none,這是一種安排的方法 print(info.get('stu1104')) #查,方法3,判斷key在不在,不在就返回False print('stu1104' in info) #改 info['stu1101'] = '武藤蘭' #增,當key值不存在的時候會增加 info['stu1104'] ='Cangjingkong' print(info) #刪除 del是python中的一個通用方法 del info['stu1101'] print(info) #刪除,pop刪除, info.pop('stu1102') print(info) #刪除,popitem,隨機刪除 info.popitem() print(info) #更新update, b = { 'stu1101':'Felix', 1:3, 2:5 } info.update(b) #合併兩個欄位,有交叉則更新,沒有則創建 print(info) #fromkeys與info沒什麼關係,初始化一個列表,這個地方有個坑 c = info.fromkeys([6,7,8],[1,{'name':'alex'},444]) #相當於創建了一個字典 print(c) c[7][1]['name'] = 'Fiona'#修改的時候會把fromkeys值都修改,類似於一個淺copy print(info.items()) #將字典變成了大的列表基本操作
#字典可以多級嵌套字典 China ={ '北京':{ '昌平':{ '沙河':['oldboy','test'], '天通苑':['鏈家地產','我愛我家'], }, '朝陽':{ '望京':['賓士','陌陌'], '國貿':['CICC','HP'], '東直門':['Adent','wwo'] }, '廣東':{ '東莞':{}, '佛山':{}, '廣州':{}, }, } } #修改東直門下的公司名稱(key儘量不要寫中文) China['北京']['朝陽']['東直門'][1] = 'Kaitong' print(China) #列印所有不包含key的值 print(China.values()) #列印所有key值 print(China.keys()) #setdefault 如果字典不存在可以新增,存在則返回key所對應的值 China.setdefault('陝西',{'寶雞':{}}) China.setdefault('北京',{}) print(China) print(China.setdefault('北京',{}))多級嵌套
#pycharm 5.0.3(python3.6) info = { 'stu1101':'TengLan Wu', 'stu1102':'LonZe Luola', 'stu1103':'XiaoZe Maliya', } for i in info: print(i) #只是列印了key for i in info: print(i,info[i]) #列印key和value,建議的迴圈方式 #上邊的效果和下邊的一致,但是上邊的效果高,因為有一個字典轉變為列表的過程 for k,v in info.items(): print(k,v)字典的迴圈
4.集合操作練習
#pycharm 5.0.3(python3.6) #定義列表,集合;列表轉變為集合的方式就是用set()框起來 list_1 = [20,1,4,5,7,3,6,7,9] list_1 = set(list_1) list_2 = set([2,6,0,66,22,8,4]) print(list_1,type(list_1)) print(list_2,type(list_2)) #交集 print('交集:',list_1.intersection(list_2)) print('交集運算符',list_1 & list_2) #並集 print('並集:',list_1.union(list_2)) print('並集運算符:',list_1 | list_2) #差集 print('差集(1有2沒有):',list_1.difference(list_2)) print('差集(2有1沒有)',list_2.difference(list_1)) print('差集運算符(1有2沒有)',list_1 - list_2) print('差集運算符(2有1沒有)',list_2 - list_1) list_3 = set([1,3,7]) #子集 (前邊的是不是後邊的子集或者父集),子集沒有專門的運算符 print('子集(1是不是2的子集):',list_1.issubset(list_2)) #父集 print('父集(1是不是2的父集):',list_1.issuperset(list_2)) print('子集(1是不是3的子集):',list_1.issubset(list_3)) print('父集(1是不是3的父集):',list_1.issuperset(list_3)) #對稱差集(反向差集):把兩個都有的去掉 print('對稱差集',list_1.symmetric_difference(list_2)) print('對稱差集運算符',list_1 ^ list_2) print('遺漏'.center(50,'#')) #判斷兩個是否有交集,有返回fase,沒有返回true list_4 = set([5,6,8]) print(list_4.isdisjoint(list_3)) print(list_1.isdisjoint(list_2)) #pop 任意刪除一個,並返回一個值 print('刪除任意一個並返回其值:',list_1.pop()) print('刪除任意一個並返回其值:',list_1.pop()) #discard刪除一個值,如果值有則刪除,如果沒有返回空不報錯,remove會報錯 list_1.discard(7) #discard刪除一個值 print('discard刪除一個值後list_1結果:',list_1) list_1.discard(1000)#刪除一個不存在的值,這裡什麼也不做也不會報錯 print('discard刪除一個值list_1結果::',list_1) print('集合的增刪改查'.center(30,'-')) #增加 list_1.add(2000) print('增加一個:',list_1) #增加多項 list_1.update([20,40,555]) print('增加多個:',list_1) #刪除,值不存在的時候會報錯 list_1.remove(2000) print('移除:',list_1) #長度判斷 print('長度',len(list_1)) #成員判斷:判斷20是否在list_1中 print('成員判斷:',20 in list_1) print('成員判斷:',1000 not in list_1) #copy:淺複製集合代碼
5.文件操作
#pycharm 5.0.3(python3.6) #文件的打開、讀寫操作 #讀: ''' f = open('yesterday2','r',encoding='utf-8') #打開文件 (此處如果不加編碼格式,windows預設編碼是gbk,而python預設是utf8 #的)所以需要指定編碼用utf-8打開文件 data = f.read() #文件打開了只是一個記憶體對象,所以需要賦變數的形式進行操作 data2 = f.read() #上邊讀完了,此時在讀的話是從末行開始讀,所以這裡讀的內容是空的。 print(data) print('data2:',data2) #列印內容為空理解(讀文件的時候相當於是有個游標的東東,python會記錄游標的位置,我們要想從任意位置 #讀取的話就可以通過操作游標實現) ''' #寫 ''' f = open('yesterday2','w',encoding='utf-8') #寫的話需要在open中加上打開文件的模式'w'(預設讀模式) f.write('I love you Fiona,\n') #open模式中只寫‘w’相當於是創建一個文件*慎用*,會把原文件清空 f.write('very much') #第一行內容不帶\n的話會寫在同一行 ''' ''' #'a' 追加的話需要在open中加上打開文件的模式(預設讀模式),相當於append(在末尾增加) f = open('yesterday2','a',encoding='utf-8') f.write('hahhhhhhh\n') f.write('luhaluhaluha') f.close() #寫完文件要把文件關閉 ''' #讀2行 ''' #readlin預設讀文件中的一行 f = open('yesterday','r',encoding='utf-8') print(f.readline()) print(f.readline()) ''' #讀5行,可以用迴圈 ''' f = open('yesterday','r',encoding='utf-8') for i in range(5): print(f.readline().strip()) #strip可以去除兩邊的換行和空格 ''' #需求:讀多行,readlines讀所有的文件,在第10行的位置列印一個分割線 ''' f = open('yesterday','r',encoding='utf-8') #print(f.readlines()) #讀所有的行放到一個列表 #print(list(enumerate(f.readlines()))) #解決:通過for迴圈可以把這個列表的數據取出來,通過enumerate將列表的下標和值存成元組形式,然後在賦兩個值 for index,line in enumerate(f.readlines()): if index ==9: print('我是分割線') continue print(line.strip()) ''' #需求,readlines只適合讀小文件,讀大文件怎麼辦 :讀一行刪一行,記憶體只存一行 #此時文件變成了一個迭代器,無法通過枚舉取下標了 ''' f = open('yesterday','r',encoding='utf-8') count = 0 for line in f: if count == 9: print('我是分割線') count += 1 continue print(line) f.close() '''文件操作
#pycharm 5.0.3(python3.6) #需求:怎麼將游標移動,獲取想要列印的內容呢? f = open('yesterday','r',encoding='utf-8') print(f.tell()) #列印游標位置 ,按字元的個數計數 print(f.readline()) print(f.readline()) print(f.readline()) print('總共讀了幾個字元:',f.tell()) print('游標返回到第幾個字元:',f.seek(0)) #