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
posted @ 2022-07-21 11:03  xzy186  阅读(448)  评论(0编辑  收藏  举报