当前位置:   article > 正文

python __iter__,__next__使用___iter__ __next__

__iter__ __next__

作用:

__iter__: 把一个对象改为 可迭代对象

__next__ : 可迭代对象中 获取下一个数据,注意方法中 为了 不进行无限迭代, 需要有 raise StopIteration   在符合条件时停止迭代;

用途:

  • 在想定义自己的迭代方式时 可以用此2个方法;
  • 使用时,可以配合for循环;
  • 可以在 设计模式的 迭代模式中使用

如下 示例表示迭代 dict中的值 依次遍历

示例代码:

  1. # -*- coding: utf-8 -*-
  2. """
  3. (C) Guangcai Ren <rgc@bvrft.com>
  4. All rights reserved
  5. create time '2020/12/30 19:20'
  6. Usage:
  7. 迭代器模式使用示例
  8. 实现 二叉树的 广度遍历和深度遍历
  9. """
  10. from copy import deepcopy
  11. from queue import Queue
  12. class Forefathers:
  13. """
  14. 组件 或 抽象构件 角色 主要 声明 公共方法
  15. """
  16. queue = Queue()
  17. def __init__(self, name, age, gender):
  18. self.name = name
  19. self.age = age
  20. self.gender = gender
  21. def __str__(self):
  22. """"""
  23. return self.name
  24. def add(self, someone):
  25. pass
  26. def remove(self, someone):
  27. pass
  28. def __iter__(self):
  29. """
  30. 此方法 将对象转为可迭代对象
  31. 此方法 返回值必须是个可迭代对象;
  32. :return:
  33. """
  34. # 可迭代对象使用 Introduce的实例化;
  35. # 也就是说 后续的 迭代获取下一个 数据 其实用的就是 Introduce实例化对象的 __next__方法
  36. obj = Introduce(self)
  37. obj.dfs_lf_list()
  38. return obj
  39. def dfs_lf(self):
  40. obj = Introduce(self)
  41. obj.dfs_lf_list()
  42. return obj
  43. def dfs_rf(self):
  44. obj = Introduce(self)
  45. obj.dfs_rf_list()
  46. return obj
  47. class Parents(Forefathers):
  48. """
  49. 容器 或 组合 角色
  50. 父母 类 可以有后代
  51. """
  52. def __init__(self, name, age, gender):
  53. """
  54. :param name:
  55. :param age:
  56. :param gender:
  57. """
  58. super(Parents, self).__init__(name, age, gender)
  59. self.children = []
  60. def add(self, *someone):
  61. """
  62. 新增 子孙
  63. :param someone:
  64. :return:
  65. """
  66. self.children += someone
  67. def remove(self, someone):
  68. """
  69. 移出 祖籍
  70. :param someone:
  71. :return:
  72. """
  73. self.children.remove(someone)
  74. class Child(Forefathers):
  75. """
  76. 叶节点 角色
  77. 孩童 类 没有后代
  78. """
  79. def __init__(self, name, age, gender):
  80. """
  81. :param name:
  82. :param age:
  83. :param gender:
  84. """
  85. super(Child, self).__init__(name, age, gender)
  86. class Introduce:
  87. def __init__(self, been_iter):
  88. self.been_iter = been_iter
  89. self._p = 0
  90. self.name_list = []
  91. # self.dfs_lf_list(been_iter)
  92. # self.dfs_rf_list(been_iter)
  93. def dfs_lf_list(self, been_iter=None):
  94. """
  95. 先将 被迭代的 嵌套层级数据 按照一定规则剥离层级关系 抽取到一个list中;目的为了在__next__方法中方便遍历
  96. 如 原来是 [[1,2],3,[4,[5,[6,[7]]]]] 转为:[1,2,3,4,5,6,7]
  97. 此处遍历方法如下:
  98. 深度优先遍历
  99. 前序遍历
  100. :return:
  101. """
  102. if not been_iter:
  103. been_iter = self.been_iter
  104. self.name_list.append(been_iter.name)
  105. if hasattr(been_iter, 'children'):
  106. for item in been_iter.children:
  107. self.dfs_lf_list(item)
  108. def dfs_rf_list(self, been_iter=None):
  109. """
  110. 先将 被迭代的 嵌套层级数据 按照一定规则剥离层级关系 抽取到一个list中;目的为了在__next__方法中方便遍历
  111. 如 原来是 [[1,2],3,[4,[5,[6,[7]]]]] 转为:[1,2,3,4,5,6,7]
  112. 此处遍历方法如下:
  113. 深度优先遍历
  114. 后序遍历
  115. :return:
  116. """
  117. if not been_iter:
  118. been_iter = self.been_iter
  119. self.name_list.append(been_iter.name)
  120. if hasattr(been_iter, 'children'):
  121. children = deepcopy(been_iter.children)
  122. children.reverse()
  123. for item in children:
  124. self.dfs_rf_list(item)
  125. def __next__(self):
  126. """
  127. 获取下一个数据
  128. :return:
  129. """
  130. try:
  131. val = self.name_list[self._p]
  132. self._p += 1
  133. except IndexError:
  134. # 停止迭代的方法
  135. raise StopIteration
  136. return val
  137. def __iter__(self):
  138. """
  139. 此方法 将对象转为可迭代对象
  140. :return:
  141. """
  142. return self
  143. if __name__ == '__main__':
  144. """
  145. """
  146. root = Parents('第一代祖宗', 1800, 'man')
  147. sec_man = Parents('第二代男祖宗', 1840, 'man')
  148. sec_man1 = Parents('第二代男1祖宗', 1840, 'man')
  149. sec_woman = Parents('第二代女祖宗', 1840, 'woman')
  150. root.add(sec_man, sec_woman, sec_man1)
  151. last_one = Child('最早灭绝一代', 1860, 'man')
  152. sec_man.add(last_one)
  153. third_woman = Parents('第三代女祖宗', 1860, 'woman')
  154. sec_woman.add(third_woman)
  155. third_man = Parents('第三代男祖宗', 1860, 'man')
  156. sec_woman.add(third_man)
  157. four_man = Parents('第四代男祖宗', 1890, 'man')
  158. third_woman.add(four_man)
  159. last_one = Child('最后一代', 1890, 'man')
  160. third_woman.add(last_one)
  161. print('开始执行 默认的迭代方式(前序遍历)', '*' * 10)
  162. for item in root.__iter__():
  163. print(item)
  164. for item in root:
  165. print(item)
  166. print('开始执行 前序遍历', '*' * 10)
  167. for item in root.dfs_lf():
  168. print(item)
  169. print('开始执行 后序遍历', '*' * 10)
  170. for item in root.dfs_rf():
  171. print(item)
  172. # -*- coding: utf-8 -*-
  173. """
  174. (C) Guangcai Ren <rgc@bvrft.com>
  175. All rights reserved
  176. create time '2020/12/30 13:18'
  177. Usage:
  178. """
  179. class IterDictVal:
  180. """
  181. 迭代字典的值
  182. """
  183. def __init__(self, k_v_map):
  184. """
  185. 初始化
  186. :param k_v_map:
  187. """
  188. self.v_list = list(k_v_map.values())
  189. self.v_list.reverse()
  190. def __iter__(self):
  191. """
  192. 将对象变为可迭代对象
  193. :return:
  194. """
  195. return self
  196. def __next__(self):
  197. """
  198. 获取下一个数据
  199. :return:
  200. """
  201. if self.v_list:
  202. return self.v_list.pop()
  203. else:
  204. raise StopIteration
  205. if __name__ == '__main__':
  206. # for ... in xxx 首先 xxx必须是一个可迭代对象(有__iter__方法),其次 必须要有next方法 供for循环一直查找下一个;
  207. for item in IterDictVal({'a': 1, 'b': 2, 'c': 3}):
  208. print(item)
  209. for item in IterDictVal({'a': 1, 'b': 2, 'c': 3}).__iter__(): # 被迭代对象默认调用的就是 __iter__方法
  210. print(item)

相关连接:

https://blog.csdn.net/abcx3261/article/details/88966547?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control

https://blog.csdn.net/will130/article/details/50920501?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control

https://blog.csdn.net/liweibin1994/article/details/77374854

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

闽ICP备14008679号