**
1,生成器
**
1,什么是生成器?
genterator,记录一个算法,可以一边循环一边计算的一种机制
2,列表推导式
更加耗时,更加开销系统内存
3,存储数据
实际上算法的存储
4,节约时间,节省内存开销
列表推导式的时间开销验证如下:
import time # 时间模块
import sys # 系统模块 可以计算变量在内存中所使用的内存开销 需要用到固定的方法去计算
time.clock()
list = [x for x in range(2, 1000000, 2)]
costTime = time.clock()
print("创建列表耗时%g" % costTime)
print("创建列表内存开销%d" % sys.getsizeof(list))
运行结果为:
创建列表耗时0.0590449
创建列表内存开销4290016
生成器推导式的时间开销验证如下:
import time # 时间模块
import sys # 系统模块 可以计算变量在内存中所使用的内存开销 需要用到固定的方法去计算
time.clock()
list = (x for x in range(2, 1000000, 2))
costTime = time.clock()
print("创建生成器耗时%g" % costTime)
print("创建生成器内存开销%d" % sys.getsizeof(list))
运行结果为:
创建列表耗时1.2402e-05
创建列表内存开销88
**
2,访问生成器元素的方式
**
生成器里面访问元素的第一种方式:for循环遍历
list = (x for x in range(2, 10, 2))
for i in list:
print(i)
运行结果为:
2
4
6
8
访问生成器中的元素的第二种方式:使用next方法访问
list = (x for x in range(2, 10, 2))
print(next(list))
print(next(list))
print(next(list)) # 需要注意的是:超出生成器生成数据的范围,会报错StopIteration
访问生成器中的元素的第三种方式:使用__next__方法访问
list = (x for x in range(2, 10, 2))
print(list.__next__())
print(list.__next__())
print(list.__next__())
运行结果为:
2
4
6
访问生成器中的元素的第四种方式:使用send()方法访问
list = (x for x in range(2, 10, 2))
print(list.send(None)) #注意: 对第一个参数有要求必须给None参数,后续的参数可以随便给
print(list.send("abc"))
print(list.send("efg"))
运行结果为:
2
4
6
**
3,创建生成器的方式
**
方式1:
(x for x in range(10)) # 外面的是 () 小括号它就是一个生成器 外面是 [] 中括号它就是一个列表推导式
方式2:yield 用在函数中
def test():
for x in range(5):
yield x
f = test()
print(type(f))
print(next(f))
print(next(f))
运行结果为:
<class 'generator'>
0
1