yield关键字

最近练习Python,碰到了yield关键字,网上找信息看了一堆,感觉云里雾里,举的例子也是一点不明了。所以用自己的理解来举例子。

含有yield关键字的函数返回一个生成器,这个生成器一次性的,可迭代的。可以按需取用其中元素。

含有关键字yield的函数的执行方式

函数的执行也是每次调用函数的时候执行到yield关键字,下此调用的时候再从上次中断的地方继续往后执行。如:

def create_generator():
    print('来到函数')
    for i in range(10):
        print(f'来到循环, i的值为{i}')
        yield i**2
        print(f'回到循环, i的值为{i}')
        print('-'*10)


mygenerator = create_generator()

for k in range(4):
    print(next(mygenerator))
    print(f'回到调用, k的值为{k}')

输出结果是

来到函数
来到循环, i的值为0
0
回到调用, k的值为0
回到循环, i的值为0
----------
来到循环, i的值为1
1
回到调用, k的值为1
回到循环, i的值为1
----------
来到循环, i的值为2
4
回到调用, k的值为2
回到循环, i的值为2
----------
来到循环, i的值为3
9
回到调用, k的值为3

使用yield生成器可以产生含有10个元素的可迭代对象,通过next()逐个取用,我只取了其中4个。通过i的取值以及打印的内容可以看到函数中断执行的地方。最后一次调用的时候,因为没有下一次了,生成器中yield后面两个print语句没有执行。

与return比较:

  1. return返回是一个int,无法使用next(),会出现错误TypeError: 'int' object is not an iterator。故:
def create_generator():
    for i in range(10):
        return i**2


mygenerator = create_generator()

for i in range(4):
    print(mygenerator)

输出:

0
0
0
0
  1. 同一个循环块中return后面的语句是不执行的
def create_generator():
    print('来到函数')
    for i in range(10):
        print(f'来到循环, i的值为{i}')
        return i**2
        print(f'回到循环, i的值为{i}')  # 此行和下一行语句在解释器里面是灰色的
        print('-'*10)


mygenerator = create_generator()

for i in range(4):
    print(mygenerator)

输出:

来到函数
来到循环, i的值为0
0
0
0
0