python中的迭代器和生成器
迭代器
-
迭代的概念
- 给定一个列表或者元组,可以通过for循环来遍历这个列表或者元组,我们把这种遍历称为迭代,迭代读取一条数据供我们使用的对象称为可迭代对象
-
在python中
-
在类里面定义iter方法创建的对象就是可迭代对象
-
class MyIter(): def __iter__(self): pass
-
在类里面定义iter和next方法创建的对象就是迭代器对象
-
class MyIter(): def __iter__(self): pass def __next__(self): pass
-
使用迭代器实现
-
class FibIterator(object): """斐波那契数列迭代器""" def __init__(self, n): """ :param n: int, 指明生成数列的前n个数 """ self.n = n # current用来保存当前生成到数列中的第几个数了 self.current = 0 # num1用来保存前前一个数,初始值为数列中的第一个数0 self.num1 = 0 # num2用来保存前一个数,初始值为数列中的第二个数1 self.num2 = 1 def __next__(self): """被next()函数调用来获取下一个数""" if self.current < self.n: num = self.num1 self.num1, self.num2 = self.num2, self.num1+self.num2 self.current += 1 return num else: raise StopIteration def __iter__(self): """迭代器的__iter__返回自身即可""" return self if __name__ == '__main__': fib = FibIterator(10) for num in fib: print(num, end=" ")
-
-
总结
- 可迭代对象不一定是迭代器对象
- 迭代器对象一定是可迭代对象
- for循环获取数据创建迭代器对象然后调用next方法
- 使用迭代器可以大大节省内存空间
生成器
- 生成器是一类特殊的迭代器,它不需要写普通迭代器的iter和next方法,使用更加方便,它依然可以使用next函数和for循环取值
- 创建生成器的方法一:
- 只要把一个列表生成式[]改成(),这样就创建了一个生成器
-
(i for i in range(5))
- 创建生成器的方法二:
-
只要在def函数中有yield关键字,就称为生成器
-
def gen(): i =0 while i<5: temp =yield i print(temp) i+=1
-
我们可以使用for循环遍历生成器
-
也可以用next方法取值
-
还可以调用send方法给yield传值
-
yield生成斐波那契数列
-
def fibonacci(num): # 初始化第一个值和第二个值 a =0 b =1 # 记录生成fibonacci数字的下标 current_index =0 while current_index < num: result = a a, b = b, a + b current_index +=1 # 代码执行到yield会暂停,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行 yield result for i in fibonacci(5): print(i)
-
- yield和return的对比
- 使用了yield关键字的函数不再是函数,而是生成器
- 代码执行到yield会暂停,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行
- 每次启动生成器都会返回一个值,多次启动可以返回多个值。
- return只能返回一次值,代码执行到return会停止迭代,抛出停止迭代异常
- yield可以在下次执行的时候接受传递的值