本文转载自微信公众号《小菜学编程》,作者fasionchan。转载本文请联系小彩雪编程公众号。基本用法我们知道函数体中包含yield关键字的函数不是普通函数。这种函数称为生成器(generator),一般用于循环处理结构,应用得当可以大大优化内存使用效率。例如,设计一个打开文件并将每一行转换为大写并返回的函数:defread_file_upper(path):lines=[]withopen(path)asf:forlineinf:lines.append(line.upper())returnlines这个版本的函数内部会创建一个列表对象来保存转换结果。for循环遍历文件的每一行,将其转换为大写并将其附加到列表中。这样,文件中的每一行都需要保存在列表中。如果文件很大,内存开销可想而知。我们可以借助yield关键字将read_file_upper函数变成生成器版本。函数主体逻辑没有变化,只是将每一行数据的处理结果通过yield逐一返回,而不是收集list对象再返回。defiter_file_upper(path):withopen(path)asf:forlineinf:yieldline.upper()如果现在有一个文本文件data.txt,其中包含以下内容:hello,worldlifeisshort,usepythonmywechatidis:coding-fanbye使用iter_file_upper生成器,我们可以这样做处理它:>>>forlineiniter_file_upper('text.txt'):...print(line.strip())HELLO,WORLDLIFEISSHORT,USEPYTHONMYWECHATIDIS:CODING-FANBYEiter_file_upper生成器用法与read_file_upper函数大致相同,但它不会一次Hold住文件的所有数据行,而是逐行处理,逐行返回,这样内存占用最小。行为观察那么,生成器为什么会有如此神奇的效果呢?我们观察一下:>>>g=iter_file_upper('text.txt')>>>g
