码迷,mamicode.com
首页 > 编程语言 > 详细

2018/11/16(python(迭代器与生成器))

时间:2018-11-17 23:17:33      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:%s   应用   for循环   sleep   山东   需要   pen   pre   列表   

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(迭代器与生成器))

标签:%s   应用   for循环   sleep   山东   需要   pen   pre   列表   

原文地址:https://www.cnblogs.com/2018-1025/p/9976076.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!