(编辑:jimmy 日期: 2024/11/13 浏览:2)
本文实例讲述了Python学习笔记之迭代器和生成器用法。分享给大家供大家参考,具体如下:
迭代器和生成器
迭代器
生成器
下面是一个叫做 my_range 的生成器函数,它会生成一个从 0 到 (x - 1) 的数字流:
def my_range(x): i = 0 while i < x: yield i i += 1
该函数使用了 yield 而不是关键字 return。这样使函数能够一次返回一个值,并且每次被调用时都从停下的位置继续。关键字 yield
是将生成器与普通函数区分开来的依据。
因为上述代码会返回一个迭代器,因此我们可以将其转换为列表或用 for 循环遍历它,以查看其内容。例如,下面的代码:
for x in my_range(5): print(x)
输出如下:
0
1
2
3
4
为何要使用生成器?
迭代器和生成器[相关练习]
请自己写一个效果和内置函数 enumerate 一样的生成器函数。如下所示地调用该函数:
lessons = ["Why Python Programming", "Data Types and Operators", "Control Flow", "Functions", "Scripting"] for i, lesson in my_enumerate(lessons, 1): print("Lesson {}: {}".format(i, lesson))
应该会输出:
Lesson 1: Why Python Programming
Lesson 2: Data Types and Operators
Lesson 3: Control Flow
Lesson 4: Functions
Lesson 5: Scripting
解决方案:
lessons = ["Why Python Programming", "Data Types and Operators", "Control Flow", "Functions", "Scripting"] def my_enumerate(iterable, start=0): # Implement your generator function here i = start for element in iterable: yield i, element i += 1 for i, lesson in my_enumerate(lessons, 1): print("Lesson {}: {}".format(i, lesson))
如果可迭代对象太大,无法完整地存储在内存中(例如处理大型文件时),每次能够使用一部分很有用。实现一个生成器函数 chunker,接受一个可迭代对象并每次生成指定大小的部分数据。如下所示地调用该函数:
for chunk in chunker(range(25), 4): print(list(chunk))
应该会输出:
[0, 1, 2, 3]
[4, 5, 6, 7]
[8, 9, 10, 11]
[12, 13, 14, 15]
[16, 17, 18, 19]
[20, 21, 22, 23]
[24]
解决方案:
def chunker(iterable, size): for i in range(0, len(iterable), size): yield iterable[i:i + size] for chunk in chunker(range(25), 4): print(list(chunk))
学习参考:
https://www.python.org/dev/peps/pep-0257/
https://docs.python.org/3/tutorial/classes.html#iterators
https://softwareengineering.stackexchange.com/questions/290231/when-should-i-use-a-generator-and-when-a-list-in-python/290235
https://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks
更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。