博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 生成器
阅读量:5313 次
发布时间:2019-06-14

本文共 1672 字,大约阅读时间需要 5 分钟。

最近重新回忆了一下Python的生成器,下面给大家介绍一下

简单的说,生成器只有在调用的时候在会生成相应的数据,我们来看一个例子

a = []for i in range(10):    a.append(i)print(a)

运行结果如下:

 

其实,这么多行的代码我们可以使用列表生成式一行代码就可以搞定了如下:

>>> [ i*2 for i in range(10) ][0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

OK,那看到这,可能有人会问,有什么卵用呢?

好处当然是有滴,听我细说,首先列表生成器可以省内存
如果我们用一个列表存储很多数据,但我们可能用到的只是前面的一些数据,那么就会耗时耗力,那么对于有规律(后面的元素比前面的大一)的元素,就可以考虑列表生成式

>>> ( i*2 for i in range(10) )
at 0x0000020DFC10B888>

当我把中括号改为小括号时发现,其实列表生成式返回的是一个内存地址,那么我给它赋值看一下效果

>>> temp = ( i*2 for i in range(10) )>>> for i in temp:...     print (i)...024681012141618>>>

如果循环的数特别大,我们在看下效果

>>> temp = ( i*2 for i in range(10000000) )>>> for i in temp:...     print (i)...02468...5134513651385140Traceback (most recent call last):  File "
", line 2, in
KeyboardInterrupt>>> temp[1000]Traceback (most recent call last): File "
", line 1, in
TypeError: 'generator' object is not subscriptable

还没执行完,被我Ctrl+C中止了,中间省略了一些,然后我直接调用temp[1000],报错了,由此看出,生成器只有在调用的时候才生成,不调用的时候没有数据生成,那我怎么取数据呢?

只能调用__next__方法,如下:

>>> temp.__next__()5142>>> temp.__next__()5144>>> temp.__next__()5146

朋友们有没有发现一个问题,是接着我暂停的地方开始接着往下取的,那么问题来了,我能不能返回取上一个数据呢?答案是不行的,生成器只能不停的往下next

好的,相信你已经简单了解生成器了,但是这是有规律的表达式,要是没有规律的一些问题,例如,斐波那契数列问题,那可以使用函数实现

def fib(temp):    n, a, b = 0, 0, 1    while n < temp:        print(b)        a, b = b, a + b        n = n + 1fib(10)

此函数正常输出就是斐波那契数列的值,那现在我给他变成生成器

def fib(temp):    n, a, b = 0, 0, 1    while n < temp:        yield b        a, b = b, a + b        n = n + 1print(fib(10))

返回值为<generator object fib at 0x000001DE65F1EF10> 这样的内存地址,是不是很眼熟,这就是生成器了

 

转载于:https://www.cnblogs.com/cy666/p/11419539.html

你可能感兴趣的文章
opencv中的Bayes分类器应用实例
查看>>
大数据学习
查看>>
[BZOJ2982]combination
查看>>
简单工厂模式
查看>>
Delphi7编译的程序自动中Win32.Induc.a病毒的解决办法
查看>>
Objective-C 【关于导入类(@class 和 #import的区别)】
查看>>
倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-点击运行按钮进入到运行状态报错Error starting TwinCAT System怎么办 AdsWarning1823怎么办...
查看>>
【转】javascript 中的很多有用的东西
查看>>
Python中替换元素
查看>>
关于双核心:也许你不知道的五件事
查看>>
Trace 2018徐州icpc网络赛 (二分)(树状数组)
查看>>
让你的 Python 代码优雅又地道
查看>>
Centos7.2正常启动关闭CDH5.16.1
查看>>
Android 监听返回键、HOME键
查看>>
Android ContentProvider的实现
查看>>
jmeter里面Dug Sampler 和json提取器的用法
查看>>
sqlserver 各种判断是否存在(表名、函数、存储过程等)
查看>>
公司居然使用监听设备,大家来讨论下IT公司应该怎样管理
查看>>
一句简单的SQL----模糊 查询
查看>>
编程十年 (13):毁人不倦1
查看>>