生成器函数

yield 与 return的区别

共同点:执行这句话都会返回值

不同点:return直接终止函数,下次从头调用

     yield 每次返回时,会记录当前执行位置,下次调用生成器,会从上一次记录位置开始执行

生成器函数语法:

def mygen():

  print('one')

  yield 1

  print('two')

  yield 2

gen = mygen() 

print(next(gen))

 

优化写法:

def mygen()

  for i in range(1,101):

    yield '新球员的号码为{}'.format(i)

gen = mygen()

调用:

for i in range(1,30):

  print(next(gen))

 

send 语法的使用

next:只能取值

send:不但能取值,还能发送值

def func():

  print("----start----")

  res = yield 111

  print(res)

 

    res = yield 222

 

  print(res)

 

   res = yield "444"
   print(res)

  print("----end----")

gen = mygen()        #初始化生成器

res = gen.send(None)    # 第一次发送,无脑加none
print(res)         # ----start----  111

 

res = gen.send("我来了2222")

print(res)         # 我来了2222   222

 

yield from 的基本使用

将一个可迭代对象变成一个迭代器返回

 

def mygen():
  yield from [1,2,3,4,5]

 

 

gen = mygen()
print(next(gen))
print(next(gen))

 

 

经典练习:

斐波那契数列

""" 1 , 1 , 2 , 3 ,5 ,8 ,13,21 ,34,55 ...  """

def fib(max):
a,b = 0 , 1
i = 0
while i < max:
# print(b)
yield b
a,b = b,a+b
i += 1
gen = fib(50)
for i in range(50):
print(next(gen))

  

posted @ 2021-04-13 09:21  你也想起舞吗ovo  阅读(49)  评论(0)    收藏  举报