2018-05-14 关于yield的入门级理解

书写代码如下:


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数据。

——————以上

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容