生成器
驾驭命运的舵是奋斗。不抱有一丝幻想,不放弃一点机会,不停止一日努力 –佚名
生成器是一个函数,这个函数的特殊之处在于它的 return 语句被 yield 语句替代
基本用法
def power_of_two():
for content in range(11):
yield 2**content
p = power_of_two()
print(next(p))
print(next(p))
# 结果 1
# 结果 2
生成器的关键在于 yield 语句.yield 语句的作用和 return 语句有几分相似,都可以将结果返回.不同的在于,生成器函数执行 yield 语句,返回结果的同时记录下函数内的状态.下次执行这个生成器函数,将从上次退出的位置(yield 的下一句代码)继续执行.当生成器函数中的所有代码被执行完毕,抛出异常
这里我们可以看到生成器的用法和迭代器类似都使用 next()来迭代,这是因为生成器其实就是创建迭代器的便捷方法,生成器会在背后自动定义__iter__()和__next__()方法
生成器表达式
- 生成器表达式的写法非常简单,但是灵活有限,所能表达的内容相对简单
生成器 = (针对项的操作 for 项 in 可迭代对象)
- 实例
letters = (content.upper() for content in 'abc')
print(next(letters))
print(next(letters))
print(next(letters))
# 结果
# A
# B
# C
生成器和迭代器的区别
有 iter()和 next()魔法方法的对象,都是迭代器(可以为你的类添加迭代器行为)
生成器是一个用于创建迭代器的工具,它们的写法类似标准的函数,但当他们要返回数据时会使用 yield 语句.每次对生成器调用 next()他们会从上次离开位置恢复执行
可以用生成器来完成的操作同样可以用于基于类的迭代器来完成. 但是生成器的写法更为紧凑,因为他们会自动创建 iter()和 next()方法,另一个关键特性在于局部变量和执行状态会在每次调用之间自动保存.这使得该函数比使用类的实例变量更易编写且清晰。当生成器自动终结的时候。他会自动抛出异常。这些特性结合在一起,使创建迭代器能让编写常规函数一样简单