可迭代对象 1 2 3 4 实现了__iter__的对象就是可迭代对象 class IsIterable: def __iter__(self): return self
迭代器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 实现了 __ iter __ +__ next __ >>> class MyIterator: """ 迭代器类 Author:可乐python说 """ def __init__(self): self.num = 0 def __iter__(self): return self def __next__(self): return_num = self.num # 只要值大于等于6,就停止迭代 if return_num >= 6: raise StopIteration self.num += 2 return return_num >>> my_iterator = MyIterator() >>> next(my_iterator) 0 >>> next(my_iterator) 2 >>> next(my_iterator) 4 >>> next(my_iterator) Traceback (most recent call last): File "<input>", line 1, in <module> StopIteration
生成器 1 2 特殊的迭代器 不需要实现 __ iter __ +__ next __ 又可以实现相同的作用 ,有以下两种方式
生成器函数 借助yield实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 >>> def my_generator(): my_num = 0 while my_num < 5: yield my_num my_num += 1 >>>generator_ = my_generator() >>> next(generator_) 0 >>> next(generator_) 1 >>> next(generator_) 2 >>> next(generator_) 3 >>> next(generator_) 4 >>> next(generator_) # 终止迭代则会抛出 StopIteration 异常 Traceback (most recent call last): File "<input>", line 1, in <module> StopIteration
生成器表达式 使用 ()
包裹,而不是【】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 g = ((i)**2 for i in range(5)) print (next(g)) print (next(g)) print (next(g)) print (next(g)) print (next(g)) print (next(g)) print (next(g)) 0 1 4 9 16 Traceback (most recent call last): File "d:\python\test.py", line 7, in <module> print (next(g)) StopIteration
优势
1 2 3 4 5 6 7 8 9 10 11 import sys my_list = [i for i in range(1000000)] print( "列表消耗的内存:{}".format(sys.getsizeof(my_list))) my_generator = (i for i in range(1000000)) print("生成器消耗的内存:{}".format(sys.getsizeof(my_generator))) 列表消耗的内存:8448728 生成器消耗的内存:112
参考 https://www.runoob.com/python3/python3-iterator-generator.html
https://kelepython.readthedocs.io/zh/latest/c01/c01_11.html