python 迭代器和生成器及例子

来源:互联网 发布:做网站必备软件 编辑:程序博客网 时间:2024/04/25 09:12

十一、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

 

--------------------------------------------------------------------