首页 > 编程语言 > 详细

python学习之关于生成器的学习

时间:2021-01-17 19:27:19      阅读:20      评论:0      收藏:0      [点我收藏+]

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_方法一次只可以运行一行,如果数据多多么麻烦啊。

可采用我们之前学习的循环方法。

技术分享图片

 

python学习之关于生成器的学习

原文:https://www.cnblogs.com/lianqjie/p/14289767.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!