zoukankan      html  css  js  c++  java
  • 迭代器原理 、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

  • 相关阅读:
    记一次渗透测试(5)
    记一次渗透实战(一)
    Spring IOC/DI
    Mysql 索引
    Mysql 存储过程
    Mysql 视图
    Mysql 用户和权限
    Mysql 事务
    Mysql 常用函数
    Mysql 子查询
  • 原文地址:https://www.cnblogs.com/zhongzhouyun/p/15313384.html
Copyright © 2011-2022 走看看