10-python迭代器
一、迭代器
概述
从表面理解,迭代器是包含了多个数据的数据流或容器,每次从中取出一个数据,直到取完,且不会重复提取数据。
从代码角度看,他就是一个类,主要有两个协议或方法:
-
__iter__()
:返回对象本身,是for
语句使用迭代器的要求 -
__next__()
:返回容器中的下一个数据,当容器中数据用完时,引发StopIteration
异常。
任何一个类,只要它实现或拥有这两个方法,就可以称为 迭代器(或者说可迭代的)。
使用迭代器,可以用 for
来遍历:
for i in iterator:
pass
看起来这跟遍历列表或其他序列一样。
自定义迭代器
从上面的描述可知,要定义一个迭代器,只需定义一个含有 __iter__()
、 __next__()
方法的类即可。例如:
class MyIterator:
def __init__(self, x=2, xmax=100):
self.__mul, self.__x = x, x
self.__xmax = xmax
def __iter__(self): #定义迭代器协议方法,返回类本身
return self
def __next__(self): #定义迭代器协议方法
if self.__x and self.__x != 1:
self.__mul *= self.__x
if self.__mul <= self.__xmax:
return self.__mul
else:
raise StopIteration #引发StopIteration错误
else:
raise StopIteration
if __name__ == '__main__':
myiter = MyIterator() #实例化迭代器
for i in myiter:
print('迭代器元素输出',i)
输出:
内置迭代器工具
python内置有一个产生迭代器的函数:iter()
,还有其他迭代器工具存在于标准库 itertools
标准库里。
关于函数 iter()
有两种使用方式:
iter(iterable)
,参数要求是可迭代的,也可以是各种序列iter(callable, sentinel)
,第一个参数要求是可调用的(一般是函数),第二个函数被称作“哨兵”,当第一个参数的返回值等于第二个参数时,迭代或遍历停止
class Couter:
def __init__(self,x=0):
self.x = x
couter = Couter()
def use_iter(): #定义一个函数用于iter()的第一个参数
couter.x += 2
return couter.x
for i in iter(use_iter,16): # 16 为迭代停止条件
print('本次遍历的值',i)
输出:
itertools
模块中常用的一些函数
主要分三类:
-
无限迭代器:(会无限循环地迭代下去,使用时必须要有停止条件,避免死循环)
迭代器函数 含义 count(start[,step])
从start开始,step为步长循环迭代 cycle(seq)
循环迭代序列seq的元素 repeat(elem[,n])
循环迭代elem,n为循环次数 count(start[,step])
cycle(seq)
repeat(elem[,n])
-
迭代短序列:
迭代器函数 含义 chain(p,q,...)
将p和q连接起来再迭代 compress(data,selectors)
依据 selectors
的真假性选择data
的元素dropwhile(pred,seq)
当pred对序列元素处理为假时开始迭代seq后面所有元素 filterfalse(pred,seq)
pred处理为假的元素,与filter()相反 takewhile(pred,seq)
与dropwhile()相反 tee(it,n)
将序列 it 重复 n次迭代 zip_longest(p,q,...)
与zip()一样 chain()
compress()
dropwhile(pred,seq)
filterfalse(pred,seq)
takewhile(pred,seq)
tee(it,n)
zip_longest(p,q,...)
zip
-
组合迭代序列
迭代器函数 含义 product(p,q,...[,n])
迭代排列出所有的排列 permutations(p,r)
迭代序列中r个元素的排列,相当于数学公式 A n m A_n^m Anm combinations(p,r)
迭代序列中r个元素的组合,相当于数学公式 C n m C_n^m Cnm -
product(p,q,...[,n])
-
permutations(p,r)
-
combinations(p,r)
-
本文来自博客园,作者:aJream,转载请记得标明出处:https://www.cnblogs.com/ajream/p/15383593.html