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

011python路--生成器

时间:2018-10-16 20:20:34      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:return   next   [1]   number   name   生成   回收   列表   线程   

#列表生成式
a = [x*2 for x in range(10)]
a = [x*2 for x in a]

def f(n):
    return n+1
a = [f(x) for x in range(10)]
print(a)  #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

 

赋值
t= (12,8)#t= [‘12‘,8]
a,b= t
print(a)#12
print(b)#8 
等价于-
    a=t[0]
    b=t[1]

 

列表生成器
 1. s = (x*2 for x in range(5))
  print(s) #<generator object <genexpr> 

  print(next(s))# 尽量不用s.next()

  生成器就是一个可迭代对象iterable

  for i in s:  
      print(i)
  #内部有迭代器遍历。next过的元素无引用,将被回收

 

 

2. yield
   def foo():
      print("123")
      yield 1
   a = foo()
   print(a) #<generator object <genexpr> 

    ---------------------------
    def foo():
        print(ok)
        yield 1
        print(ok2)
        yield 2
    for i in foo():
        print(i)
    结果:ok
         1
         ok2
         2

    next(foo())
    next(foo())
    #next首先指向print,之后返回yield 1
    #不过没有变量接受,屏幕不显示

 

for i in +可迭代对象(列表,元组,字典,)
本质因为内部有_iter_()方法

斐波那契:
普通函数
def fid(number):
    n,before,after = 0,0,1
    while n<number:
        print(before)
        after,before = before,after+before#算出=后面结果再赋值
        n+=1
fid(5)

 

 

生成器对象--next
def fid(number):
    n,before,after = 0,0,1
    while n<number:
        yield before
        after,before = before,after+before
        n+=1

g = fid(8)
print(next(g))

for i in fid(8):
    print(i)

 

send
def bar():
    print(ok1)
    count=yield 1
    print(count)
    print(ok2)
    yield 2
g = bar()# 创建生成器对象
print(g.send(None))
print(g.send(eee))
# 结果:ok1
#    1
#    eee
#    ok2
#    2

# send与next的区别就是,send能给yield前面变量传值
# b.send(None)==next(b)

 

通过生成器yield实现伪开发

通过yield实现在单线程的情况下实现并发运算的效果  


import time
def consumer(name):
    print("%s 准备吃包子啦!" %name)
    while True:
       baozi = yield

       print("包子[%s]来了,被[%s]吃了!" %(baozi,name))


def producer(name):
    c = consumer(A)
    c2 = consumer(B)
    c.__next__()
    c2.__next__()
    print("老子开始准备做包子啦!")
    for i in range(10):
        time.sleep(1)
        print("做了2个包子!")
        c.send(i)
        c2.send(i)

producer("alex")

 

011python路--生成器

标签:return   next   [1]   number   name   生成   回收   列表   线程   

原文地址:https://www.cnblogs.com/5014sy/p/9800310.html

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