当你突然看到别人的代码中出现了一个好像见过但又没用过的关键词 比如 yield ,你是否会觉得这段代码真是高大上呢?
或许只有我这种小白才会这样子觉得,就在刚刚,我就看见了别人的代码中的yield,觉得新奇的同时,又感叹自己太无知,但毕竟我也不是那种规规矩矩学写代码的人,遇上不懂的,咱就学咯。
于是先上网易有道词典搜一下这个单词的意思
额。。。那在代码中应该是产生的意思较为准确了。
我尝试在编辑器中使用yield,报错了,说是得再函数中使用
那就来定义一个函数,再调用它好了
def test():
yield "iloveyou"
test()
并没有打印出iloveyou 字符串,反而是返回了一个生成器对象
生成器是啥呢?
百度一下生成器的概念,简而言之就是,含有yield的函数的称为生成器,生成器也是一个迭代器,我是这么理解的,生成一个迭代器。
下面用一个例子来阐述为何要用到yield 的生成器。
假如此时我想要得到一个列表,那么我可以定义一个函数来生成一个自然数列表
def getList(num):
l = []
for i in range (0,num):
l.append(i)
return l
result = getList(1000)
此时,result 就是一个长度为1000的自然数列表了
那么当我要对这个列表中的数据做处理的时候,我还要再次用for 循环遍历这个列表
for i in result:
pass
如果说这个列表很长很长的话,存储起来就很消耗内存了,此时如果用 生成器 生成一个迭代器,运行时才生成值,保存在内存中永远都是一个常数,相比起存储一个列表,存储空间大大减小。
那么上述的函数可以改写为如下的函数
def getGenerator(num):
for i in range (0,num):
yield i result = getGenerator(1000)
next(result)
result 为生成器结果,用next来得到迭代器中的下一个元素,
也可用for循环来遍历输出每个元素
for i in result:
print(i)
用next来得到迭代器中的下一个元素,直到迭代器中的元素遍历完,会抛出一个StopIteration 停止迭代的错误。生成器中的元素只能访问一次。不像for循环,可以随时访问第几个元素。
而用for循环遍历却不会抛出该异常,是因为for循环自动捕捉到该异常,停止调用next()
总结了一下,想处理大量集合数据时,最好是使用迭代器来操作,不耗内存。