• 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 
    
  • 相关阅读:
    [转]Maven 初学+http://mvnrepository.com/
    比较IDEA与Eclipse
    [web] 使用Promise封装fetch实现网络超时,终止请求的功能
    [web] 理解和使用Promise.all和Promise.race
    [Web] How to Test React and MobX with Jest
    [Web 测试] Jest单元测试的几个指标
    [Web] 取消Promise
    [安全分析] 安全分析中的威胁情报(一)
    [Web] 深入理解现代浏览器
    [Web] HTML5新特性history pushState/replaceState解决浏览器刷新缓存
  • 原文地址:https://www.cnblogs.com/chenlin163/p/7305401.html
Copyright © 2020-2023  润新知