迭代是数据处理的基石
所有生成器都是迭代器,因为生成器完全实现了迭代器接口。
大多数时候都把迭代器
和生成器
视作同一概念
*
拆包实参解释器需要迭代对象x时,会自动调用
iter(x)
iter函数作用
任何Python序列都可迭代的原因是,它们都实现了__getitem__
方法。
调用iter(x)
函数,如果不可迭代,再处理TypeError异常
Python从可迭代的对象中获取迭代器 迭代器可以迭代,但是可迭代对象不是迭代器
s = 'ABC'
for char in s:
print(char)
it = iter(s)
while True:
try:
print(next(it))
except StopIteration:
del it
break
__next__
:返回下一个可用的元素,如果没有元素了抛出StopIteration异常
__iter__
:返回self,以便在应该使用可迭代对象的地方使用迭代器
该异常表明迭代器到头了。
Python语言会处理for循环和其他迭代器(列表推导、元组拆包等)上下文中的StopIteration
使用iter内置函数可以获取迭代器的对象。如果对象实现了能返回迭代器的__iter__
方法,那么对象就是可迭代的。
序列都可以迭代;实现了__getitem__
方法,而且其参数是从0开始的索引,这种对象也可以迭代
实现了无参数的__next__
方法,返回序列中的下一个元素。
如果没有元素了,那么抛出StopIteration异常。
Python中的迭代器还实现了__iter__
方法,因此迭代器也可以迭代
⚠️可迭代的对象一定不能是自身的迭代器。也就是 可迭代对象必须实现__iter__
方法,但不能实现__next__
方法
生成器函数是生成器工厂
函数的定义中有yield关键字,该函数就是生成器函数。
调用生成器函数时,会返回一个生成器对象。
re.finditer
是re.findall
的惰性版本,返回的是一个生成器。可以逐个获取匹配项。
itertools.islice(it,stop)
或 itertools.islice(it,start,stop,step=1)
惰性切片
itertools.compress(it, selector_it)
itertools.dropwhile(predicate, it)
filter(predicate, it)
itertools.filterfalse(predicate, it)
itertools.islice(it, stop)
itertools.islice(it, start, stop, step=1)
itertools.takewhile(predicate, it)
itertools.accumulate(it, [func])
enumerate(iterable, start=0)
map(func, it1, [it2, …, itN])
itertools.starmap(func, it)
itertools.chain(it1, …, itN)
itertools.chain.from_iterable(it1)
itertools.product(it1, …, itN, repeat=1)
zip(it1, …, itN)
itertools.zip_longest(it1, …, itN, fillvalue=None)
itertools.combinations(it1, out_len)
itertools.combinations_with_replacement(it1, out_len)
itertools.count(start=0, step=1)
itertools.cycle(it)
itertools.permutations(it, out_len=None)
itertools.repeat(item, [times])
itertools.groupby(it, key=None)
reversed(seq)
tee(it, n=2)
把不同的生成器结合在一起使用
def chain1(*iterables):
for it in iterables:
for i in it:
yield i
def chain2(*iterables):
for i in iterables:
yield from i
if __name__ == '__main__':
s = 'ABC'
t = tuple(range(3))
print(list(chain1(s, t)))
print(list(chain2(s, t)))
传入两个参数
with open('a.txt') as f:
for line in iter(f.readline, '\n'):
print(line)
逐行读取文件,直到遇到空行或者到达文件末尾为止