当前位置:   article > 正文

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

python next(iter

前言

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)
"""<list_iterator object at 0x0000029DF0C9FEE0>"""
  • 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_))
"""
<list_iterator object at 0x000001FE485CFEE0>
<tuple_iterator object at 0x000001FE485CFEB0>
"""
  • 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循环以及帮我们做了对应的操作了。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号