python打亂迭代器 python迭代器與生成器

2021-10-18 15:25:16 字數 2436 閱讀 8016

一、迭代

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...