yield 介绍以及运用示例【python 3】

学习笔记 马富天 2019-02-27 18:38:51 4 0

【摘要】在 python 3 中 yield 运用比较广泛,但是这个 yield 概念是不好理解的,我也是看了些许文档,运行了若干程序后才领悟出来了,本文就关于 yield 概念在自己的理解下通过代码示例进行概括、总结。

在 python 3 中任何使用 yield 的函数都称之为生成器。以下的话,直接给出示例,大家通过多动手去慢慢的理解。

注意:yield i 含义和 return i 相似。

例子 1 :

  1. # 生成器实际上是每一次都在调用 .__next__() , 每调用一次 .__next__(), 就返回 yield 后面的值,等价于 return
  2. def test():
  3.     print('first')
  4.     yield 1 # 第一次进入, 先输出 first ,然后返回 1
  5.     print("second")
  6.     yield 10 # 第二次进入, 先输出 second ,然后返回 10
  7.     print("three") # 第三次进入, 先输出 three , 但是没有找到 yield 返回的句子, 所以会报错
  8. t = test()
  9. v = t.__next__() # 第一次进入, 输出 first , v = 1
  10. v = t.__next__() # 第二次进入, 输出 second , v = 10
  11. v = t.__next__() # 第三次进入, 输出 three , 然后报错

例子 2 :

  1. # 使用 .send() 向生成器发送信息, .send(None) 等价于 .__next__()
  2. def test():
  3.     print("a")
  4.     m = yield 1 # 第一次进入,先输出 a , 然后返回 1, 这里 m 接收下一次进入时 send() 传入的值
  5.     print(m)
  6.     print("b")
  7.     n = yield 2 # 第二次进入, 先执行 print(m) ,然后执行 print("b"), 最后返回 2
  8.     print(n)
  9.     print("c")
  10.     # 第三次进入,先执行 print(n) ,然后执行 print("c"), 由于找不到 yield 返回的句子, 最后会报错
  11. c = test()
  12. v = c.send(None) # v = 1
  13. v = c.send("hello") # v = 2
  14. v = c.send("world") # 没有返回值,报错
  1. 例子 3 :
  1. # 在 yield 中含有 return 关键词时,其作用是中止生成器
  2. def test():
  3.     print("hello")
  4.     m = yield 1
  5.     print(m)
  6.     n = yield 2
  7.     print(n)
  8.     return
  9.     print("you")
  10.     yield 3
  11. c = test()
  12. v = c.send(None) # 第一次进入, 输出 hello, v = 1
  13. print(v)
  14. v = c.send("world") # 第二次进入, 输出 world, v = 2
  15. print(v)
  16. v = c.send("welcome") # 第三次进入, 输出 welcome , 遇到 return ,则直接被终止,报错提示为:··· StopIteration 
  17. print(v)

例子 4 :

  1. # 一般都不会手动调用 .__next__() 方法来访问,这样就可以避免在不知道 yield 有多少次返回时,最后出现如上报错的问题
  2. def count(n):
  3.     while n > 0:
  4.         # 迭代器返回 n
  5.         yield n
  6.         # 下一次迭代器开始的位置
  7.         n = n - 1
  8. c = count(5)
  9. for i in c:
  10.     print(i)

相信通过以上 4 个例子就能够从总体上去知道了 yield 生成器的用法了,接来下通过 yield 来实现斐波那契数列。

  1. def fibonacci(): 
  2.     a = b = 1
  3.     yield a # 第一次进入, 返回 1
  4.     yield b # 第二次进入, 返回 1
  5.     while True: 
  6.         a,b = b,a + b 
  7.         yield b # 第 i 次进入, 返回 a + b 的值
  8. f = fibonacci()
  9. c = 1
  10. for i in f:
  11.     print('第',c,'个数的值是:',i)
  12.     c += 1
  13.     # 输出前 10 个数的值
  14.     if c > 10:
  15.         break

最后在给出一个根据空格切割字符串的生成器,完整代码如下:

  1. def split_by_split_blank_space(s):
  2.     if s is None:
  3.         return None
  4.     if not isinstance(s, str):
  5.         return None
  6.     slen = len(s)
  7.     if slen == 0:
  8.         return None
  9.     start = 0
  10.     index = 0
  11.     while index < slen:
  12.         if s[index] == " ":
  13.             if start < index:
  14.                 yield s[start:index]
  15.             index = index+1
  16.             start = index
  17.             continue
  18.         index = index + 1
  19.     if start < slen:
  20.         yield s[start:]
  21. result = split_by_split_blank_space("a b c d")
  22. for i in result:
  23.     print(i) # 依次输出 a b c d

yield 的出现主要是为了解决系统资源,避免一些不必要的内存占用。

版权归 马富天PHP博客 所有

本文标题:《yield 介绍以及运用示例【python 3】》

本文链接地址:http://www.mafutian.net/409.html

转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^

0

0

上一篇《 numpy 中 array() 和 matrix() 用法的关联与区别 》 下一篇《 [Err] 2006 - MySQL server has gone away 当 SQL 语句过长时报错的解决办法 》

暂无评论

评论审核未开启
表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情
验证码

TOP10

  • 浏览最多
  • 评论最多