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]
列表生成器
 s = (x*2 for x in range(5))
 print(s) #<generator object <genexpr> 
 print(next(s) )# 尽量不用s._next_()
for i in s:  print(i)

yield
   def foo():
      print("123")
      yield 1
   a = foo()
   print(a) #<generator object <genexpr> 
    #next首先指向print,之后返回yield 1
    #不过没有变量接受,屏幕不显示
   next(foo())
    next(foo())
    ---------------------------
    def foo():
        print('ok')
        yield 1
        print('ok2')
        yield 2
    for i in foo():
        print(i)
    结果:ok
         1
         ok2
         2
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)

 

posted @ 2018-10-16 20:01  zhaoweiscsuse  阅读(155)  评论(0)    收藏  举报