可迭代对象(iterable)、迭代器(iterator)、生成器(generator)是python中非常重要、也是非常有用的特性。
凡是可返回一个迭代器的对象都可称之为可迭代对象,包括:常见的多容器,打开状态的files,sockets等等。
迭代器
迭代器是一个可以记住遍历位置的对象,从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往前不会后退。
两个基本的访问迭代器的方法:iter()和next();
实现了__iter__和__next__()方法的对象都是迭代器
__iter__:返回迭代器自身;
__next__:返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常;
一个斐波那契迭代器示例:
class IterFib:
def __init__(self):
self.prev = 0
self.curr = 1
def __iter__(self):
return self
def __next__(self):
value = self.curr
self.curr += self.prev
self.prev = value
return value
fb=IterFib()
print(list(islice(fb, 10)))
生成器
生成器是一种特殊的迭代器,为一个使用yield返回值的函数。
一个斐波那契生成器示例:
def GenFib():
prev, curr = 0, 1
while True:
yield curr
prev, curr = curr, curr + prev
gf=GenFib()
print(list(islice(gf, 0, 10)))
生成器表达式与列表解析
生成器表达式与列表解析(推导)非常像,除使用括号与返回类型外其他都相似(在处理大量数据时生成器表达式在内存使用使用上占明显优势,会小很多):
(fun(x) for x in lst):生成器表达式;使用括号(作为参数时可省略括号),返回迭代器;
[fun(x) for x in lst]:列表解析;使用方括号,返回list;
列表解析基本语法:
[expression for it-value in itertable]
[expression for it-value initertableif cond-expr]
获取10以内偶数的平方
[a**2 for a in range(10) if a%2==0] #[0, 4, 16, 36, 64]
itertools模块
itertools模块可方便高效地辅助处理迭代器,对常用功能简要说下:
chain(*iterables):连接列表,返回iterable对象;
compress(data, selectors):返回数据对象data中对应规则selector中对应位置为true的元素;
count(start=0,step=1):返回start开始步长为step的无限迭代器;
cycle(iterable):无限重复地返回迭代对象对象中的元素副本(每次返回迭代器中的一个元素);
dropwhile(predicate, iterable):从列表开始处丢弃predicate为True的元素,直到一个为False,返回从此元素开始的所有元素(不论后续元素是否满足predicate,若第一个元素就判断为False则返回整个迭代序列)
filterfalse(predicate, iterable) :返回predicate为False的元素组成的序列;
islice(iterable, stop)/islice(iterable, start, stop[,step]) :返回start开始(默认0),至stop步长为step(默认为1)的序列;
repeat(object[, times]):默认无限次,按指定次数重复返回迭代对象(每次返回一个迭代对象);
takewhile(predicate, iterable):返回predicate为Trure的元素,直到有False的为止。
lst=[1,4,8]
nCount=0
for it in itertools.cycle(lst):
print(it) # 输出1,4,8,1,4,8
nCount+=1
if(nCount>5): break
for it in itertools.repeat(lst, 2):
print(it) #输出[1,4,8]两次
lst = itertools.chain(lst, it)
print(list(lst)) #[1,4,8,1,4,8,1,4,8]
dp=itertools.dropwhile(lambda x:x
print(list(dp)) #[5, 8, 2]
tk=itertools.takewhile(lambda x:x
print(list(tk)) #[1,3]
领取专属 10元无门槛券
私享最新 技术干货