1.语法上:和函数类似,都用def定义。

      只不过生成器通过yield可以返回多个值,并保存状态;函数用return返回一个值,遇见return就结束了。

2.自动生成迭代器协议。

3.状态挂起:生成器使用yield语句返回一个值,yield语句挂起生成器函数的状态,以便之后从他挂起的地方继续执行。

 

优点1:延迟计算,一次返回一个值,不会一次生成所有的结果,因此不会卡逼,处理大数据时很有用

print(sum([i for i in range(100)]))    #先创立一个列表,会占据很大内存
print(sum((i for i in range(100))))    #不用创建列表,几乎不占内存(生成器的形式)

优点2:增强代码的可读性,使代码更简洁

(补充:从文件里提取出来的全是字符串的格式,需要通过eval函数将字符串中 包含的类型转换过来)

求一个文档中,各省市人口占总人口的比例

step1:求总人口

{"loc":"hebei","pop":100000}
{"loc":"henan","pop":200000}

  

#丑陋的 方法
f=open("a.txt","r",encoding="utf-8")
def yxz():
    res=0
    for p in f:
        p_dic=eval(p)
        res+=p_dic["pop"]
    return res
all_pop=yxz()
print(all_pop)

  

#帅气的 方法
all_pop=sum(eval(i)["pop"] for i in f)           #关键是:文件也可以用for循环进行遍历,每一次遍历取一行的内容,注意是字符串的形式,需要进行转换
print(all_pop)                     #eval(i)是将这一行转换成字典,然后再取pop,取出key值,利用sum相加

  👆👆👆👆👆👆👆👆这样就将总人口