生成器与列表推导式

  1. 实现延迟计算,省内存
  2. 惰性机制 只要执行__next__() 才会执行并查找到一个yield,之后再返回yield对应的 值
  3. 不能反复,只能向下执行,是一次性取值

生成器的本质就是迭代器

表达式中多个for 循环套用

将列表中名字含有两个2的‘e’的提取出来

names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven','Joe'],
 ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]

方案1
# gg = []
# for i in names:
#     for b in i:
#         if b.count('e') == 2:
#             gg.append(b)

方案2:列表表达式完成上面的 东西
gg = [ b for i in names for b in i if b.count('e') ==2 ]

方案3: 生成器表达式

gg = (b for i in names for b in i if b.count('e') ==2 ) 结果是直接返回一个生成器

列表推导式

表达式     for循环   条件(条件满足的话,前面才会取值)

将列表推导式的[ ]更改为() 产生的就是生成器表达式

字典推导式

{key:value  for循环 if条件判断}

集合推导式

{key   for循环 if调价判断 }  

python 中有两种不同的方式的生成器

  1. 生成器函数 常规定义函数,但是使用yield语句而不是return语句返回结果,在每个结果中间 挂起函数的状态,以便下次从她离开的地方继续执行

这种类型的函数在调用的时候不再是函数的执行,而是获取这个生成器,由于生成器的本质就是迭代器,所有可以通过执行一次__next__()方法来执行获取得到的生成器,执行这个方法之后就看到的效果就与平常使用return的函数一样 遇到yeid 就返回相应值,并结束函数,但是在第二次调用__next__()的时候就会从yeid下面的之前没有执行的代码,当剩下的都被执行完之后就显示StopIteration(如果有的话)

如果yield下面没有代码,由于迭代器是一次性的,所有也不会在执行,直接显示StopIteration

执行一次__next__() 查找一个yeild 并返回 yield 对应的内容

send和__next__()区别:

1. send和next()都是让生成器向下走一次

2. send可以给上一个yield的位置传递值,. 在第一次执行生成器代码的时候不能使⽤用send()

生成器表达式  生成器表达式可以直接获取到生成器对象. 生成器对象可以直接进行for循环. 生成器具有惰性机制,按需产生结果的一个对象,(生成器表达式与列表推导表示式一样,只是将[] 更换成() )

注意的是生成器只能遍历一次

大部分的内置函数也是使用迭代器协议访问对象的

yield from  一般用于在容器中迭代出所有的值

def gg():

       lis = [‘潘’,‘振’,‘卫’]

       yield from lis         

具体的作用与下面的相同

def gg():

       lis = [‘潘’,‘振’,‘卫’]

       yield lis[0]

       yield lis[1]

       yield lis[2]             

yield from是将列表中的每一个元素返回. 所以. 如果写两个yield from 并不会产生交替

的效果.

原文地址:https://www.cnblogs.com/vivi0403/p/9890635.html