当前位置:   article > 正文

【基础知识】python生成器、迭代器,iter()、next()详解_dataiter.next()

dataiter.next()

1、容器

容器是用来储存元素的一种数据结构,容器将所有数据保存在内存中,Python中典型的容器有:list,set,dict,str等等。

class test():
    def __init__(self,data=1):
        self.data = data

    def __iter__(self):
        return self
    def __next__(self):
        if self.data > 5:
            raise StopIteration
        else:
            self.data+=1
            return self.data

for item in test(3):
    print(item)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

输出为:

4
5
6
  • 1
  • 2
  • 3

for … in… 这个语句其实做了两件事。

  • 第一件事是获得一个可迭代器,即调用了__iter__()函数。
  • 第二件事是循环的过程,循环调用__next__()函数。

对于test这个类来说,它定义了__iter__和__next__函数,所以是一个可迭代的类,也可以说是一个可迭代的对象(Python中一切皆对象)。

2、迭代器

含有__next__()函数的对象都是一个迭代器,所以test也可以说是一个迭代器。如果去掉__itet__()函数,test这个类也不会报错。如下代码所示:

class test():
    def __init__(self,data=1):
        self.data = data

    def __next__(self):
        if self.data > 5:
            raise StopIteration
        else:
            self.data+=1
            return self.data

t = test(3)   
for i in range(3):
    print(t.__next__())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

输出为:

4
5
6
  • 1
  • 2
  • 3

3、生成器

生成器是一种特殊的迭代器。当调用fib()函数时,生成器实例化并返回,这时并不会执行任何代码,生成器处于空闲状态,注意这里prev, curr = 0, 1并未执行。然后这个生成器被包含在list()中,list会根据传进来的参数生成一个列表,所以它对fib()对象(一切皆对象,函数也是对象)调用__next()__方法,

def fib(end = 1000):
    prev,curr=0,1
    while curr < end:
        yield curr
        prev,curr=curr,curr+prev


print(list(fib()))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

输出为:

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]
  • 1

4、next()、iter()

什么是可迭代的对象?(Iterable,即可以用for循环的对象)和迭代器(Iterator)
Iterable:

  • 一类是:list、tuple、dict、set、str
  • 二类是:generator(都是Iterator对象),包含生成器和带yield的generator function 生成器不但可以作用于for,还可以被next函数不断调用并且返回下一个值,可以被next函数不断调用返回下一个值的对象称为迭代器(Iterator)。

可迭代的对象如list、dict等需要用iter()函数转化成Iterator。

描述:

  • next() 返回迭代器的下一个项目。

  • next() 函数要和生成迭代器的iter() 函数一起使用。

语法:

next 语法:

next(iterable[, default])
  • 1

参数说明:

  • iterable – 可迭代对象
  • default – 可选,用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发 StopIteration 异常。

备注:

list、tuple等都是可迭代对象,我们可以通过iter()函数获取这些可迭代对象的迭代器。然后,我们可以对获取到的迭代器不断使⽤next()函数来获取下⼀条数据

iter()函数实际上就是调⽤了可迭代对象的 iter ⽅法。

代码范例01:

# 首先获得Iteration对象
it = iter([1,2,3,4,5])
# 循环
while True:
    try:
        # 获得下一个值
        x = next(it)
        print(x)
    except StopIteration:
        # 遇到StopIteration就退出循环
        break

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

代码范例02:

li = [11, 22, 33, 44, 55]
li_iter = iter(li)
next(li_iter) 
>>>
11
next(li_iter) 
>>>
22
next(li_iter) 
>>>
33
next(li_iter) 
>>>
44
next(li_iter) 
>>>
55
next(li_iter) 
>>>
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-15-9584f6653730> in <module>
----> 1 next(li_iter)

StopIteration: 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

注意,当我们已经迭代完最后⼀个数据之后,再次调⽤next()函数会抛出 StopIteration的异常 ,来告诉我们所有数据都已迭代完成,不⽤再执⾏ next()函数了。

参考链接:https://blog.csdn.net/weixin_42782150/article/details/109315355

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/145479
推荐阅读
相关标签
  

闽ICP备14008679号