• 迭代器原理 、for循环原理、自定义一个迭代器


    迭代的概念:

    • 重复执行一段代码的过程称为一次迭代,和循环中的遍历概念不一样

    可迭代对象:

    • 内置有__iter__`方法的叫做可迭代对象;

    迭代器:

    • 内部实现了__iter____next__方法的类叫做迭代器,其中iter方法必须返回迭代器本身,next方法则必须返 回下一个 值,如果没有就抛出StopIteration异常。也可以说是 迭代取值的工具

    为什么要有迭代器?

    没有迭代器之前,我们虽然可以通过whiel循环迭代有序类型,

    _list = [1, 2, 3, 4]
    
    # for循环的方式,没有迭代器之前并不能直接使用 for i in _list
    for i in range(len(_list)):
        print(_list[i])
    
    # while方式
    _index = 0
    while _index < len(_list):
        print(_list[_index])
        _index += 1
        
    """对于列表勉强能够实现,但是对于其他无序的类型来说,比如字典,字典的每个key是没有规律的,这个时候就不能迭代了"""
    
    

    有了迭代器之后,我们就可以迭代不同类型的对象,为迭代增加了一种统一的迭代取值方式,不过也有缺点,我如果想取第6个数,如果用迭代器的方式,得调用6次next才能得到,用索引就可以一次定位;

    for循环的原理与迭代器的关系(实现了iter方法就可以被for进行循环)

    image-20210919235614877

    其中第一条,无论是可迭代对象还是迭代器本身,调用iter方法,都会转换成迭代器对象。迭代器调用iter方法返回的还是自己,没有变化。所以在这一点上,for循环能够兼容两者;如下

    image-20210919235150396

    自定义迭代器

    """
    传入一个有序的对象,先经过iter生成迭代器,再调用next方法获取下一个数
    
    """
    
    
    class Mail:
    
        def __init__(self, _list):
            self._list = _list
            self.index = 0
    
        def __iter__(self):
            return self
    
        def __next__(self):
            if self.index < len(self._list):
                _value = self._list[self.index]
                self.index += 1
                return _value
    
            raise StopIteration
    
    
    from typing import Iterable,Iterator
    
    m = Mail([1, 2, 3, 4])
    print(isinstance(m, Iterator))
    

    知识点:文件也是一个迭代器;所以可以通过for循环进行取值
    如果文件数据过多时,如何读取不会保证内存崩溃?(面试题)
    就可以通过迭代器的方式,用for循环,每次迭代取一行,这是其中一个解决办法

    with open() as f: pass

    本文来自博客园,作者:中州韵,转载请注明原文链接:https://www.cnblogs.com/zhongzhouyun/p/15313384.html

  • 相关阅读:
    题目1441:人见人爱 A ^ B(二分求幂)
    题目1003:A+B(按逗号分隔的A+B)
    题目1002:Grading(题目背景基于高考打分的简单判断)
    题目1104:整除问题(还是求素数)
    题目1040:Prime Number(第k个素数)
    题目1440:Goldbach's Conjecture(哥达巴赫猜想)
    题目1438:最小公倍数(利用最大公倍数求解)
    题目1439:Least Common Multiple(求m个正数的最小公倍数lcm)
    题目1080:进制转换(任意进制直接转换方法)
    题目1083:特殊乘法(求模运算符的使用)
  • 原文地址:https://www.cnblogs.com/zhongzhouyun/p/15313384.html
Copyright © 2020-2023  润新知