[Python3]迭代器和生成器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Python3]迭代器和生成器相关的知识,希望对你有一定的参考价值。
迭代器
迭代是Python最强大的功能特色,是遍历访问序列元素的一种方式。
迭代器的特性是:
-
可以记住当前遍历位置
-
只能往前遍历,不能后退
-
从序列的第一个元素开始访问,直至所有元素被访问完
-
有两个基本方法: iter() 和 next()
-
字符串、列表或元组对象可以用于创建迭代器
下面看以下实例:
# -*- coding:utf-8 -*- __author__ = ‘谷白‘ import sys if __name__ == "__main__": seq_tuple = (1, 2, 3, 4, 5) # 创建迭代器 seq_it = iter(seq_tuple) # 访问打印第一个元素 print("第一个元素:%s" % next(seq_it)) # 访问打印第二个元素 print("第二个元素:%s" % next(seq_it)) # 访问打印第三个元素 print("第三个元素:%s" % next(seq_it)) # 使用for循环来遍历迭代器对象 print("\nfor循环遍历迭代器对象: ") for_it = iter(seq_tuple) for x in for_it: print(x, end=‘ ‘) # 使用while结合next遍历迭代器对象 print("\n\nwhile & next遍历迭代器对象: ") while_it = iter(seq_tuple) while True: try: print(next(while_it)) except StopAsyncIteration: sys.exit()
运行结果如下:
第一个元素:1 第二个元素:2 第三个元素:3 for循环遍历迭代器对象: 1 2 3 4 5 while & next遍历迭代器对象: 1 2 3 4 5 Traceback (most recent call last): File "E:/code/python/sample/迭代器.py", line 32, in <module> print(next(while_it)) StopIteration
请注意上述才异常抛出,因为这里已经遍历超出了序列的边界了。
生成器
在Python中使用了yield的函数,我们称之为生成器。
与普通函数不同的是:生成器返回的是一个迭代器的函数,只能用于迭代操作,直接理解就是:生成器就是功能更强大的迭代器。
在调用生成器的过程中,每次遇到yield时,函数就会暂停并保存当前运行状态,返回yield的值,并在下一次执行next() 方法时从当前位置继续运行。
下面我们通过使用生成器来实现斐波那契数列:
# -*- coding:utf-8 -*- __author__ = ‘谷白‘ import sys # 生成器函数 # 实现斐波那契数列 def fibonacci(n): # 初始化变量 a, b, count = 0, 1, 0 while True: if count > n: return yield a a, b = b, a + b count = count + 1 if __name__ == "__main__": # 初始化生成器函数,产生一个生成器函数 f = fibonacci(10) while True: try: print(next(f), end=‘ ‘) except StopAsyncIteration: sys.exit(0)
运行结果如下:
0 1 1 2 3 5 8 13 21 34 55 Traceback (most recent call last): File "E:/code/python/sample/生成器.py", line 30, in <module> print(next(f), end=‘ ‘) StopIteration
注:上述输出有异常抛出,是正常的。
实践提升题
大家可以尝试利用生成器函数去读大文件,例如10G的文件,你可以利用生成器函数,每次只读100M进行处理,处理完后再读取下一个100M,如此迭代下去。
以上是关于[Python3]迭代器和生成器的主要内容,如果未能解决你的问题,请参考以下文章