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(迭代器与生成器))的主要内容,如果未能解决你的问题,请参考以下文章

Python3 迭代器与生成器

python之迭代器与生成器

python-迭代器与生成器1

python014 Python3 迭代器与生成器

python3 迭代器与生成器

Lesson 023 —— python 迭代器与生成器