import time

def func_y(data):
    time.sleep(data)
    return data * 2

def get_num(a):
    """
    普通return 函数
    """
    for i in range(a):
        return func_y(i)

def get_num2(a):
    """
    yield与return的区别是:
        1、 yield返回的是生成器,通过next来获取函数返回的值,而且可以用于循环中,并且一个函数就可以同时返回多个值
        2、如果使用return,那么就直接退出循环了,后面的代码将不会被继续执行
        3、如果yield的是函数,那么函数会在next取值的时候才会运行。
    """
    for i in range(a):
        yield func_y(i)

rt1 = get_num(3)  # return 0

rt2 = get_num2(3)  # 返回生成器

print(f'rt1: {rt1}')  # rt1: 0
print(f'rt2: {rt2}')  # rt2: <generator object get_num2 at 0x000002E93B2356D8>

# 获取生成器rt2结果
# 法一:直接for遍历
for i in rt2:
    print(i)

# 法二:while遍历
while True:
    try:
        print(next(rt2))
    except Exception as StopIteration:  # StopIteration异常,就说明生成器遍历完成
        break

## yield from,用于跳转到新的函数,或者用于代替循环
# 比如代替循环:下面两个函数功能等价
def func0(i):
    for x in range(i):
        yield x
def func0_2(i):
    yield from range(i)
f3 = func0(3)
for item in f3:
    print(item)
"""
0
1
2
"""

# 跳转到函数,类似于下面两个函数后面的输出结果
def func1():
    yield 1
    yield from func2()
    yield 2
def func2():
    yield 3
    yield 4
f1 = func1()
for item in f1:
    print(item)
"""
1
3
4
2
"""
posted on 2021-07-28 10:47  jaysonteng  阅读(39)  评论(0编辑  收藏  举报