python 生成器与迭代器区别
一、可迭代对象、迭代器、生成器 的区别
可迭代对象:只要实现 __ iter __ 方法或者实现 __ getitem __方法而且其参数从0开始索引,那么该对象就是可迭代对象。可以用 for 循环遍历,常见的有string,list,tuple,dict,set。
迭代器: 实现了__ iter __ 方法和 __ next __ 方法的对象。__ iter __ 方法用于返回迭代器本身,而 __ next __ 用于返回下一个元素。可以用iter()函数将可迭代对象转化成迭代器。
生成器:生成器是一种特殊的迭代器,生成器通过定义一个包含yield
关键字的函数来创建。每次调用yield
时,函数会暂停并返回一个值,保留函数的状态以便下次继续执行。不需要在内存中存储整个序列,这使得它们非常适合处理无限序列或大数据集
二、生成器原理
生成器的原理与功能可以分为以下几个核心点:
- 迭代行为:Python中的生成器作为一种特殊的迭代器,实现了迭代器协议,即它们有一个
__next__()
的方法。这允许生成器逐个产生序列中的元素。 - 状态挂起:当生成器函数执行到
yield
语句时,它会返回一个值给调用者,并且暂停其自身的状态(包括局部变量、指令指针等)。在下一次调用__next__()
方法时,它会从上次暂停的地方继续执行,而不是从头开始执行函数。 - 内存效率:普通函数一次性计算并返回所有结果,通常需要存储整个结果集合,这对内存是一种负担。生成器函数则是按需计算,每次只产生一个结果,所以非常节省内存。
- 代码简洁:生成器提供了一种简便的方法来实现迭代器而无需定义一个类来实现
__iter__()
和__next__()
方法,使得代码更加简洁。
生成生成器的几种方式
1、推导式:
generator = (i for i in range(10))
print(type(generator))
# 调用__next__()方法
print(generator.__next__())
print(generator.__next__())
# 控制台输出
'''
<class 'generator'>
0
1
'''
2、yield
关键字
def generator():
for i in range(10):
yield i
gener = generator()
print(type(gener))
# 调用__next__()方法
print(gener.__next__())
print(gener.__next__())
# 控制台输出
'''
<class 'generator'>
0
1
'''
3、yield from
后面需要加的是可迭代对象,它可以是普通的可迭代对象,也可以是迭代器,甚至是生成器。
def generator():
yield from range(10)
gener = generator()
print(type(gener))
# 调用__next__()方法
print(gener.__next__())
print(gener.__next__())
# 控制台输出
'''
<class 'generator'>
0
1
'''