书写代码如下:
list = []
def func():
dic = {}
for i in range(1,6):
dic[i] = i
yield dic
print('*****开始*****')
for i in func():
print(i)
list.append(i)
print('*****分隔*****')
print(i)
print('*****结束*****')
*****开始*****
{1: 1}
{1: 1, 2: 2}
{1: 1, 2: 2, 3: 3}
{1: 1, 2: 2, 3: 3, 4: 4}
{1: 1, 2: 2, 3: 3, 4: 4, 5: 5}
*****分隔*****
{1: 1, 2: 2, 3: 3, 4: 4, 5: 5}
'*****结束'*****
首先,yield用在def定义的函数中,执行函数也不会执行函数内的代码,要用next()命令才能使函数代码被执行并返回下一条迭代器元素,而用for循环遍历此函数,相当于执行了所有可执行的next()命令(要注意的是,next()命令超出可迭代次数会报错),此时函数内的代码会被执行(在次遍历中,被循环的是yield内容,函数依然执行一次)。
其次,yield返回的是一个迭代器类,与return不同。可以理解为可以循环的东西,故而后面用到了for i in func(),因为func()代表着yield返回值,也就是可以循环的迭代器。
再次,用for来遍历yield返回的可循环内容时,与普通的list等有很大不同,每一次都会把前面所有的遍历元素都带上,也就是循环得到的结果数量会从1到len(func())这样,越来越多,而不是只有1个结果,每个元素都单列出来。
最后,若在循环遍历yield的时候,用list来append,最终的list只会得到不重复的、所有yield中的元素,而不是通常理解中的,把每次遍历的结果都组合进去。可以利用这种方式,把dic和list组合起来,list.append(dic),来生成json数据。
——————以上