分步学习Python生成器函数
Python中的生成器是一种可以自动迭代序列的函数。生成器函数可以通过迭代器协议进行遍历,将函数生成的值逐个迭代输出。
生成器函数的语法如下:
def generator_function():
yield value
这里的yield关键字可将函数作为生成器函数运行,并依次生成一系列值。这些值可以在函数执行中通过yield语句传递给调用函数。
生成器函数可以在需要迭代值时手动调用,也可以与Python中的迭代器对象一起使用。下面是一些生成器函数的例子。
### 生成器示例1:斐波那契数列
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
在这个例子中,生成器函数fionacci创建了一个迭代序列,该序列包含了斐波那契数列的前n项。在每次运行yield语句时,函数返回当前斐波那契数列中的下一个数。
### 使用生成器函数
为了使用生成器函数,可以使用Python中的 next() 函数或者使用for循环进行迭代。
例如:
fib = fibonacci()
next(fib) # 返回0
next(fib) # 返回1
next(fib) # 返回1
next(fib) # 返回2
# 使用for循环迭代
for i in fibonacci():
if i > 100:
break
print(i)
在这个例子中,我们可以看到,使用next函数逐步拉取生成器函数的值,使用for循环进行全迭代。
### 生成器示例2:随机数生成器
import random
def random_number():
while True:
yield random.random()
此示例显示了如何使用生成器创建随机数序列。当调用random_number函数时,它将返回一个包含无限个随机数的生成器。该函数每次调用yield时都返回下一个随机数。
### 生成器示例3:字典逐一迭代器
class DictIter:
def __init__(self, d: dict):
self.d = d
self.index = 0
self.keys = list(d.keys())
def __next__(self):
if self.index < len(self.keys):
i = self.index
self.index += 1
return self.keys[i], self.d[self.keys[i]]
else:
raise StopIteration
def dict_iterator(d: dict):
return DictIter(d)
对于生成器示例3,我们定义了Class DictIter来实现一个字典逐一迭代器。该迭代器实现了 Python的 Iterator 协议,因此可以与Python内置的 next()函数 或 for循环结合使用。
Python中已经有dict的迭代器实现方式,items()方法可以返回以键值对的方式为元素的迭代器,而keys()和values()方法分别可以返回以键或值为元素的迭代器。
例如:
d = {"a": 1, "b": 2, "c": 3}
for k, v in d.items():
print(f"{k}: {v}")
使用dict_iterator函数:
d = {"a": 1, "b": 2, "c": 3}
for k, v in dict_iterator(d):
print(f"{k}: {v}")
### 生成器注意事项:
1. 每个生成器函数在 次调用时都会创建一个协程对象
2. yield关键字在函数执行时发挥了重要作用
3. 生成器不会在一个函数调用结束时撤销,Python垃圾回收机制会在对象生命周期结束时自动清理
4. 生成器可以在需要迭代值时手动调用,也可以与Python中的迭代器协议一起使用。
总的来说,生成器函数是一种非常强大而又方便的特性,可以大大简化实现复杂迭代器功能的代码。加上Python内置的一些迭代器方法,形成了完善的迭代器/生成器机制。这对于Python程序员来说是一个非常重要的优势。
