迭代器使用For循环

第一步:For会调用iter( )方法,返回迭代器自身 第二步:For会不断调用next( )函数,next( )函数会调用next( )方法,并每次返回迭代器中的下一个值。 第三步:迭代器到最后没有元素了,会抛出”StopIteration”异常后退出For循环

  1. class It_name:
  2. def __init__(self, x):
  3. print("__init__():",x)
  4. self.x = x
  5. def __next__(self):
  6. print("__next__():",end="")
  7. self.x = self.x + 1
  8. if self.x >= 7:
  9. print("StopIteration")
  10. raise StopIteration
  11. else:
  12. return self.x
  13. def __iter__(self):
  14. print("__iter__()")
  15. return self
  16. IT = It_name(2) #创建迭代器对象
  17. print("Work in for-Loop:")
  18. for i in IT:
  19. print(i)
  20. #=====================================
  21. #ouput
  22. __init__():2
  23. Work in for-Loop:
  24. __iter__()
  25. __next__():3
  26. __next__():4
  27. __next__():5
  28. __next__():6
  29. __next__():StopIteration

可迭代对象使用For循环

第一步:判断是否为可迭代对象(即判断是否有itergetitem方法) 没有的话直接报错(抛出TypeError错误) 第二步:如果有iter方法,调用iter方法并转换成迭代器(iterator) 如果有getitem方法,不存在iter的时候,返回一个下标迭代的iterator对象来代替 (或者用旧的迭代协议,即采用下标迭代, (迭代完成后抛出的IndexError异常,而非”StopIteration”异常 第三步:整个For语句目前已经转换成迭代器了,接下来就和前面的“迭代器使用For循环”一样了

  1. from collections import Iterable #可迭代对象
  2. from collections import Iterator #迭代器对象
  3. L = ["A", "B", "C"]
  4. L1 = isinstance(L, Iterable)
  5. L2 = isinstance(L, Iterator)
  6. F1 = isinstance((i for i in L), Iterable)
  7. F2 = isinstance((i for i in L), Iterator)
  8. print("list is Iterable:",L1)
  9. print("list is Iterator:",L2)
  10. print("FOR LIST is Iterable:",F1)
  11. print("FOR LIST is Iterator:",F2)
  12. #=================================
  13. #OUTPUT
  14. list is Iterable: True
  15. list is Iterator: False
  16. FOR LIST is Iterable: True
  17. FOR LIST is Iterator: True
  1. L = ["A", "B", "C"]
  2. for i in L:
  3. print(i)
  4. #================================
  5. #OUTPUT
  6. A
  7. B
  8. C

QQ截图20210124205204.png