python之迭代器和生成器的使用方式
生成器和迭代器区别
带着问题去理解:
什么是生成器
生成器与迭代器的区别
为什么使用生成器
如何使用生成器
yeild 与 return的区别
迭代器
Python中一个实现_iter_方法和_next_方法的类对象,就是迭代器。
是一个能记住遍历位置的对象,遍历时只能往前,不能后退。迭代器常用方法有 iter() 和 next().
把一个类作为迭代器使用需要在类中实现两个函数:iter() 和 next().
生成器
Python 中使用了 yield 的函数称为生成器,生成器函数返回一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
生成器函数自动实现了迭代器协议,能更方便地实现。
生成器函数 和 生成器表达式都可以提供生成器,只需要简单地将列表推导的中括号替换成圆括号即可
二者区别
1.迭代器是访问容器的一种方式,也就是说容器已经出现。我们是从已有元素拓印出一份副本,只为我们此次迭代使用。而生成器则是,而生成器则是自己生成元素的。
2.在用法上生成器只需要简单函数写法,配合yield就能实现。而迭代器真正开发中很难使用到。我们可以把生成器看做,python给我们提供的特殊接口实现的迭代器。
3.生成器是只能遍历一次的。
为什么使用生成器
Python使用生成器对延迟操作提供了支持。在需要的时候才产生结果,而不是立即产生结果。
1、节省资源消耗,和声明序列不同的是生成器在不使用的时候几乎不占内存,也没有声明计算过程!
2、使用的时候,生成器是随用随生成,用完即刻释放,非常高效!
3、可在单线程下实现并发运算处理效果。
yeild 与 return的区别
相同点:都是返回函数执行的结果
不同点:return 在返回结果后结束函数的运行,而yield 则是让函数变成一个生成器,生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值
下面我将分别介绍迭代器和生成器的使用示例:
迭代器示例:
迭代器是一种对象,它可以在遍历时逐个访问元素而不需要将所有元素加载到内存中。下面是一个简单的迭代器示例,该迭代器生成斐波那契数列的前 n 个数字:
class FibonacciIterator:
def __init__(self, n):
self.n = n
self.current = 0
self.next_num = 1
self.count = 0
def __iter__(self):
return self
def __next__(self):
if self.count >= self.n:
raise StopIteration
result = self.current
self.current, self.next_num = self.next_num, self.current + self.next_num
self.count += 1
return result
# 使用迭代器生成斐波那契数列的前 10 个数字
fibonacci_iter = FibonacciIterator(10)
for num in fibonacci_iter:
print(num)
生成器示例:
生成器是一种特殊的函数,它可以通过 yield
关键字来暂停函数的执行,并返回一个值。每次调用生成器的时候,它会从上一次暂停的地方继续执行。下面是一个生成器示例,用于生成斐波那契数列的前 n 个数字:
def fibonacci_generator(n):
current, next_num = 0, 1
count = 0
while count < n:
yield current
current, next_num = next_num, current + next_num
count += 1
# 使用生成器生成斐波那契数列的前 10 个数字
fibonacci_gen = fibonacci_generator(10)
for num in fibonacci_gen:
print(num)
以上两个示例都能生成斐波那契数列的前 10 个数字,但一个是使用迭代器实现的,另一个是使用生成器实现的。这两种方式都可以按需生成数据,而不需要一次性加载所有数据到内存中。
本文来自博客园,作者:海_纳百川,转载请注明原文链接:https://www.cnblogs.com/chentiao/p/18091777,如有侵权联系删除