|
楼主 |
发表于 2018-4-23 23:38:35
|
显示全部楼层
本帖最后由 Cczhou 于 2018-4-23 23:45 编辑
- >>> class Fibs:
- def __init__(self, num = 20):
- self.a = 0
- self.b = 1
- self.num = num
- def __iter__(self):
- print('调用iter...')
- return self
- def __next__(self):
- self.a, self.b = self.b, self.a + self.b
- if self.a > self.num:
- raise StopIteration
- return self.a
-
- >>> fibs = Fibs()
- >>> for i in fibs:
- print(i)
-
- 调用iter...
- 1
- 1
- 2
- 3
- 5
- 8
- 13
- >>> for i in fibs:
- print(i)
-
- 调用iter...
- >>>
复制代码
第二次输出没有了,那是因为在Fibs类中,对__iter__方法的重写是直接return self,在for循环中触发迭代器,调用iter(),返回可迭代对象,在第一次for中就已经迭代完了。尽管第二次for中也调用了iter(),但是还是同一个对象,因为是直接return self, 所以没有可迭代的了,就没有输出。
- >>> class Fibs:
- def __init__(self, num = 20):
- self.a = 0
- self.b = 1
- self.num = num
- def __iter__(self):
- print('调用iter...')
- return self
- def __next__(self):
- self.a, self.b = self.b, self.a + self.b
- if self.a > self.num:
- raise StopIteration
- return self.a
- >>> fibs = Fibs()
- >>> a = iter(fibs)
- 调用iter...
- >>> a
- <__main__.Fibs object at 0x00000000030E3630>
- >>> b = iter(fibs)
- 调用iter...
- >>> b
- <__main__.Fibs object at 0x00000000030E3630>
- >>>
复制代码
若想实现反复输出,则要返回不在一个地址的对象才行
- >>> import copy
- >>> class Fibs:
- def __init__(self, num = 20):
- self.a = 0
- self.b = 1
- self.num = num
- def __iter__(self):
- print('调用iter...')
- tem = copy.copy(self)
- return tem
- def __next__(self):
- self.a, self.b = self.b, self.a + self.b
- if self.a > self.num:
- raise StopIteration
- return self.a
-
- >>> fibs = Fibs()
- >>> for i in fibs:
- print(i)
-
- 调用iter...
- 1
- 1
- 2
- 3
- 5
- 8
- 13
- >>> for i in fibs:
- print(i)
-
- 调用iter...
- 1
- 1
- 2
- 3
- 5
- 8
- 13
复制代码
|
|