2018/11/16(python(迭代器与生成器))
Posted 2018-1025
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018/11/16(python(迭代器与生成器))相关的知识,希望对你有一定的参考价值。
1.迭代----每次结果都是基于上一个结果
2.迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下项,要么就引起一个stoplteration异常,以终止迭代(只能往后走,不能往前看)
3.可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__
x=‘helloworld‘ x_t=x.__iter__() #遵循迭代器协议,生成可迭代对象 print(x_t.__next__()) print(x_t.__next__()) print(x_t.__next__()) #for循环实质 for i in x: print(i)
生成器
可以理解为一种数据类型,他自动实现了迭代器协议,(其他数据类型需要调用自己内置的_iter_),所以生成器就是可迭代对象。
两种形式:
1.生成器函数----使用yield语句而不是return。(yield一次返回一个结果,在每个结果中间,挂起函数状态,以便下次从离开他的地方继续执行。)
def test(): yield 1 yield 2 yield 3 g=test() print(g) print(g.__next__()) print(g.__next__())
2.类似列表推导。
# encoding:utf-8 l=[‘课程%s‘%i for i in range(10)] #列表解析你,缺点太占用内存 print(l)
#生成器表达式 n=(‘课程%s‘%i for i in range(10)) #将列表解析[]改为() print(n) print(n.__next__()) print(n.__next__()) print(n.__next__())
三元表达式
name=‘alex‘ result=‘woman‘ if name==‘alex‘ else ‘man‘ print(result)
m=[‘课程%s‘%i for i in range(10) if i>5] #三元多项式 print(m)
def T(): for i in range(100): print(‘第%s轮‘%i) yield i print(‘第%s轮结束‘%i) t=T() x=t.__next__() print(x) #好处中间可以加代码 t.__next__()
实际应用
人口文档内容 {‘province‘:‘北京‘,‘population‘:2000000} {‘province‘:‘天津‘,‘population‘:1000000} {‘province‘:‘南京‘,‘population‘:3000000} {‘province‘:‘山东‘,‘population‘:1000000} {‘province‘:‘山西‘,‘population‘:2000000} #代码 def fun(): with open(‘人口‘,‘r‘,encoding=‘gbk‘) as f: for i in f: p=eval(i) yield p[‘population‘] def fun2(): s=0 with open(‘人口‘,‘r‘,encoding=‘gbk‘) as f: for i in f: p=eval(i) s+=p[‘population‘] return s data=fun() s=fun2() data_1=data.__next__() print(data_1/s) data_2=data.__next__() print(data_2/s) data_3=data.__next__() print(data_3/s) data_4=data.__next__() print(data_4/s) data_5=data.__next__() print(data_1/s)
实现程序单线程并发
import time def consum(name): print(‘我是%s,我开始吃包子了‘%name) while True: baozi=yield 1 time.sleep(1) print(‘%s很开心的把%s吃了‘%(name,baozi)) def product(): c1=consum(‘wupeiqi‘) c2=consum(‘bob‘) c1.__next__() c2.__next__() for i in range(5): time.sleep(1) c1.send(‘包子%s‘%i) #把包子x传给baozi,必须传一个参数 c2.send(‘包子%s‘%i) product()
x=‘helloworld‘
x_t=x.__iter__() #遵循迭代器协议,生成可迭代对象
print(x_t.__next__())
print(x_t.__next__())
print(x_t.__next__())
#for循环实质
for i in x:
print(i)
以上是关于2018/11/16(python(迭代器与生成器))的主要内容,如果未能解决你的问题,请参考以下文章