• 生成器与列表推导式


    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 并不会产生交替

    的效果.

  • 相关阅读:
    Servlet Filter过滤器执行顺序
    eclipse乱码问题
    如何查看servlet&jsp版本?
    Unity的shader学习2
    Unity的shader学习1
    后缀数组专题与代码模板
    哈希表/散列表 指针版模版
    图的连通性专题及模板
    一般图最大匹配--带花树
    7-15至7-17训练赛回顾
  • 原文地址:https://www.cnblogs.com/vivi0403/p/9890635.html
Copyright © 2020-2023  润新知