简而言之:迭代器是一个抽象化的概念,在python中表示访问数据集合中元素的一种方式;生成器也是一个抽象化的概念,在python 中,边循环边生成所需数据,是一种时间换空间的方法。从访问数据方式上来看:生成器是一种特殊的迭代器。
目录
一、迭代和可迭代对象
1、 什么是迭代:
2、什么是可迭代对象:
二、迭代器
三、生成器
四 、使用场景和总结
一、迭代和可迭代对象
1、 什么是迭代:
-
迭代:迭代是通过循环结构(如
for
循环、while
循环等)来实现重复执行代码的方法。程序会根据条件或计数器的变化,反复执行一段代码,直到满足某个终止条件为止。 - 递归:递归是通过函数调用自身来解决问题的方法。函数在执行过程中会不断地调用自己,直到遇到终止条件才停止递归。
2、什么是可迭代对象:
如 list、tuple、dict、set、str、range、enumerate 等这些可以直接用于 for 循环的对象称为可迭代(Iterable)对象,也即它们是可迭代的。
- 可迭代对象,需要提供 __iter__()方法,否则不能被 for 语句处理。
iter() 内建方法可以把list、dict、str等可迭代对象转换成迭代器
除字典外,一个对象只要实现了 __getitem__() 方法,就认为它是序列类型,序列类型总是可迭代的。对于序列类型,字典,还有更复杂的可迭代类型如 range,Python 内建了对应的迭代器对它们进行迭代操作,它们无需实现 __next__() 方法,iter() 函数会返回对应的内建迭代器。
二、迭代器
迭代器通过类来实现,在类中需要定义两个方法 __iter__() 和 __next__()方法
__iter__()
方法返回迭代器对象自身,
__next__()
方法返回下一个元素的值,在没有更多元素可提供时引发 StopIteration
异常
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.data):
value = self.data[self.index]
self.index += 1
return value
else:
raise StopIteration
# 使用自定义迭代器
my_list = [1, 2, 3, 4, 5]
my_iterator = MyIterator(my_list)
for num in my_iterator:
print(num)
三、生成器
如果我们要处理更多元素,那么所占内存就呈线性增大,所以受到内存限制,列表容量是有限的。通常我们并不会一次处理所有元素,而只是集中在其中的某些相邻的元素上。所以如果列表元素可以用某种算法用已知量推导出来,就不必一次创建所有的元素。这种边循环边计算的机制,称为生成器(generator),生成器是用时间换空间的典型实例。
生成器通常由两种方式生成,用小括号()表示的生成器表达式(generator expression)和生成器函数(generator function)
生成器表达式和生成器函数产生生成器时,会自动生成名为 __iter__ 和 __next__ 的方法
下面关于生成器表达式和生成器函数的代码,来源于链接3
list0 = [x * x for x in range(5)]
print(list0)
list_generator0 = (x * x for x in range(5))
print(list_generator0)
list_generator1 = (x * x for x in range(5000000))
print(sys.getsizeof(list_generator0))
print(sys.getsizeof(list_generator1))
>>>
[0, 1, 4, 9, 16]
<generator object <genexpr> at 0x000002C7B9955B48>
88
88
def fibonacci(n):
i, j = 0, 1
while(i < n):
print(i, end=' ')
i, j = j, i + j
fibonacci(5)
print(type(fibonacci))
>>>
0 1 1 2 3 <class 'function'>
四 、使用场景和总结
- 迭代器通常用于对列表、元组、字典等数据结构进行遍历。它们适用于已知数据集合且数据量不太大的情况。
- 生成器适用于需要动态生成数据的情况,尤其是当数据集合非常大或是无限的时候。生成器按需生成数据,可以节省内存和提高性能
总结起来,迭代器是一种数据访问模式的抽象概念,用于按序访问集合中的元素,它可以由自定义的迭代器对象或 Python 内置的可迭代对象生成。而生成器是一种特殊的函数或表达式,用于按需生成数据,并保存状态以支持断续生成。生成器是一种特殊的迭代器,通常用于处理大数据集或无限序列,以节省内存并提高性能。
参考链接:
https://www.runoob.com/python3/python3-iterator-generator.htmlhttps://www.runoob.com/python3/python3-iterator-generator.html
https://blog.csdn.net/be5yond/article/details/119344030https://blog.csdn.net/be5yond/article/details/119344030
https://pythonhowto.readthedocs.io/zh_CN/latest/iterator.html#id10https://pythonhowto.readthedocs.io/zh_CN/latest/iterator.html#id10部分代码和文章来源ChatGPT.