首页 > 代码库 > 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