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

浙公网安备 33010602011771号