只要含有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)