011python路--生成器

Posted 5014sy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了011python路--生成器相关的知识,希望对你有一定的参考价值。

#列表生成式
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路--生成器的主要内容,如果未能解决你的问题,请参考以下文章

011day--python基础知识

Python代码阅读(第40篇):通过两个列表生成字典

Python学习笔记011——内置函数exec()

Python练习题 011:成绩打分

012python路--迭代器

011.Numpy.expand_dims