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 模块中常用的一些函数

主要分三类:

  1. 无限迭代器:(会无限循环地迭代下去,使用时必须要有停止条件,避免死循环)

    迭代器函数含义
    count(start[,step])从start开始,step为步长循环迭代
    cycle(seq)循环迭代序列seq的元素
    repeat(elem[,n])循环迭代elem,n为循环次数
    • count(start[,step])

    在这里插入图片描述

    • cycle(seq)

    在这里插入图片描述

    • repeat(elem[,n])

    在这里插入图片描述

  2. 迭代短序列:

    迭代器函数含义
    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

    在这里插入图片描述

  3. 组合迭代序列

    迭代器函数含义
    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)

      在这里插入图片描述

posted @ 2020-07-25 21:36  aJream  阅读(17)  评论(0编辑  收藏  举报