博主辛苦了,我要打赏银两给博主,犒劳犒劳站长。
【摘要】在 python 3 中 yield 运用比较广泛,但是这个 yield 概念是不好理解的,我也是看了些许文档,运行了若干程序后才领悟出来了,本文就关于 yield 概念在自己的理解下通过代码示例进行概括、总结。
在 python 3 中任何使用 yield 的函数都称之为生成器。以下的话,直接给出示例,大家通过多动手去慢慢的理解。
注意:yield i 含义和 return i 相似。
例子 1 :
# 生成器实际上是每一次都在调用 .__next__() , 每调用一次 .__next__(), 就返回 yield 后面的值,等价于 return
def test():
print('first')
yield 1 # 第一次进入, 先输出 first ,然后返回 1
print("second")
yield 10 # 第二次进入, 先输出 second ,然后返回 10
print("three") # 第三次进入, 先输出 three , 但是没有找到 yield 返回的句子, 所以会报错
t = test()
v = t.__next__() # 第一次进入, 输出 first , v = 1
v = t.__next__() # 第二次进入, 输出 second , v = 10
v = t.__next__() # 第三次进入, 输出 three , 然后报错
例子 2 :
# 使用 .send() 向生成器发送信息, .send(None) 等价于 .__next__()
def test():
print("a")
m = yield 1 # 第一次进入,先输出 a , 然后返回 1, 这里 m 接收下一次进入时 send() 传入的值
print(m)
print("b")
n = yield 2 # 第二次进入, 先执行 print(m) ,然后执行 print("b"), 最后返回 2
print(n)
print("c")
# 第三次进入,先执行 print(n) ,然后执行 print("c"), 由于找不到 yield 返回的句子, 最后会报错
c = test()
v = c.send(None) # v = 1
v = c.send("hello") # v = 2
v = c.send("world") # 没有返回值,报错
例子 3 :
# 在 yield 中含有 return 关键词时,其作用是中止生成器
def test():
print("hello")
m = yield 1
print(m)
n = yield 2
print(n)
return
print("you")
yield 3
c = test()
v = c.send(None) # 第一次进入, 输出 hello, v = 1
print(v)
v = c.send("world") # 第二次进入, 输出 world, v = 2
print(v)
v = c.send("welcome") # 第三次进入, 输出 welcome , 遇到 return ,则直接被终止,报错提示为:··· StopIteration
print(v)
例子 4 :
# 一般都不会手动调用 .__next__() 方法来访问,这样就可以避免在不知道 yield 有多少次返回时,最后出现如上报错的问题
def count(n):
while n > 0:
# 迭代器返回 n
yield n
# 下一次迭代器开始的位置
n = n - 1
c = count(5)
for i in c:
print(i)
相信通过以上 4 个例子就能够从总体上去知道了 yield 生成器的用法了,接来下通过 yield 来实现斐波那契数列。
def fibonacci():
a = b = 1
yield a # 第一次进入, 返回 1
yield b # 第二次进入, 返回 1
while True:
a,b = b,a + b
yield b # 第 i 次进入, 返回 a + b 的值
f = fibonacci()
c = 1
for i in f:
print('第',c,'个数的值是:',i)
c += 1
# 输出前 10 个数的值
if c > 10:
break
最后在给出一个根据空格切割字符串的生成器,完整代码如下:
def split_by_split_blank_space(s):
if s is None:
return None
if not isinstance(s, str):
return None
slen = len(s)
if slen == 0:
return None
start = 0
index = 0
while index < slen:
if s[index] == " ":
if start < index:
yield s[start:index]
index = index+1
start = index
continue
index = index + 1
if start < slen:
yield s[start:]
result = split_by_split_blank_space("a b c d")
for i in result:
print(i) # 依次输出 a b c d
yield 的出现主要是为了解决系统资源,避免一些不必要的内存占用。
版权归 马富天PHP博客 所有
本文标题:《yield 介绍以及运用示例【python 3】》
本文链接地址:http://www.mafutian.net/409.html
转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^
顶0
踩0
评论审核未开启 |