python3中的yield用法
yield跟return用法相似,yield返回迭代器,遍历返回的迭代器时,程序先截止于yield,下次遍历会接着上次程序同级继续运行,并在最后一次遍历不会在yield截止程序,会继续运行;return返回某个值,程序不再往下运行。
首先来看一段不含yield的代码:
class yield_test(object):
def test1(self):
for i in range(5):
i += 1
print("now i is:",i)
# yield i
for test1_i in range(i):
print("i in test1 is:",test1_i)
return i
bb = yield_test()
# bb.test1()
print(bb.test1())
执行结果:
now i is: 1
i in test1 is: 0
now i is: 2
i in test1 is: 0
i in test1 is: 1
now i is: 3
i in test1 is: 0
i in test1 is: 1
i in test1 is: 2
now i is: 4
i in test1 is: 0
i in test1 is: 1
i in test1 is: 2
i in test1 is: 3
now i is: 5
i in test1 is: 0
i in test1 is: 1
i in test1 is: 2
i in test1 is: 3
i in test1 is: 4
5
Process finished with exit code 0
上面执行结果可以看到,没有yield时,程序内的for循环全部执行完成了,最后数字5是return返回的值。
再来看一段含yield的代码:
class yield_test(object):
def test1(self):
for i in range(5):
i += 1
print("now i is:",i)
yield i
for test1_i in range(i):
print("i in test1 is:",test1_i)
return i
bb = yield_test()
# bb.test1()
print(bb.test1())
print(next(bb.test1()))
执行结果:
<generator object yield_test.test1 at 0x7f376477cdb0>
now i is: 1
1
可以看到,这次的for循环只执行了yield i上面的语句就停住了,最后那个数字1是yield i返回的值,如果要后面的循环继续执行,需要从这个迭代器里面取出一个值,才能继续,就像下面这样:
class yield_test(object):
def test1(self):
for i in range(5):
i += 1
print("now i is:",i)
yield i
for test1_i in range(i):
print("i in test1 is:",test1_i)
# return i
bb = yield_test()
# bb.test1()
print(bb.test1())
# print(next(bb.test1()))
for i in bb.test1():
# print("now i is:",i)
continue
执行结果:
<generator object yield_test.test1 at 0x7fb29b28cdb0>
now i is: 1
i in test1 is: 0
now i is: 2
i in test1 is: 0
i in test1 is: 1
now i is: 3
i in test1 is: 0
i in test1 is: 1
i in test1 is: 2
now i is: 4
i in test1 is: 0
i in test1 is: 1
i in test1 is: 2
i in test1 is: 3
now i is: 5
i in test1 is: 0
i in test1 is: 1
i in test1 is: 2
i in test1 is: 3
i in test1 is: 4
Process finished with exit code 0