標籤:順序 模式 讀一行 center 未在 ftp 例子 /usr nan
集合
集合是一個無序的,不重複的資料群組合,它的主要作用如下:
1、去重,把一個列表變成集合,就自動去重了
2.、關係測試,測試兩組資料之前的交集、差集、並集等關係
例子
list_1 = [1,3,4,7,8,4,3]list_1 = set(list_1)print(list_1,type(list_1))#type類型{1, 3, 4, 7, 8} <class ‘set‘>
基本集合
#!/usr/bin/env python# -*- coding:utf-8 -*-#Author:liyananlist_1 = [1,3,4,7,8,4,3]list_1 = set(list_1)#print(list_1,type(list_1))list_2= [1,5,22,4,9,0]list_2 = set(list_2)print(list_1,list_2)print(list_1.intersection(list_2)) #交集方法1print(list_1&list_2)#交集方法2print(list_1.union(list_2))#並集方法1print(list_1|list_2)#並集方法2print(list_1.difference(list_2))#差集,在1中不在2中print(list_1-list_2)#同上list_3=[5]list_3=set(list_3)print(list_3.issubset(list_2))#子集,3在2中print(list_2.issuperset(list_3))#2包含3print(list_1.symmetric_difference(list_2))#對稱差集方法1,在1和2中列出不同的,不列出相同的print(list_1^list_2)#對稱差集方法2#輸出{1, 3, 4, 7, 8} {0, 1, 4, 5, 9, 22}{1, 4}{1, 4}{0, 1, 3, 4, 5, 7, 8, 9, 22}{0, 1, 3, 4, 5, 7, 8, 9, 22}{8, 3, 7}{8, 3, 7}TrueTrue{0, 3, 5, 7, 8, 9, 22}{0, 3, 5, 7, 8, 9, 22}
增加
list_1.add(999) #增加一項list_2.update([88,888,8888])#增加多項print(list_1,list_2)#輸出{1, 3, 4, 7, 8} {0, 1, 4, 5, 9, 22}{1, 3, 4, 7, 8, 999} {0, 1, 4, 5, 9, 8888, 888, 22, 88}
刪除
list_2.remove(88) print(list_2)#輸出{0, 1, 4, 5, 9, 8888, 888, 22, 88}{0, 1, 4, 5, 9, 8888, 888, 22
其他
#摘用alex老師部落格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”的一個淺複製
檔案
對檔案操作流程
1、開啟檔案,得到檔案控制代碼並賦值給一個變數
2、通過控制代碼對檔案進行操作
3、關閉檔案
#wenjian致橡樹 我如果愛你—— 絕不像攀援的淩霄花, 借你的高枝炫耀自己; 我如果愛你—— 絕不學癡情的鳥兒 為綠蔭重複單調的歌曲; 也不止像泉源 長年送來清涼的慰藉; 也不止像險峰 增加你的高度,襯托你的威儀。 甚至日光。 甚至春雨。 不,這些都還不夠! 我必須是你近旁的一株木棉, 作為樹的形象和你站在一起。 根,緊握在地下 葉,相觸在雲裡。 每一陣風吹過 我們都互相致意, 但沒有人 聽懂我們的言語。 你有你的銅枝鐵幹, 像刀、像劍 也像戟; 我有我紅碩的花朵 像沉重的歎息, 又像英勇的火炬。 我們分擔寒潮、風雷、霹靂; 我們共用霧靄、流嵐、虹霓。 彷彿永遠分離, 卻又終身相依。 這才是偉大的愛情, 堅貞就在這裡:不僅愛你偉岸的身軀, 也愛你堅持的位置,腳下的土地。
基本操作
#!/usr/bin/env python# -*- coding:utf-8 -*-#Author:liyananf = open(‘wenjian‘,encoding="utf-8")#檔案控制代碼first_line = f.readline()print("first line",first_line)#讀一行print(‘我是分割線‘.center(50,‘-‘))data = f.read()#讀取剩下的所有內容,檔案大時不要用print(data)f.close()
開啟檔案的模式有:
1、r,唯讀模式(預設)。
2、w,唯寫模式。不可讀;不存在則建立;存在則刪除內容;
3、a,追加模式。可讀; 不存在則建立;存在則只追加內容;
例子
#2、w,唯寫模式。f = open(‘wenjian2‘,‘w‘,encoding="utf-8")f.write("我愛北京天安門")
#a,追加模式f = open(‘wenjian2‘,‘a‘,encoding="utf-8")f.write("\n天安門前路很寬\n")
讀取多行
f = open(‘wenjian‘,‘r‘,encoding="utf-8")for i in range(7): print(f.readline())#輸出致橡樹 我如果愛你—— 絕不像攀援的淩霄花, 借你的高枝炫耀自己; 我如果愛你—— 絕不學癡情的鳥兒 為綠蔭重複單調的歌曲;
"+" 表示可以同時讀寫某個檔案
r+,可讀寫檔案。可讀;可寫;可追加
w+,寫讀
a+,同a
例子
f = open(‘wenjian‘,‘r+‘,encoding="utf-8")print(f.readline())print(f.readline())print(f.readline())print(f.tell())f.write("-------後來加入的--------")#輸出致橡樹 我如果愛你—— 絕不像攀援的淩霄花,78
但是:
沒辦法在中間寫入,因為記憶體位址被佔用。
修改
#!/usr/bin/env python# -*- coding:utf-8 -*-#Author:liyananf = open("wenjian2",‘r‘,encoding=‘utf-8‘)f_new = open("wenjian2.new",‘w‘,encoding=‘utf-8‘)for line in f: if "路很寬" in line: line = line.replace("路很寬","地方大") f_new.write(line)f.close()f_new.close()#執行後新增加一個wenjia2.new檔案而且內容是
"U"表示在讀取時,可以將 \r \n \r\n自動轉換成 \n (與 r 或 r+ 模式同使用)
rU
r+U
"b"表示處理二進位檔案(如:FTP發送上傳ISO鏡像檔案,linux可忽略,windows處理二進位檔案時需標註)
rb
wb
ab
其他動作
for index ,line in enumerate(f.readlines()): if index == 3: print(‘------我是分割線-------‘) continue print(line.strip())#輸出致橡樹我如果愛你——絕不像攀援的淩霄花,------我是分割線-------我如果愛你——絕不學癡情的鳥兒為綠蔭重複單調的歌曲;也不止像泉源。。。
f = open(‘wenjian2‘,‘r‘,encoding="utf-8")print(f.tell())print(f.readline())print(f.tell())#輸出 ,讀取了23個字元。0我愛北京天安門23
with語句
為了避免開啟檔案後忘記關閉,可以通過管理上下文,即:
with open("wenjian","r",encoding="utf-8") as f: print(f.readline())
如此方式,當with代碼塊執行完畢時,內部會自動關閉並釋放檔案資源。
在Python 2.7 後,with又支援同時對多個檔案的上下文進行管理,即:
with open("wenjian","r",encoding="utf-8") as f, open("wenjian2","r",encoding="utf-8") as f2: print(f2.readline())
字元編碼轉換
Python 3最重要的新特性大概要算是對文本和位元據作了更為清晰的區分,不再會對bytes位元組串進行自動解碼。文本總是Unicode,由str類型表示,位元據則由bytes類型表示。在py3中encode,在轉碼的同時還會把string 變成bytes類型,decode在解碼的同時還會把bytes變回string。
例子
msg = "我"msg_gb2312=msg.encode("gb2312")#py3預設是unicodegb2312_to_unicode=msg_gb2312.decode("gb2312")gb2312_to_utf8=msg_gb2312.decode("gb2312").encode("utf-8")print(msg)print(msg_gb2312)print(gb2312_to_unicode)print(gb2312_to_utf8)#輸出我b‘\xce\xd2‘我b‘\xe6\x88\x91‘
函數
定義: 函數是指將一組語句的集合通過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名即可。
特徵:
1、減少重複代碼
2、使程式變的可擴充
3、使程式變得易維護
標準定義:
def hello():#函數名 print("你好")hello()#調用函數
帶參數:
def jia(x,y): jia = x+y return jia#返回函數執行結果c = jia(1,3)print(c)#輸出4
參數
形參:
變數只有在被調用時才分配記憶體單元,在調用結束時,即刻釋放所分配的記憶體單元。因此,形參只在函數內部有效。函數調用結束返回主調用函數後則不能再使用該形參變數
實參:
可以是常量、變數、運算式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使參數獲得確定值
預設參數
def list(name,age,salary="1000"): print("-----list-----") print("姓名",name) print("age",age) print("工資",salary)list("張三",1,100)list("李四",2,200)list("王五",3)#輸出-----list-----姓名 張三age 1工資 100-----list-----姓名 李四age 2工資 200-----list-----姓名 王五age 3工資 1000
在調用list這個函數中,王五的salary不輸入,預設使用salary="1000",這個預設值。指定了的話,就用你指定的值。
關鍵參數(特別注意)
正常情況下,給函數傳參數要按順序,不按順序就可以用關鍵參數,指定參數名即可,注意:關鍵參數必須放在位置參數之後。
list(age="4",salary="400",name="一一")
非固定參數
若你的函數在定義時不確定使用者想傳入多少個參數,就可以使用非固定參數
def test(x,*args): print(x) print(args)test(1,2,3,4)#輸出1(2, 3, 4)
*args 會把多傳入的參數變成一個元組形式
def test4(name,age=18,**kwargs): print(name) print(age) print(kwargs)test4(‘liyanan‘,age=‘24‘,sex=‘man‘,salary=‘6000‘)#輸出liyanan24{‘sex‘: ‘man‘, ‘salary‘: ‘6000‘}
*kwargs 會把多傳入的參數變成一個dict形式
全域變數和局部變數
school = "oldboy edu" #全域變數def school_name(school): print("改之前",school) school = "mage linux" #局部變數 print("改之後",school)school_name(school)print(school)#輸出改之前 oldboy edu改之後 mage linuxoldboy edu
在子程式中定義的變數稱為局部變數,在程式的一開始定義的變數稱為全域變數。
全域變數範圍是整個程式,局部變數範圍是定義該變數的子程式。
當全域變數與局部變數同名時:
在定義局部變數的子程式內,局部變數起作用;在其它地方全域變數起作用。
傳回值
要想擷取函數的執行結果,就可以用return語句把結果返回
注意:
1、函數在執行過程中只要遇到return語句,就會停止執行並返回結果,so 也可以理解為 return 語句代表著函數的結束
2、如果未在函數中指定return,那這個函數的傳回值為None
遞迴
在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞迴函式。
def jia(n): print(n) if int(n+n)<100: return jia(int(n+n)) print("--->",n)jia(1)#輸出1248163264---> 64
遞迴特性:
1、必須有一個明確的結束條件
2、每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少
3、遞迴效率不高,遞迴層次過多會導致棧溢出
高階函數
一個變數可以使用函數,那麼這個函數就可以接受另一個函數作為參數,這叫高階函數。
python基礎_day3