当前位置:   article > 正文

python类中的__iter__, __next__与built-in的iter(),next()函数学习笔记_python class iter next

python class iter next

python中所有的迭代环境都会先尝试__iter__方法,再尝试__getitem__,只有在对象不支持迭代协议时,才会尝试索引

迭代器

  1. 迭代器:可以被next()函数调用并不断返回下一个值的对象称为迭代器
  2. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束迭代器只能往前不会后退
  3. 迭代器有两个基本的方法:iter()和next()
  4. 可以使用isinstance()判断一个对象是否是迭代器对象(iterator)
  5. python3中 range(n)生成的是迭代器对象;Python2中xrange(n)生成的才是迭代器对象

将类(class)改造成迭代器

迭代环境是通过调用内置函数iter去尝试寻找__iter__方法来实现的,而这种方法应该返回一个迭代器,如果没有找到__iter__方法,python会改用__getitem__机制

  1.  把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。
  2.  __iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。
  3.  __next__() 方法(Python 2 里是 next())会返回下一个迭代器对象。
  4. 例如 类test:
    1. class test():
    2. def __init__(self,data=1):
    3. self.data = data
    4. def __iter__(self):
    5. return self
    6. # 唯一需要注意的就是__next__中必须控制iterator的结束条件,不然就死循环了
    7. def __next__(self):
    8. if self.data > 7:
    9. raise StopIteration
    10. else:
    11. self.data+=1
    12. return self.data
    13. for item in test(2):
    14. print(item)

    out:

  1. 3
  2. 4
  3. 5
  4. 6
  5. 7
  6. 8

for ... in ...这个语句其实做了两件事:第一:获得一个可迭代器,即调用了 __iter__()函数,第二:循环过程,即循环调用__next__()函数

1. 可用于for循环的数据类型有一下几种:

        (1)集合数据类型:list, tuple, dict, set, str, bytes

        (2)generator(数据结构):生成器、带yield的generator function

2. 可迭代对象(iterable):可直接作为for循环的对象,统称为可迭代对象。python从可迭代对象中获取迭代器。但凡是可以返回一个迭代器的对象都可称之为可迭代对象
对于test这个类来说,它定义了__iter__和__next__函数,所以是一个可迭代的类,也可以说是一个可迭代的对象(Python中一切皆对象)。

特殊例子:

如果去掉__itet__()函数,就不能用于for  ... in .....循环中

  1. class test():
  2. def __init__(self,data=1):
  3. self.data = data
  4. #def __iter__(self):
  5. # return self
  6. # 唯一需要注意下的就是__next__中必须控制iterator的结束条件,不然就死循环了
  7. def __next__(self):
  8. if self.data > 7:
  9. raise StopIteration
  10. else:
  11. self.data+=1
  12. return self.data
  13. for item in test(2):
  14. print(item)

 运行报错:

TypeError: 'test' object is not iterable

但是可以通过下面的方式调用:

  1. class test():
  2. def __init__(self,data=1):
  3. self.data = data
  4. #def __iter__(self):
  5. # return self
  6. # 唯一需要注意下的就是__next__中必须控制iterator的结束条件,不然就死循环了
  7. def __next__(self):
  8. if self.data > 7:
  9. raise StopIteration
  10. else:
  11. self.data+=1
  12. return self.data
  13. #for item in test(2):
  14. # print(item)
  15. T = test(2)
  16. # 由于 print(T.__next__())每次只能输出一个值,给它加个遍历次数就可以了,不过相比带有 __iter__还是有点麻烦
  17. for i in range(6):
  18. print(T.__next__())

out:

  1. 3
  2. 4
  3. 5
  4. 6
  5. 7
  6. 8

 iter()函数与next()函数:iter是将一个对象(列表)变成迭代器对象,使用next函数式取迭代器中的下一个数据

  1. it = iter([1, 2, 3, 4, 5])
  2. # 循环:
  3. while True:
  4. try:
  5. # 获得下一个值:
  6. x = next(it)
  7. print(x)
  8. except StopIteration:
  9. # 遇到StopIteration就退出循环
  10. break

out:

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5

 

Reference:

python3_迭代器与生成器__ / __iter__() / __next__() / yield / next() / iter()

python 运算符重载迭代器对象__iter__,__next__

python类中的__iter__, __next__与built-in的iter()函数举例

python之__iter__函数与__next__函数

Python内置函数 next的具体使用方法

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

闽ICP备14008679号