python中的生成器

Posted 无荨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中的生成器相关的知识,希望对你有一定的参考价值。

什么是生成器?

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

eg:

def bar():
l = [‘a‘,‘b‘,‘c‘]
for i in l:
yield i
res = bar()
for i in res:
print(i)
>>> a
>>> b
>>> c
def test():
list=[]
for I in range(10):
list.append(i)
i+=1
return list
res=test()
print(res)
>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

def test():
for i in range(6):
yield i
res=test()
for i in res:
print(i)
>>> 0
>>> 1
>>> 2
>>> 3
>>> 4
>>> 5

总结:

  • 生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。
  • 生成器不仅“记住”了它数据状态;生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。
  • 只要函数里有yield关键字,那么函数名()得到的结果就是生成器,并且不会执行函数内部代码
  • yield可以返回多个值,并且同一时间内存里值存储一个值,只能向后取值,不能向前取值

生成器的特点:
  1、节约内存
  2、迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的

 

以上是关于python中的生成器的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

postman 自动生成 curl 代码片段

postman 自动生成 curl 代码片段

Python代码阅读(第13篇):检测列表中的元素是否都一样

在PaddlePaddle中的Notebook代码片段

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )(代码片段