生成器函数_yield_yield from_send

生成器函数

'''
yield类似于return

相同:
   都返回出去一个值

不同:
   yield每次返回时, 会记录当前执行的位置
   等下次调用生成器, 会从该位置向下走

   return 直接终止函数
'''


# 2. 生成器函数
def mygen():
   print('one')
   yield 1

   print('two')
   yield 2

   print('three')
   yield 3


# 创建生成器对象
gen = mygen()


# 使用next
res = next(gen)

'''
首先初始化生成器, 返回一个生成器对象

第一次调用: 执行print('one'), yield返回1, 
暂停记录当前位置

第二次调用: 执行print('two'), yield返回2,
暂停记录当前位置

第三次调用: 执行print('three'), yield返回3,
暂停记录当前位置, 

此时生成器已经不能在返回数据, 再次调用就会报错

'''

生成器写斐波那契数列?

def fbnq(max_len):
   a = 0
   b = 1

   i = 0
   while i < max_len:
      yield b
      a, b = b, a + b
      # yield a
      i += 1


gen = fbnq(10)
for i in gen:
   print(i)

send

'''
next和send的区别:
   next: 只能取值
   send: 能取本次yield的返回值, 
   也能给上次yield传入值.
   
send注意点:
   第一个send不能给yield传值, 默认写None
   最后一个yield接收不到send的发送值
'''
def mygen():
   print('start')
   res = yield 1
   print(res)

   # res是send第二次的传入值, yield把2返回给send
   res = yield 2
   print(res)

   res = yield 3
   print(res)


# 初始化生成器, 获得生成器对象
gen = mygen()

# 第一次调用, send传入None
yield_res = gen.send(None)
yield_res = gen.send('send1')
yield_res = gen.send('send2')
# 此时生成器已经没有数据, 再次调用就会报错
# yield_res = gen.send('send3')
# send和next可以混合使用
gen = mygen()
yield_res = gen.send(None)
yield_res = next(gen)
yield_res = next(gen)

yield from

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

def mygen():
   listvar = ["鼎泰亚", "李楠", "陈根基", "陈元勇"]

   yield from listvar


gen = mygen()

for i in gen:
   print(i)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 迭代、迭代器、生成器、协程、yield、greenlet、gevent、进程线程协程对比、gevent多任务图片下...
    Cestine阅读 3,385评论 0 0
  • 包(lib)、模块(module) 在Python中,存在包和模块两个常见概念。 模块:编写Python代码的py...
    清清子衿木子水心阅读 9,234评论 0 27
  • 昨天是我开始日更29天后的第二次断更,第一次是24天时,利用复活卡又捱过了几天,我又不想太凑合,所以终究还是断了。...
    酉时七若阅读 4,066评论 13 13

友情链接更多精彩内容