一、迭代
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:
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
(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關鍵字判斷元素是否...