python3 生成器

只要含有yield关键字的都是生成器函数。

yield不能和return共用,且需要写到函数内,yield和return共同点在于都可以把后面跟的值返回给函数外部,但是return会结束一个函数,yield则不会,且一个函数中只能有一个return,但可以有多个yield。

def hello():
    print(1)
    yield 'a'
    print(2)
    yield 'b'
    print(3)
    yield 'c'
    print(4)
    yield 'd'
    print(5)
    yield 'e'

h = hello()
h.__next__()
h.__next__()
h.__next__()
h.__next__()
h.__next__()

 

生成器函数执行后会得到一个生成器作为返回值,因为生成器中既有__iter__方法,也有 __next__方法,所以生成器也是一个迭代器,但迭代器不一定是生成器。

生成器和迭代器共同特点:记住当前执行到哪一步以及下一步该走哪,随时可以取下一个值。

含有yield关键字的即是生成器函数,特点是:
1.调用函数后不执行会返回一个生成器。
2.每次调用next方法的时候会取到一个值,直到取完最后一个,再执行next则会报错。

从生成器取值的方法:next、for、数据类型强制转换(dict、str、int等不可)。

def hello():
    print(1)
    yield 'a'
    print(2)
    yield 'b'
    print(3)
    yield 'c'
    print(4)
    yield 'd'
    print(5)
    yield 'e'

h = hello()
h.__next__()
h.__next__()
h.__next__()
h.__next__()
h.__next__()





def hello():
    print(1)
    yield 'a'
    print(2)
    yield 'b'
    print(3)
    yield 'c'
    print(4)
    yield 'd'
    print(5)
    yield 'e'

h = hello()
for i in h:
    print(i)





def hello():
    print(1)
    yield 'a'
    print(2)
    yield 'b'
    print(3)
    yield 'c'
    print(4)
    yield 'd'
    print(5)
    yield 'e'

h = hello()
li = list(h)
print(li)

 

send可以在获取下一个值的时候给上一个yield的位置传递一个数据。

def hello():
    print(1)
    cont = yield 'a'
    print(cont)
    cont = yield 'b'
    print(cont)
    cont = yield 'c'
    print(cont)
    cont = yield 'd'
    print(cont)
    yield 'e'

h = hello()
h1 = h.__next__()
print(h1,'\n~~~~~~~~~~~~~\n\n')
ret = h.send('hello1')
print(ret,'\n~~~~~~~~~~~~~\n\n')
ret = h.send('hello2')
print(ret,'\n~~~~~~~~~~~~~\n\n')
ret = h.send('hello3')
print(ret,'\n~~~~~~~~~~~~~\n\n')
ret = h.send('hello4')
print(ret,'\n~~~~~~~~~~~~~\n\n')

使用send的注意事项:
1.第一次使用生成器时,是用next获取下一个值。
2.最后一个yield不能接受外部的值
3.需要返回值的单个元素时,直接使用yield from 即可。

def hello():
    print(1)
    cont = yield 'a'
    yield cont

h = hello()
h1 = h.__next__()
print(h1,'\n~~~~~~~~~~~~~\n\n')
ret = h.send('hello1')
print(ret)






def hello():
    print(1)
    cont = yield 'a'
    yield from cont

h = hello()
h1 = h.__next__()
print(h1,'\n~~~~~~~~~~~~~\n\n')
ret = h.send('哈哈')
print(ret)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值