python迭代器與生成器

2022-07-16 06:54:09 字數 3208 閱讀 7836

一、迭代

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.生成器就是迭代器

def

foo():

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儲存

def

countdown(n):

print('

starting countdown')

while n >0:

yield

n n-=1

print('

stop countdown')

g=countdown(5)

for i in

g:

print(i)

send的效果:

1.先為暫停位置的yield傳乙個值,然後yield回吧值賦值給x

2.與next的功能一樣

yield的表示式形式應用

#

應用:grep -rl 'root' /etc

import

osdef

init(func):

g=func(*args,**kwargs)

next(g)

return

g

return

#階段一:遞迴地找檔案的絕對路徑,把路徑發給階段二

@init

defsearch(target):

'search file abspath

'while

true:

start_path=yield

g =os.walk(start_path)

for par_dir, _, files in

g:

#print(par_dir,files)

for file in

files:

file_path = r'

%s\%s

' %(par_dir, file)

target.send(file_path)

#階段二:收到檔案路徑,開啟檔案獲取獲取物件,把檔案物件發給階段三

@init

defopener(target):

'get file obj: f=open(filepath)

'while

true:

file_path=yield

with open(file_path,encoding='

utf-8

') as f:

target.send((file_path,f))

#階段三:收到檔案物件,for迴圈讀取檔案的每一行內容,把每一行內容發給階段四

@init

defcat(target):

'read file

'while

true:

filepath,f=yield

for line in

f: res=target.send((filepath,line))

ifres:

break

#階段四:收到一行內容,判斷root是否在這一行中,如果在,則把檔名發給階段五

@init

defgrep(target,pattern):

'grep function

'tag=false

while

true:

filepath,line=yield tag #

target.send((filepath,line))

tag=false

if pattern in

line:

target.send(filepath)

tag=true

#階段五:收到檔名,列印結果

@init

defprinter():

'print function

'while

true:

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生成器與迭代器

生成器只有在用的時候會出現在記憶體中,對比列表全部存在記憶體中,減少了記憶體占用 next 函式 依次取生成器的值 s x 2 for x in range 1000 中括號是列表解析,小括號表示生成一系列值,就是生成器 s at 0x7fa20aa8b048 print next s 用next ...

python 迭代器與生成器

迭代器和生成器 print 1 in 1,2,3 print 1 not in 1,2,3 print 4 in print 4 not in 1,2,3 print x not in dlkjfxfei 可迭代物件 iterable 可以被next 函式呼叫並不斷返回下乙個值 知道沒有資料時丟擲s...

Python 迭代器與生成器

一 迭代器 理解迭代器需要搞清楚容器 container 迭代器協議 可迭代物件 iterable 迭代器 iterator 生成器 generator 1 容器 container 容器是一種把多個元素組織在一起的資料結構,容器中的元素可以逐個地迭代獲取,可以用in,not in關鍵字判斷元素是否...