首页 > 代码库 > python高级编程之生成器表达式和itertools模块

python高级编程之生成器表达式和itertools模块

# -*- coding: utf-8 -*-

# python:2.x

__author__ = ‘Administrator‘

#生成器表达式和itertools模块

#yield 中可以使用圆括号代替中括号

iter0=(x**2 for x  in range(10)if x%2==0)

for iter1 in iter0:

    print iter1

#结果

"""

0

4

16

36

64

"""

#这样的表达式被称为生成器或者genexp,它们使用类似列表推导方式减少了序列代码总量,当在yield表达式上创建简单的循环时,就使用它

 

import itertools

#特点是:高效,最有趣:islice,tee,groupby这3个方法

print ‘-‘*30

#islice窗口迭代器

"""

itertools.islice(iterable, stop)

itertools.islice(iterable, start, stop[, step])

"""

# def islice1():

#     value=http://www.mamicode.com/raw_input().strip()

#     while value!=‘‘:

#         for el in itertools.islice(value.split(),4,None):#表示从第5行开始每行元素,只要这行超过4个元素

#             yield el

#         value=http://www.mamicode.com/raw_input().strip()

# iter11=islice1()

# print iter11.next()

#使用场景:当需要抽取位于流中特定位置数据时,就可以使用islice,比如可能是使用记录特定格式文件,或者表现元数据封闭数据流时

#tee往返式迭代器

"""

tee提供了在一个序列之上运行多个迭代器模式,如果提供第一次运行信息,就能够帮助我们再次基于这些数据运行

"""

def tee1(iters,headsize=1):

    a,b=itertools.tee(iters)

    return list(itertools.islice(a,headsize)),b

print tee1(‘abcdef‘)#([‘a‘], <itertools.tee object at 0x0000000002347C08>)

print tee1(‘abcd‘,4)#([‘a‘, ‘b‘, ‘c‘, ‘d‘], <itertools.tee object at 0x0000000002427B88>)

 

#print tee1(‘abc‘,-2)ValueError: Indices for islice() must be None or an integer: 0 <= x <= maxint.

#当tee生成两个迭代器,那么第一个迭代器由islice获取这个迭代第一个headsize元素,并做为普通列表返回,第二个迭代器返回的元素是一个新的迭代器,可以工作在整个序列之上

#groupby:uniq迭代器

#它可以对来自一个迭代器重复元素进行分组,只要它们是相邻的,还可以提供另一个函数来执行元素比较,否则将采用标识符比较

def groupbu1(data):

    return((len(list(data)),name)\

        for name,g in itertools.groupby(data))

def groupbu2(data):

    return(car*size for size,car in data)

print list(groupbu1(‘get uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu‘))

#[(39, ‘g‘), (39, ‘e‘), (39, ‘t‘), (39, ‘ ‘), (39, ‘u‘)]

c=groupbu1(‘get uuuuuuuuuuuuuuuuuuuuuuuuuuup‘)

print ‘ ‘.join(groupbu2(c))#gggggggggggggggggggggggggggggggg eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee tttttttttttttttttttttttttttttttt                uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu pppppppppppppppppppppppppppppppp

 

#其他说明:压缩算法

"""

REL进行对数据压缩,字符串中每组相邻的重复字符串将替换成该字符串本身和重复次数,如果字符串没有重复,则使用1

如果对压缩算法有算法,可以考虑LZ77算法,它是RLE增强版本,将想找相邻相同模式,而不是相同字符,

网址为:http://en.wikipedia.org/wiki/LZ77

"""

"""

当需要在数据上完成一个摘要的时候,可以使用groupty,这个时候,内建的sorted函数特别有用,可以传入的数据中相信的元素相邻

"""

#itertools其他说明及文档

#文档 :https://docs.python.org/2/library/itertools.html?highlight=itertools#itertools