zoukankan      html  css  js  c++  java
  • pytion3--用户定义的迭代器

    1、迭代器基于下面两个个方法:

    (1)__next__ 返回容器的下一个项目
    (2)__iter__ 返回迭代器本身

    2、当序列遍历完时,将抛出StopIteration异常,所以通过捕获这个异常来停止循环

    下面是自定义迭代器的示例代码:

    class MyIterator(object):
        def __init__(self, step):
            self.step = step
    
        def __next__(self):
            if self.step == 0:
                raise StopIteration
            self.step -= 1
            return self.step
    
        def __iter__(self):
            return self
    
    for i in MyIterator(6):
        print(i)
    

    运行结果:

    5
    4
    3
    2
    1
    0
    

    用户定义的迭代器

    如今,Python中所有的迭代坏境都会先尝试__iter_二方法,再尝试__getite。_。也就是说,它们宁愿使角第13章所学到的迭代协议,然后才是重复对对象进行索弓l运算。如果对象不支持迭代协议,就会尝试索引运算。从技术角度来讲,迭代环境是通过调用内置函数iter去尝试寻找iter方法来实现的,而这种方法应该返回一个迭代器对象。如果已经提供了,Python就会重复调用这个迭代器对象的next方法,直到发生stop工teration异常。如果没找到这类__iter__方法,Python会改用__getitem__机制,就像之前那样通过偏移量重复索引,直到引发
    IndexError异常。

    下面的文件iters.py定义了用户定义的迭代器类来生成平方值。

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    class Squares:
        def __init__(self, start, stop):
            self.value = start - 1
            self.stop = stop
        def __iter__(self):
            return self
        def __next__(self):
            if self.value == self.stop:
                raise StopIteration
            self.value += 1
            return self.value **2
    
    for i in Squares(1, 5):
        print(i)
    

    运行结果:

      

    1
    4
    9
    16
    25
    
    # 用生成器函数编写
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    # 用生成器函数编写
    
    def gsquares(start, stop):
        for i in range(start, stop+1):
            yield i ** 2
    
    for i in gsquares(1, 5):
        print(i, end=" ")
    

    运行结果:

    1 4 9 16 25 
    
  • 相关阅读:
    2019天梯赛训练1
    Python课程设计 搭建博客
    最容易理解的贪吃蛇小游戏
    数据结构-队列
    数据结构-堆栈(2)
    数据结构-堆栈(1)
    数据结构-线性表(3)
    数据结构-线性表(1)
    linux知识积累
    Maven学习笔记
  • 原文地址:https://www.cnblogs.com/chenlin163/p/7305401.html
Copyright © 2011-2022 走看看