一、迭代器
迭代器 適合遍歷一些巨大或無限的集合,如幾個G的文件!
迭代器的特點:
1、訪問者不用關心迭代器的內部結構,僅需要通過next()方法不斷地去取下一個內容! 2、不能隨機訪問集合中的,某個值,只能從頭到尾訪問! 3、訪問到一半時不能往回退! 4、便於循環比較大的數據集合,節省了內存!>>> name = iter(['jiac','piter','kuga']) ##創建一個迭代器 >>> name.__next__() 'jiac' >>> name.__next__() 'piter' >>> name.__next__() 'kuga' >>> name.__next__()##當遍歷完集合中的元素後! Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>>
二、生成器
一個函數被調用時返回一個迭代器,那這個函數就叫生成器(generator); 如果函數中包含yield語法,那這個函數就會變成生成器!生成器cash_miney def cash_money(arg): while arg > 0: arg -= 100 yield 100 print("來要錢了!") a = cash_money(500) print(type(a)) ## 返回迭代器 print(a.__next__()) #100 print(a.__next__()) #100 print(a.__next__()) #100 print(a.__next__()) #100 print(a.__next__()) #100 print(a.__next__())#執行時報錯如下:(迭代完成後) Traceback (most recent call last): File "F:/51python/day4/demo.py", line 16, in <module> print(a.__next__()) StopIteration
yield實現單線程的異步並發:(串行的程序中實現並行的效果!)
#消費者 def consumer(name): print("%s准備吃包子!"%name) while True: b = yield ##接收send()方法的值 print("包子[%s]來了!被[%s]吃了"%(b,name)) #生產者 def producer(name): c1 = consumer("A") c2 = consumer("B") c1.__next__() ##輸出yield的返回值 c2.__next__() ##輸出yield的返回值 print("老子開始准備做包子啦!") for i in range(10): time.sleep(1) print("已經做了2 個包子了!") c1.send(i) ##把i的值發送給yield c2.send(i) ##把i的值發送給yield producer("me") ###打印輸出如下:### A准備吃包子! B准備吃包子! 老子開始准備做包子啦! 已經做了2 個包子了! 包子[0]來了!被[A]吃了 包子[0]來了!被[B]吃了 已經做了2 個包子了! 包子[1]來了!被[A]吃了 包子[1]來了!被[B]吃了 已經做了2 個包子了! 包子[2]來了!被[A]吃了 包子[2]來了!被[B]吃了 已經做了2 個包子了! 包子[3]來了!被[A]吃了 包子[3]來了!被[B]吃了 已經做了2 個包子了! 包子[4]來了!被[A]吃了 包子[4]來了!被[B]吃了 已經做了2 個包子了! 包子[5]來了!被[A]吃了 包子[5]來了!被[B]吃了 已經做了2 個包子了! 包子[6]來了!被[A]吃了 包子[6]來了!被[B]吃了 已經做了2 個包子了! 包子[7]來了!被[A]吃了 包子[7]來了!被[B]吃了 已經做了2 個包子了! 包子[8]來了!被[A]吃了 包子[8]來了!被[B]吃了 已經做了2 個包子了! 包子[9]來了!被[A]吃了 包子[9]來了!被[B]吃了
三、裝飾器
def login(func): print("登陸驗證!") def login(func): print("登陸驗證!") return func ##返回內存地址! def tv(): print("tv模塊!") tv()#結果 tv #表示函數的內存地址! ##打印輸出### tv模塊!
def login(func): print("登陸驗證!") return func ##返回內存地址! @login def tv(name): print("this [%s] pages"%name) tv("alex") ##結果 ##打印輸出## 登陸驗證! this [alex] pages
def login(func): def inner(arg): print("登陸驗證!") func(arg) return inner ##返回內存地址! @login def tv(name): print("this [%s] is TV pages"%name) @login def move(name): print("this [%s] Move pages"%name) tv("alex") ##結果 move('keke') ##打印輸出## 登陸驗證! this [alex] is TV pages 登陸驗證! this [keke] Move pages
算法之二分查找:
def mid_search(data_source,find_n): mid = int(len(data_source)/2) if len(data_source) >= 1: if data_source[mid] > find_n: print("數據[%s]在右邊"%data_source[mid]) mid_search(data_source[:mid],find_n) # print(data_source[:mid]) elif data_source[mid] < find_n: print("數據[%s]在左邊"%data_source[mid]) mid_search(data_source[mid:],find_n) else: print("found find_s",data_source[mid]) else: print("cannot found find_s",data_source[mid]) if __name__ == "__main__": data = list(range(1,6000000)) mid_search(data,1) ##數據源,查找的值 ##打印輸出## 數據[3000000]在右邊 數據[1500000]在右邊 數據[750000]在右邊 數據[375000]在右邊 數據[187500]在右邊 數據[93750]在右邊 數據[46875]在右邊 數據[23438]在右邊 數據[11719]在右邊 數據[5860]在右邊 數據[2930]在右邊 數據[1465]在右邊 數據[733]在右邊 數據[367]在右邊 數據[184]在右邊 數據[92]在右邊 數據[46]在右邊 數據[23]在右邊 數據[12]在右邊 數據[6]在右邊 數據[3]在右邊 數據[2]在右邊 found find_s 1
四、遞歸操作
遞歸操作,自身調用自身的函數.
def calc(arg): print(arg) if arg/2 >1: res = calc(arg/2) ##遞歸調用calc()函數自己 return res ## calc(100) ##打印輸出## 100 50.0 25.0 12.5 6.25 3.125 1.5625
五、正則表達式
(匹配規程,數據源) re.match(pattern,data_source)import re m = re.match("abc","abcdfe") print(m.group()) ##返回匹配的值 ##打印輸出## abc m = re.match("[0-9][0-9]","41ab56cd") #匹配所有的數字 #match 方法從頭開始匹配 if m: print(m.group()) ##打印輸出## 41 m = re.findall("[0-9]{0,10}","41ab56cd") #匹配所有的數字使用findall方法(匹配0次到10次) if m: print(m) ##打印輸出## ['41', '', '', '56', '', '', ''] m = re.findall("[0-9]{1,10}","41ab56cd") #匹配所有的數字使用findall方法匹配1次到10次) if m: print(m) ##打印輸出## ['41', '56'] m = re.findall("[a-zA-Z]{1,10}","41ab56cd") #匹配所有的字母使用findall方法 if m: print(m) ##打印輸出## ['ab', 'cd'] m = re.findall(".*","41ab56cd") #匹配所有的字符0次或多次使用findall方法 if m: print(m) ##打印輸出## ['41ab56cd', ''] m = re.findall("[a-zA-Z]+","41ab@#56。.cd") #匹配所有的字母一個或多個使用findall方法 if m: print(m) ##打印輸出## ['ab', 'cd'] m = re.search("@","41ab@#56。.cd") #匹配指定字符一個或多個使用search方法 if m: print(m.group()) ##打印輸出## @ m = re.search("\d+","41ab@#56。.cd") #匹配所有的字符一個或多個使用findall方法 if m: print(m.group()) ##打印輸出## 41 m = re.sub("\d+","|","sad41ab@#56。.cd") #替換所有的數字一個或多個使用sub方法 if m: print(m) ##打印輸出## sad|ab@#|。.cd m = re.sub("\d+","|","sad41ab@#56。.cd",count=1) #替換第一個含有數字的字符串,替換一次或多次使用sub方法 if m: print(m) ##打印輸##
sad|ab@#56。.cd
#匹配小數出## a = "-8.0*173545.88095238098" print(re.findall("\d+\.\d+",a)) ##打印輸出## ['8.0', '173545.88095238098']