python 迭代器和生成器及例子

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

 

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

發佈了49 篇原創文章 · 獲贊 60 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章