python生成器

python生成器是用来代替"不一定能够使用全部元素的数组",等到使用某一元素时,才生成该元素,用来节省空间.
python生成器写法有两种

第一种:(数组生成式的中括号变成小括号)

# 生成器
arr = (x for x in range(1,6))

# 生成器下一个元素用next()来取得
print("--next1--")
print(next(arr))

print("--next2--")
print(next(arr))

print("--next3--")
print(next(arr))

输出结果:

--next1--
1
--next2--
2
--next3--
3



第二种方式: 使用关键字 yield 关键字

# 斐波那契数列生成器
def creatNum():
    print("---开始执行生成器方法---")
    a,b = 0,1
    for i in range(0,5):
        print("--step1--")
        yield b
        print("--step2--")
        a,b = b,a+b
        print("--step3--")
    print("--..stop..--")

print("直接调用方法...")
print(creatNum())

#这里用一个标识符来指向生成器(不要把creatNum()当做函数)
func = creatNum()

#一次生成
print("使用next调用")
x = next(func)
print(x)

#又一次生成
print("使用next调用")
x = next(func)
print(x)

print("使用next调用")
x = next(func)
print(x)

输出结果:

直接调用方法...
<generator object creatNum at 0x102115f10>
使用next调用
---开始执行生成器方法---
--step1--
1
使用next调用
--step2--
--step3--
--step1--
1
使用next调用
--step2--
--step3--
--step1--
2

生成器还可以用 生成器.next 来调用,等价于 next(生成器)
如果使用next来调用,调用到生成器执行完毕,就会崩掉. 我们基本不会使用next来执行生成器
一般来说会用for循环来执行生成器:

# 斐波那契数列生成器
def creatNum():
    print("---开始执行生成器方法---")
    a,b = 0,1
    for i in range(0,5):
        print("--step1--")
        yield b
        print("--step2--")
        a,b = b,a+b
        print("--step3--")
    print("--..stop..--")

print("直接调用方法...")
print(creatNum())

#这里用一个标识符来指向生成器(不要把creatNum()当做函数)
func = creatNum()

#使用for循环来执行生成器
for i in func:
    print(i)

输出结果: (执行完毕不会崩溃)

直接调用方法...
<generator object creatNum at 0x101c30f10>
---开始执行生成器方法---
--step1--
1
--step2--
--step3--
--step1--
1
--step2--
--step3--
--step1--
2
--step2--
--step3--
--step1--
3
--step2--
--step3--
--step1--
5
--step2--
--step3--
--..stop..--

在执行生成器时,可以使用 生成器.send(param) 方法
send方法不光是执行一步next操作,还会把send里面的参数传到生成器中充当yield表达式的返回值
**(注意:第一次执行,send里面的参数应该为None,或者使用next方法)

def test():
    i = 0
    while i < 5:
        temp = yield i
        print(temp)
        i += 1

t = test()

#先使用next执行,看能出来什么结果
t.__next__()
t.__next__()
print(t.__next__())

#使用send执行
t.send("1231231231223123")
print(t.send("hahahahhahaha"))

输出结果: (可见next输出temp为none , 而send 则把值传递进了生成器)

None
None
2
1231231231223123
hahahahhahaha
4
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 作者:邵正将 来源:PytLab 在python中生成器可以很方便的实现迭代协议。生成器通过生成器函数产生,生成器...
    PyChina阅读 1,589评论 0 6
  • Python列表生成式 列表推导式的一般语法 这种语法等价于以下代码 下面举一些列表推导式的栗子: Python中...
    So_ProbuING阅读 1,311评论 0 0
  • 1.什么是生成器 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一...
    一只写程序的猿阅读 956评论 0 4
  • 什么是生成器?通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包...
    youngkun阅读 352评论 0 0
  • 一. 简介 我之前用过 CocoaPods,很大一部分原因就是因为麻烦,仅个人感觉,需要牵扯 XCode 项目文...
    coderTian阅读 727评论 3 2