十一、python 迭代器和生成器及例子
迭代器
可迭代對象:iterable
如果一個對象可以用for...in...的方式遍歷其內容,這個對象就是一個可迭代的對象。
迭代器:itertor
遍歷可迭代對象內容的方式
可迭代對象需要提供迭代器:
實現__iter__、 __next__
itertools(python提供的一個包):
permutations:排列
combinations:組合
product:笛卡爾積
repeat:重複
chain:鏈接一組迭代器
------------------------------------------------------------
import itertools
x = range(1,6)
periter = itertools.permutations(x,4) #生成的periter迭代器中的對象只能用一次
for i in periter :
print 'permutation:',i
comiter = itertools.combinations(x,3)
for i in comiter:
print 'combination:',i
m = ['a','b','c']
n = [1,2,3]
proiter = itertools.product(m,n)
for i in proiter:
print 'product:',i
print '===================================='
#periter = itertools.permutations(x,4) #生成的periter迭代器中的對象只能用一次
#comiter = itertools.combinations(x,3) #生成的comiter迭代器中的對象只能用一次
#proiter = itertools.product(m,n) #生成的proiter迭代器中的對象只能用一次
chaiter = itertools.chain(periter, comiter, periter)
for i in chaiter:
print 'chain:',i
--------------------------------------------------------------------
生成器
生成器能夠生成迭代器的東西
生成器表達式(expr for iter in iterable [if conditiion])
生成器函數
Yied
-----------------------------------自增生成器:--------------------------
#數據庫中經常有主鍵自增,模擬一個自增生成器
def inc(n=1):
while True:
yield n #返回值,但不想return那樣將函數聲明週期結束
n += 1
a = inc()
print type(a), a
#取下一個值
print a.next(), a.next(), a.next() #生成器對象都默認有next()方法
#一次取多個值 這樣將會無限生成
#for i in a:
# print i
#一次取10個值
for count, i in enumerate(a):
if count >= 10:
break
else:
print i
#一次取10個值
for cnt, i in enumerate(a):
if cnt >= 10:
break
else:
print i
--------------------------------------------------------------------
----------------------------文件生成器:--------------------------------
#如下方式,效率高,節省內存(功能相當於grep)。不會一次性讀取
import os
def getFilesList(rootDir):
for dirpath, dirnames, filenames in os.walk(rootDir):
for filename in filenames :
if filename.startswith("ods_"):
yield os.path.join(dirpath,filename) #返回目錄加文件名
def openFiles(filesList):
for filename in fileList:
yield (filename, open(filename))
def grep(fileList, pattern):
for (filename,fh) in fileList:
for line in fh:
if pattern in line:
yield (filename,line)
fileList = getFilesList(u'F:\微博運動\實訓二-運動微博-原始表數據\hive運動微博項目')
files = openFiles(fileList)
lines = grep(files, '31001000')
for (filename,line) in lines:
print '~' * 60
print filename,'-----------',line
--------------------------------------------------------------------