a=[0,1,2,3,4,5,6,7,8,9]
print("此处输出的是手写列表",a)
b=a[0:4]
print("此处输出的是手写列表的切片展示",b)
#这个是列表生成
c=[i+1 for i in range(10)]
print("此处输出的的列表生成的的切片展示",c)
d=c[0:5]
print(d)
#这就是生成器
e=(i+2 for i in range(10))
print("此处输出的是生成器",e)
print(e.__next__())
上面代码输出结果为
此处输出的是手写列表 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
此处输出的是手写列表的切片展示 [0, 1, 2, 3]
此处输出的的列表生成的的切片展示 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5]
此处输出的是生成器 <generator object <genexpr> at 0x000001785D52C7D8>
2
上边就是从列表到生成器的变化过程。
为什么print(e)
的结果是一个地址呢。
因为在这个地方储存了一个算法,就是自动加以的算法。
生成器不是列表是一个过程,一个还没有开始的过程。
不能像列表一样可以直接切片提取。
操作方法也只有一个“__next__”,即下一个计算。
def fib3(max): x=1 y=0 z=0 while z<max: print(x) y,x= x,x+y z+=1 return "脱离" fib3(10) print("===========") def fib4(mac): a=1 b=0 c=0 while c<mac: yield a b,a= a,a+b c+=1 return "脱离" f=fib4(10) print(fib4(10)) f.__next__() f.__next__() f.__next__() print(f.__next__())
从上面代码中可以看到,一个函数如果将输出print改为yield那么这个函数就变成了一个发生器,也没有了函数的功能和特性了。
但是函数的计算方法被完整的保留下来。
并且可以通过_next_方法一个个的读取下一个数据。
代码的运行结果为
1 1 2 3 5 8 13 21 34 55 =========== <generator object fib4 at 0x00000214A618C7D8> 3
由此可以看出_next_方法一次只可以运行一行,如果数据多多么麻烦啊。
可采用我们之前学习的循环方法。
原文:https://www.cnblogs.com/lianqjie/p/14289767.html