BZ易风

导航

 

迭代器能减少内存空间实现循环。

方法1:

 1 import time
 2 from collections import Iterable
 3 from collections import Iterator
 4 
 5 
 6 class Classmate(object):
 7 
 8 
 9     def __init__(self):
10         self.names = list()
11 
12 
13     def add(self,name):
14         self.names.append(name)
15 
16 
17     def __iter__(self):
18         """如果想要一个对象变成一个可以迭代的对象,即可以使用for,那么必须实现__iter__方法"""
19         return Classmator(self);  # 调用Classmator 然后把自己传过去
20 
21 
22 class Classmator(object):
23     def __init__(self,obj):
24         self.obj = obj
25         # 定义索引值
26         self.current_num = 0
27 
28     def __iter__(self):
29         pass
30 
31 
32     def __next__(self):
33         # 判断索引值是否超出列表个数范围
34         if self.current_num < len(self.obj.names):
35             ret = self.obj.names[self.current_num]
36             # 索引值+1
37             self.current_num += 1
38             return ret
39         else:
40             # 抛出异常,终止for循环
41             raise StopIteration
42 
43 classmate = Classmate()
44 
45 classmate.add("张三")
46 classmate.add("张二")
47 classmate.add("李四")
48 
49 # 判断一个类型是否可以迭代   isinstance(要判断的对象,Iterable)
50 print("判断classmate是否是可以迭代的对象:", isinstance(classmate,Iterable))
51 # 迭代器
52 classmate_iterator = iter(classmate)
53 # 判断classmate_iterator是否是迭代器
54 print("判断classmate_iterator是否是迭代器:", isinstance(classmate_iterator,Iterator))
55 # print(next(classmate_iterator))
56 
57 for name in classmate:
58     print(name)
59     time.sleep(1)

两个类可以改善成一个,只要有__iter__方法和__next__方法:

 1 import time
 2 from collections import Iterable
 3 from collections import Iterator
 4 
 5 
 6 
 7 class Classmate(object):
 8     def __init__(self):
 9         self.names = list()
10         self.current_num = 0
11 
12     def add(self,name):
13         self.names.append(name)
14 
15 
16     def __iter__(self):
17         return self
18 
19 
20     def __next__(self):
21         if self.current_num < len(self.names):
22             ret = self.names[self.current_num]
23             self.current_num += 1
24             return ret
25         else:
26             raise StopIteration
27 
28 
29 classmate = Classmate()
30 classmate.add("张三")
31 classmate.add("李四")
32 classmate.add("王五")
33 
34 # 判断一个类型是否可以迭代   isinstance(要判断的对象,Iterable)
35 print("判断classmate是否是可以迭代的对象:", isinstance(classmate,Iterable))
36 # 迭代器
37 classmate_iterator = iter(classmate)
38 # 判断classmate_iterator是否是迭代器
39 print("判断classmate_iterator是否是迭代器:", isinstance(classmate_iterator,Iterator))
40 # print(next(classmate_iterator))
41 
42 for name in classmate:
43     print(name)
44     time.sleep(1)

 

posted on 2019-08-22 09:25  BZ易风  阅读(135)  评论(0编辑  收藏  举报