一、迭代
1.重複
二、迭代器
python為了提供一種不依賴於索引的迭代方式,python會為一些物件內建__iter__方法,obj.__iter__稱為可迭代的物件,obj.__iter__得到的結果就是迭代器,得到的迭代器既有__iter__,也有乙個__next__方法
d=i=d.__iter__() #i叫迭代器
print(i.__next__())
三、迭代器的優缺點
1.優點:
1)提供了一種不依賴於索引的取值方式
2)惰性計算,節省記憶體
2.缺點
1)取值不如按照索引取值方便
2)一次性的,只能往後走不能往前推
3)無法預知長度
四、生成器
1.生成器函式:函式體內包含有yield關鍵字,該函式執行的結果是生成器函式
2.生成器就是迭代器
deffoo():print('first---------->')yield 1
print('second---------->')yield 2
print('third---------->')yield 3
print('fouth---------->')
g=foo()print(g.__next__())print(g.__next__())print(g.__next__())print(g.__next__())
yield的功能:
1.與return類似,都可以返回值,但不一樣的地方在於yield返回多次值,而return只能返回一次
2.為函式封裝好了__iter__和__next__方法,吧函式的執行結果做成了迭代器
3.遵循迭代器的取值方式obj.__next__(),觸發函式的執行,函式暫停與再繼續的狀態都是由yield儲存
defcountdown(n):print('starting countdown')while n >0:yieldn
n-=1
print('stop countdown')
g=countdown(5)for i ing:print(i)
send的效果:
1.先為暫停位置的yield傳乙個值,然後yield回吧值賦值給x
2.與next的功能一樣
yield的表示式形式應用
#應用:grep -rl 'root' /etc
g=func(*args,**kwargs)
@initdefsearch(target):'search file abspath'
whiletrue:
start_path=yieldg=os.walk(start_path)for par_dir, _, files ing:#print(par_dir,files)
for file infiles:
file_path= r'%s\%s' %(par_dir, file)
target.send(file_path)#階段二:收到檔案路徑,開啟檔案獲取獲取物件,把檔案物件發給階段三
@initdefopener(target):'get file obj: f=open(filepath)'
whiletrue:
file_path=yieldwith open(file_path,encoding='utf-8') as f:
target.send((file_path,f))#階段三:收到檔案物件,for迴圈讀取檔案的每一行內容,把每一行內容發給階段四
@initdefcat(target):'read file'
whiletrue:
filepath,f=yield
for line inf:
res=target.send((filepath,line))ifres:break
#階段四:收到一行內容,判斷root是否在這一行中,如果在,則把檔名發給階段五
@initdefgrep(target,pattern):'grep function'tag=falsewhiletrue:
filepath,line=yield tag #target.send((filepath,line))
tag=falseif pattern inline:
target.send(filepath)
tag=true#階段五:收到檔名,列印結果
@initdefprinter():'print function'
whiletrue:
filename=yield
print(filename)
start_path1=r'f:\python檔案\day22\a\b'start_path2=r'f:\python檔案\day22\a'g=search(opener(cat(grep(printer(),'root'))))#print(g)#g.send(start_path1)
g.send(start_path2)
python 迭代器 python迭代器
迭代器 可以直接作用for迴圈的資料型別 我們已經知道,可以直接作用for迴圈的資料型別有以下幾種 一類是集合資料型別 如 list tuple dict set str等 一類是generator,包括生成器和帶yield的generator function 可迭代物件定義 這些可以直接作用fo...
python的迭代器 Python 迭代器
迭代器 迭代是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。可迭代物件 以直接作用於 for 迴圈的資料型別有以下幾種 一類是集合資料型別,如 list tuple dict set str 等...
python的迭代器 python 迭代器
在介紹迭代器之前,先說明下迭代的概念 迭代 通過for迴圈遍歷物件的每乙個元素的過程。python的for語法功能非常強大,可以遍歷任何可迭代的物件。在python中,list tuple string dict set bytes都是可以迭代的資料型別。可以通過collections模組的iter...