Python 30 天 – 第 15 天 – 生成器(什么是生成器)
本文是 30 天 Python 挑战系列的一部分。您可以在此处找到本系列之前所有帖子的链接
- Python 30 天 – 第一天 – 简介
- Python 30 天 – 第 2 天 – 数据类型 I
- Python 30 天 – 第 3 天 – 数据类型 II
- Python 30 天 – 第 4 天 – 数据类型 III
- Python 30 天 – 第 5 天 – 条件和循环 I
- Python 30 天 – 第 6 天 – 循环 II 和函数
- Python 30 天 – 第 7 天 – 开发者环境
- Python 30 天 – 第 8 天 – OOP 基础知识
- Python 30 天 – 第 9 天 – OOP 支柱
- Python 30 天 – 第 10 天 – OOP 丢失的碎片
- Python 30 天 – 第 11 天 – 函数式编程
- Python 30 天 – 第 12 天 – Lambda 表达式和理解
- Python 30 天 – 第 13 天 – 装饰器
- Python 30 天 – 第 14 天 – 处理错误
今天我探讨了 Python 中生成器的所有概念。在JavaScript 中也存在生成器的概念。它是在 ES6 版本的 JavaScript 中引入的,但我在实际的 JavaScript 项目中并没有太多使用它们。今天在阅读它们时,我意识到它们非常有用,并且被用于多个 Python 库和框架中。
那么什么是生成器?
生成器是一种特殊的函数,它返回一组可迭代的值,一次一个,这意味着它可以循环遍历以逐个获取值。它有时也被称为可以“暂停”的功能。理论上,生成器听起来相当复杂和令人困惑。最好使用代码示例进行解释。我们已经使用内置的 Python 生成器range
来生成一系列值。
range_of_numbers = range(100) # 一个生成器
for num in range_of_numbers:
print(num)
# 由于 range 是一个生成器,所以它可以被迭代或循环
def my_infinite_generator():
num = 0
while True:
yield num
num +=1
result = my_infinite_generator()
for i in result:
print(i) # Keeps on printing values infinitely!
那么这个生成器函数到底是什么,它与普通函数有什么不同呢?
使用 return 语句,函数只能返回一个值。一旦函数到达 return 语句,它就会返回值并退出。而生成器函数可以使用特殊关键字返回任意数量的值yield
。每当yield
到达该语句时,函数执行就会暂停,并且控制权被传递给调用该函数的任何人。
生成器的值可以通过迭代或使用另一个next
在生成器上调用的内置函数来提取。在上面的代码块中,生成器的值是使用iteration (for 循环)打印的。可以使用该next
函数手动完成相同的操作。
def my_infinite_generator():
num = 0
while True:
yield num
num +=1
result = my_infinite_generator()
print(next(result)) # 0
print(next(result)) # 1
print(next(result)) # 2
print(next(result)) # 3
print(next(result)) # 4
请注意生成器函数如何能够记住num的值并能够增加它。无论何时yield
到达语句,它都会保存局部变量及其状态,然后将控制权转移给调用者。
常见问题FAQ
- 程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
- 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!