一、迭代器
迭代器 適合遍歷一些巨大或無限的集合,如幾個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']