生成器,迭代器-人口普查

 

 

当遇见yield,就停止并且返回一个值,保留当前的状态,当触发下一次的时候再开始从中指的时候运行
def test():
yield 1
yield 2
yield 3
yield 4
res=test()
print(res) test()函数运行,得到了一个生成器对象
"D:\pycharm new project\venv\Scripts\python.exe" "D:/pycharm new project/01"
<generator object test at 0x0000020C87AA0200>

print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())
"D:\pycharm new project\venv\Scripts\python.exe" "D:/pycharm new project/01"
1
2
3
4

这种方式一次做了10个包子
def product_baozi():
ret = []
for i in range(10):
ret.append("包子%s"%i)
return ret
baozi_list = product_baozi()
print(baozi_list)
"D:\pycharm new project\venv\Scripts\python.exe" "D:/pycharm new project/01"
['包子0', '包子1', '包子2', '包子3', '包子4', '包子5', '包子6', '包子7', '包子8', '包子9']

这种方式,每次生成一个包子,一但遇到yiled,就停止,遇见__next__再开始,可以在next中间做其他的操作
def product_baozi():
for i in range(10):
yield("包子%s"%i)
baozi_list = product_baozi()
print(baozi_list.__next__())
print(baozi_list.__next__())
print(baozi_list.__next__())
"D:\pycharm new project\venv\Scripts\python.exe" "D:/pycharm new project/01"
包子0
包子1
包子2

生成器总结:
语法上和函数类似:生成器函数和常规函数几乎是一样的,他们都使用def语句定义,差别在于,生成器使用yield语句返回一个值,
而常规函数使用return语句返回一个值
自动实现迭代器协议:对于生成器,python会自动实现迭代器协议,以便应用到迭代器背景中(for循环,sum函数)由于生成器自动
实现了迭代器协议,所以可以调用他的nexit方法,并且,在没有值可以返回的时候,生成器自动产生Stopleration
状态挂起:生成器使用yield语句返回一个值,yiled语句挂在该生成器的函数,保留足够的信息,以便之后从他离开的地方执行
注意事项:生成器只能遍历一次

优点一:生成器好处是延迟计算,一次返回一个结果,也就是说,他不会一次生成所有的结果,这对于大数据量处理
优点二:生成器还能有效的调高代码可读性

人口文件:
{'name':'北京','population':10}
{'name':'山东','population':1000000}
{'name':'山西','population':31}
{'name':'河北','population':3110330000}
{'name':'台湾','population':311030330}

方法一:
def get_population():
with open("人口普查",'r') as f:
for i in f:
yield i 生成一个迭代器
g=get_population() 将可迭代对象赋值

res=0
for p in g:
p_dic=eval(p) 因为读取的文件是字符串类型的,所以必须用eval()提取里面的类型
print(p_dic['population'])
res+=p_dic['population']
print(res)
"D:\pycharm new project\venv\Scripts\python.exe" "D:/pycharm new project/01"
10
1000000
31
3110330000
311030330
3422360371

方法二:(简单)
def get_population():
with open("人口普查",'r') as f:
for i in f:
yield i
g=get_population()

all_pop=sum(eval(i)['population'] for i in g) 用sum里面的可迭代对象方法相加
print(all_pop)
"D:\pycharm new project\venv\Scripts\python.exe" "D:/pycharm new project/01"
3422360371

posted @ 2018-05-05 18:24  夏天的麦田  阅读(124)  评论(0)    收藏  举报