对比 yield和return 的区别

328 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 目录

区别

 1 使用yield关键字

运行结果

2 生成器使用return关键字 

运行结果


区别

  • 使用了yield关键字的函数不再是函数,而是生成器。(使用了yield的函数就是生成器)
  • 代码执行到yield会暂停,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行
  • 每次启动生成器都会返回一个值,多次启动可以返回多个值,也就是yield可以返回多个值
  • return只能返回一次值,生成器里面使用return关键字语法上没有问题,代码执行到return语句就停止迭代,抛出停止迭代异常

 

 1 使用yield关键字

def fibonacci(num):
    a = 0
    b = 1
    # 记录生成fibonacci数字的下标
    current_index = 0
    print("01")
    while current_index < num:
        result = a
        a, b = b, a + b
        current_index += 1
        print("02")
        # 代码执行到yield会暂停,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行
        yield result
        print("03")


fib = fibonacci(5)
value = next(fib)
print('-0-', value)
value = next(fib)
print('-1-', value)
value = next(fib)
print('-2-', value)

for value in fib:
    print('--for-', value)

运行结果

 

2 生成器使用return关键字 

def fibonacci(num):
    a = 0
    b = 1
    # 记录生成fibonacci数字的下标
    current_index = 0
    print("1")
    while current_index < num:
        result = a
        a, b = b, a + b
        current_index += 1
        print("2")
        # 代码执行到yield会暂停,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行
        yield result
        print("3")
        return 'fibonacci return'


fib = fibonacci(5)
value = next(fib)
print(value)

try:
    value = next(fib)
    print(value)
except StopIteration as e:
    # 获取return的返回值
    print(e.value)

运行结果