码迷,mamicode.com
首页 > 其他好文 > 详细

生成器、迭代器

时间:2019-02-16 12:01:44      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:创建   __next__   def   count   %s   turn   遍历   produce   赋值   

列表生成式:

a=[x for x in range(10)]
b=[x*2 for x in range(10)]
def f(n):
    return n**3
c=[f(x) for x in range(10)]
print(a,\n,b,\n,c)

一种简单赋值法:

t=[12,f,4]   #元组、列表都可以
a,b,c=t
print(a,b,c)

生成器的两种创建方式:

方式一:

s=(x for x in range(10)) #创建一个生成器
print(s)
print(next(s)) #调用range中内容的方法,等价于‘print(s.__next__())‘
print(next(s)) #再生成一个元素
for i in s:     #生成器s是一个可迭代对象,可遍历
    print(i)

 方式二:

def foo():
    print(ok)
    yield 1
    print(ok2)
    yield 2
    return None
foo()            #程序不会被执行,因为foo()此时是一个生成器对象
print(foo())      #打印的是生成器对象的地址
g=foo()
a=next(g)      #通过‘next(foo)‘调用生成器对象,此时‘next(foo())‘会收到yield的返回值1
b=next(g)       #再一次执行的是yield 2对应的代码
print(a,b)
for i in foo():    #for循环其实是通过‘next(foo())‘进行的,‘next(foo())收到yield的返回值并赋给i‘
    print(i)
next方法说明:1.用next进入生成器,执行代码遇到yield时退出
2.再一次next进入时,从上次yield之后的一行开始执行,直到再遇到yield时退出
3.以此循环往复

用生成器打印Fibonaccci数列:

def fib(max):
    n,before,after=0,0,1
    while n<max:
        yield before    #把before值返回给生成器对象
        before,after=after,before+after  #先计算before+after,在进行两个赋值
        n+=1
g=fib(8)        #fib(8)是一个生成器对象
print(g)
print(next(g))
print(next(g))
print(next(g))
print(next(g))

生成器对象的send方法:

def bar():
    print(ok1)
    count=yield 1
    print(count)
    print(ok2)
    yield 2
b=bar()
#h=next(b)       #调用send之前得先用next方法进入生成器bar()
s=b.send(None)    #或者send一个None,等价于next(b)
k=b.send(dj)
print(s,k)
send方法说明: 1.send方法类似于next:(1)也能进入生成器;(2)第二次进入也是接着上次的地方执行
                         2.区别在于:send进入时会带一个值给到count,但第一次进入时只能传一个空值由于生成器中yield和send方法的作用,两段代码交替执行,实现伪并发

伪并发的一个例子:

由于生成器中yield和send方法的作用,两段代码交替执行,实现伪并发

 

import time
def consumer(name):
    print(%s:老板,上包子! %name)
    while True:
        x = yield
        print(小二:第%s笼包子来喽,客官请慢用%x)
        print(%s:吃完了,再上%name)

def producer(name):
    c1=consumer(A)
    next(c1)
    print(%s:好嘞!%name)
    print(%s开始做包子...%name)
    for i in range(5):
        time.sleep(1)
        print(...过了一会,老板做出来一笼包子)
        c1.send(i+1)
producer(老板)

 

 

 

 

生成器、迭代器

标签:创建   __next__   def   count   %s   turn   遍历   produce   赋值   

原文地址:https://www.cnblogs.com/Finance-IT-gao/p/10387104.html

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