生成器,推导式

一.

1.生成器

  生成器的本质就是迭代器,生成器的特点和迭代器一样,取值方式和迭代器一样(_next_(),send(),给上一个yield传值),生成器一般由生成器函数或生成器表达式建成

2.生成器函数

  1.普通函数没有区别,里面有yield的就是生成器函数

  2.生成器函数在执行的时候,默认不会执行函数,返回生成器

  3.只有通过含有这个的_next_()分段才能执行这个函数

  4.send()给上一个yield传值,不能给第一个yield传值,也不能给最后一个yield传值

3.推导式

  1.列表推导式[结果  for循环  条件筛选]

  2.字典推导式{k:v  for循环  条件筛选}

  3.集合推导式{k  for循环  条件筛选}

4.生成器表达式

  (结果,for循环,条件)

  1.惰性机制

  2.只能向前

  3.节省内存

       生成器的惰性机制: 生成器只有在访问的时候才取值. 说白了. 你找他要他才给你值. 不找他
 要. 他是不会执行的

def func():
    print(111)
    yield 222
g = func() # 生成器g
g1 = (i for i in g) # 生成器g1. 但是g1的数据来源于g
g2 = (i for i in g1) # 生成器g2. 来源g1
print(list(g)) # 获取g中的数据. 这时func()才会被执行 打印111.获取到222. g完毕.
print(list(g1)) # 获取g1中的数据. g1的数据来源是g. 但是g已经取完了. g1也就没有数据
print(list(g2)) # 和g1同理
结果 111 222 [] []
# 深坑 生成器只有在访问的时候才取值. 但一旦生成器的值被取走了,后面想要在取值就取不到了,因为值被取走了.

def add(a, b):
    return a + b
def test():
    for r_i in range(4):
        yield r_i
g = test()
for n in [2, 10]:
    g = (add(n, i) for i in  g)#(add(n, i) for i in add(n, i) for i in g) n 都等于 10
print(list(g))
结果是 [20,21,22,23]
# 深坑 惰性机制, 不到最后不会拿值,生成器. 要值得时候才拿值.



 

  

原文地址:https://www.cnblogs.com/nianshaoyouwei/p/9468318.html