• Python内置函数--iter()&next()


    前言

    iter():此函数获取一个对象并返回与该参数对应的迭代器对象。
    next():此函数使用迭代器并返回输入中的下一个元素。如果我们再次调用它,它会记住之前返回的值并输出下一个值。

    看到了迭代器对象,那么就不得不看看魔术方法__iter__()了。只要内置有__iter__()方法的就可以称之为可迭代对象。可以转换为迭代器的对象,就称之为可迭代对象。

    list_ = [1,2,3,4]
    tuple_ = (1,2,3,4)
    dict_ = {"name1":"清安","name2":"拾贰"}
    list_.__iter__()
    tuple_.__iter__()
    dict_.__iter__()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    列举了三个数据结构,都带有__iter__()方法。所以:

    list_ = [1,2,3,4]
    list_res = list_.__iter__()
    print(list_res)
    """"""
    
    • 1
    • 2
    • 3
    • 4

    这个列表也就成功变成了一个迭代器。

    iter()与iter()有什么关系?

    def iter(source, sentinel=None): # known special case of iter
        """
        iter(iterable) -> iterator
        iter(callable, sentinel) -> iterator
        
        Get an iterator from an object.  In the first form, the argument must
        supply its own iterator, or be a sequence.
        In the second form, the callable is called until it returns the sentinel.
        """
        pass	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
        def __iter__(self, *args, **kwargs): # real signature unknown
            """ Implement iter(self). """
            pass
    
    • 1
    • 2
    • 3

    本质作用都是一样的。将可迭代对象转为迭代器对象。所以可以这样写:

    list_ = [1,2,3,4]
    tuple_ = (1,2,3,4)
    list_res = list_.__iter__()
    print(list_res)
    print(iter(tuple_))
    """
    
    
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    取值问题

    list_ = [1,2,3,4]
    print(next(list_))
    
    • 1
    • 2

    这样会告诉你:TypeError: ‘list’ object is not an iterator,类型错误,列表对象不是迭代器。所以要想使用next()取值就必须先iter()。

    list_ = [1,2,3,4]
    res_list = iter(list_)
    print(next(res_list))
    print(next(res_list))
    print(next(res_list))
    print(next(res_list))
    print(next(res_list))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    取一次值就next一次,下一次使用next会接着上一次的位置取值。当超出后会告诉你:StopIteration停止迭代。

    next()与next()有什么关系?

    def next(iterator, default=None): # real signature unknown; restored from __doc__
        """
        next(iterator[, default])
        
        Return the next item from the iterator. If default is given and the iterator
        is exhausted, it is returned instead of raising StopIteration.
        """
        pass
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    list_ = [1,2,3,4]
    res_list = iter(list_)
    print(next(res_list))
    print(res_list.__next__())
    
    • 1
    • 2
    • 3
    • 4

    本质作用都是一样的,迭代取值。

    while与for

    迭代器就是一个重复取值的工具。那么while,for似乎都是类似的作用。

    list_ = [1,2,3,4]
    res_list = iter(list_)
    while True:
        print(next(res_list))
    
    • 1
    • 2
    • 3
    • 4

    这样就简化了每次都要写next的情况。但是依旧会抛出异常StopIteration。

    list_ = [1,2,3,4]
    for value in iter(list_):
        print(value)
    
    • 1
    • 2
    • 3

    而for循环却不会。要想while不抛出异常我们可以用try来捕捉异常达到预期的效果。至于for循环:
    ![image.png](https://img-blog.csdnimg.cn/img_convert/58efc5740034be43ed5dbff5980e11ef.png#clientId=u25d924cf-3874-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=93&id=udffac118&margin=[object Object]&name=image.png&originHeight=116&originWidth=632&originalType=binary&ratio=1&rotation=0&showTitle=false&size=11571&status=done&style=none&taskId=uf691c7c6-ee1e-458c-9bf6-e53b308c25f&title=&width=505.6)
    看到了吗,for循环本质就是使用了iter,所以即使不使用iter()直接使用for value in list_也是可以的。为什么不抛出异常,应为for循环以及帮我们做了对应的操作了。

  • 相关阅读:
    Win32简单图形界面程序逆向
    SpringBoot实现AOP详解
    Rabbitmq 超时异常解决:PRECONDITION_FAILED - Timeout value used: 1800000 ms.
    @Autowired 到底是怎么把变量注入进来的?
    【Promise12数据集】Promise12数据集介绍和预处理
    stm32使用硬件SPI
    编程参考 - C语言里使用fgets函数读了个寂寞
    用向量数据库Milvus Cloud 搭建AI聊天机器人
    前端进击笔记第二十四节 如何进行技术方案调研与设计?
    linux驱动.之 网络udp应用层测试工具demon(一)
  • 原文地址:https://blog.csdn.net/weixin_52040868/article/details/128210437