迭代器
Posted yuqiangli0616
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器相关的知识,希望对你有一定的参考价值。
1. 什么是可迭代对象:实现了 __iter__()方法的对象,为可迭代对象。
2. 什么是迭代器: 实现了 __iter__()方法,并且__iter__()必须返回一个对象的引用,这个对象中不但实现了iter()方法,还需要__next__()方法。
3. 迭代器不生成数据,只保存生成数据的方式。
4. 迭代器可以for循环,每次for循环,返回的是__next__()方法中的返回值。
5. for循环的过程,如:
for name in classmate: print(name) time.sleep(1)
1. 判断classmate是否是可以迭代的对象, 即是否实现了__iter__()方法。 isinstance(classmate, Iterable))
2. __iter__()方法是否返回了一个具有 __iter__()方法和__next__()方法的对象引用。
import time from collections import Iterable from collections import Iterator class Classmate(object): def __init__(self): self.names = list() def add(self, name): self.names.append(name) def __iter__(self): """如果想要一个对象称为一个 可以迭代的对象,即可以使用for,那么必须实现__iter__方法""" return ClassIterator() class ClassIterator(object): def __iter__(self): pass def __next__(self): return 11 classmate = Classmate() classmate.add("老王") classmate.add("王二") classmate.add("张三") for name in classmate: print(name) time.sleep(1)
循环这个迭代器时,会输出__next__()方法的返回值,即11
import time from collections import Iterable from collections import Iterator class Classmate(object): def __init__(self): self.names = list() def add(self, name): self.names.append(name) def __iter__(self): """如果想要一个对象称为一个 可以迭代的对象,即可以使用for,那么必须实现__iter__方法""" return ClassIterator(self) class ClassIterator(object): def __init__(self, obj): self.obj = obj self.current_num = 0 def __iter__(self): pass def __next__(self): if self.current_num < len(self.obj.names): ret = self.obj.names[self.current_num] self.current_num += 1 return ret else: raise StopIteration classmate = Classmate() classmate.add("老王") classmate.add("王二") classmate.add("张三") # print("判断classmate是否是可以迭代的对象:", isinstance(classmate, Iterable)) # classmate_iterator = iter(classmate) # print("判断classmate_iterator是否是迭代器:", isinstance(classmate_iterator, Iterator)) # print(next(classmate_iterator)) for name in classmate: print(name) time.sleep(1)
循环时,输出 ‘老王’, ‘王二’, ‘张三’
import time from collections import Iterable from collections import Iterator class Classmate(object): def __init__(self): self.names = list() self.current_num = 0 def add(self, name): self.names.append(name) def __iter__(self): """如果想要一个对象称为一个 可以迭代的对象,即可以使用for,那么必须实现__iter__方法""" return self # 调用iter(xxobj)的时候 只要__iter__方法返回一个 迭代器即可,至于是自己 还是 别的对象都可以的, 但是要保证是一个迭代器(即实现了 __iter__ __next__方法) def __next__(self): if self.current_num < len(self.names): ret = self.names[self.current_num] self.current_num += 1 return ret else: raise StopIteration classmate = Classmate() classmate.add("老王") classmate.add("王二") classmate.add("张三") # print("判断classmate是否是可以迭代的对象:", isinstance(classmate, Iterable)) # classmate_iterator = iter(classmate) # print("判断classmate_iterator是否是迭代器:", isinstance(classmate_iterator, Iterator)) # print(next(classmate_iterator)) for name in classmate: print(name) time.sleep(1)
class Fibonacci(object): def __init__(self, all_num): self.all_num = all_num self.current_num = 0 self.a = 0 self.b = 1 def __iter__(self): return self def __next__(self): if self.current_num < self.all_num: ret = self.a self.a, self.b = self.b, self.a+self.b self.current_num += 1 return ret else: raise StopIteration fibo = Fibonacci(10) for num in fibo: print(num)
以上是关于迭代器的主要内容,如果未能解决你的问题,请参考以下文章