可迭代对象: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
--------------------------------------------------------------------