在Python中,迭代器和生成器都用于遍历序列或生成序列,但它们的工作方式和用途不同
一、迭代器
迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
在Python中,迭代器需要实现两个方法,即__iter__() 和 __next__()。任何包含__iter__和__next__()方法的对象都是迭代器。
# Python中的迭代器示例
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter)) # 1
print(next(myiter)) # 2
二、生成器
生成器是一种特殊类型的迭代器(其实可以说它是更简洁版的迭代器)。与编写__iter__()和__next__()相比,编写生成器要简单得多,只需要一个函数即可。
使用Yield语句从函数返回值。这样的函数被称为生成器函数。 生成器函数返回的是一个生成器对象。
# Python中的生成器示例
def my_generator():
n = 1
print('This is printed first')
yield n
n += 1
print('This is printed second')
yield n
n += 1
print('This is printed at last')
yield n
a = my_generator()
print(next(a)) # This is printed first, 1
print(next(a)) # This is printed second, 2
在 Python 中,yield 是一个关键字,用于在函数定义中,特别是在定义一个生成器(generator)时使用。
yield 和 return 类似,都会从函数中返回一些值。但它们的行为却非常不同:
当一个函数调用 return 语句,该函数的执行就会立即停止,返回值给调用者,并且舍弃掉当前函数内的所有局部变量的信息。
相比之下,当一个函数调用 yield 语句时,函数并不会退出,而是每次产生一个值后函数会被冻结,保留当前所有的局部变量的信息,并在下次调用 next() 方法时,从上次 yield 表达式的下一条语句开始执行。
因此,yield 是构建生成器以支持延迟操作或流式数据处理的关键。
*需要注意的是,生成器只能遍历一次。因为它们不把所有的值存储在内存中,而是在运行时生成值。