携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情
0 环境
- 编辑器:idea或vscode
- 系统版本:windows10
- python版本:3.9.6
1 前言
虽然前面文章提起过生成器,比如知道点生成器推导式或者生成器解析式这类的,但是生成器具体是个什么样子呢,接触过,但说不上来。下面让我们和生成器见一面。
2 生成器的定义
生成器用关键字 yield 来返回值,这种函数叫生成器函数,前面我们调用map函数时,会返回给我们一个生成器对象,它可以被for循环,得到其中每个元素,也能很好的说明它本质上也是个迭代器。
如下代码:我定义了gen函数,每次for循环,使用关键字yield定义 --> yield item,假如普通函数需要return,才能到值,但它不是返回的<generator object gen at 一串十六进制>
。它是可以使用next(result)调用,得到元素的。
def gen():
for item in range(8):
yield item
if __name__ == '__main__':
result = gen()
print(result)
print(next(result))
print(next(result))
我在用for循环result,结果如下。也就说yield会弹出一个值,不然我怎么知道结果的。这就和普通函数不同了,普通函数按行执行,执行完了,就被销毁了,但是这里的yield不太一样,专业说法就是它会保留现场,这也说得通,为啥我用next方法调用它,会有值了。
3 初探yield和return
这里我们会不自然的,拿yield和return比较,假如它们混用的话,return在啥情况下,会有效,啥时候会无效呢,先说个简单结论,当我们return在yield在下面,可以看作return是无效的,放在多yield的中间呢,如下图,第二个next方法,在yield 1后面继续执行,看到了return,直接返回抛出异常StopIteration,也就说明后面的yield是得不到了,你return后面写多个yield也是无济于补的,因为函数已经中止了。
4 总结
当我定义了一个函数,并且使用了yield关键, 当我们调用该函数的时候,返回对象就是一个生成器,然后for循环或next或者list(),获得相应的元素。