• 生成器函数,迭代器


    1.什么是生成器?

      在python中,一边循环,一边计算的机制就是生成器。可以返回一个可迭代的对象,生成器本质上是一个迭代器,在一个简单的函数中使用yield关键字,就可以生成一个简单的生成器,那么这个函数就称为生成器函数。

    return 和yield都会返回一个值,区别就在于yield会保存当前的状态,在返回后又回到当前的状态继续执行,而return会结束函数。

    2.获取生成器的三种方式

    • 通过生成器函数来获取   将函数中的return换成yield就是生成器。
    def func():
        print("111")
        yield 222
    geener=func()#获取到生成器
    ret=geener.__next__()#函数开始执行,取值
    print(ret)

    那么我们可以看到, yield和return的效果是一样的. 有什么区别呢? yield是分段来执行⼀个
    函数. return呢? 直接停止执行函数。

    def func():
    print("111")
    yield 222
    print("333")
    yield 444
    gener = func()
    ret = gener.__next__()
    print(ret)
    ret2 = gener.__next__()
    print(ret2)
    
    执行第三次的话就会报错
    ret3
    = gener.__next__() # 最后一个yield执⾏完毕. 再次__next__()程序报错, 也就是 说. 和return无关了。 print(ret3)
    错误信息:StopIteration
    • 通过各种推导式来实现生成器  
        1,列表推导式 [结果, for循环, 条件筛选]
        2,字典推导式 {k:v, for循环, 条件筛选}
        3,集合推导式 { k ,for循环,条件筛选]
    • 通过数据转换获取生成器

    生成器的作用:

    
    
    def cloth():
    for el in range(0,10000):
    yield "衣服"+str(el)
    c=cloth()#获取生成器
    print(c.__next__())#开始执行函数,一次一次执行
    print(c.__next__())
    print(c.__next__())
    print(c.__next__())
    print(c.__next__())
    print(c.__next__())
    
    

    根据生成器的惰性特:

      他是一个一个向下指,需要多少就指多少,不会一次全部拿出来,节省内存 _next_指哪去哪

    send和__next__()区别:

    • send和next()都是让生成器向下走⼀次。
    • send可以给上⼀个yield的位置传递值, 不能给最后一个yield发送值. 在第一次执行生
      成器代码的时候不能使⽤用send()

     生成器可以使用for循环来获取内部的元素:

    def user ():
        print("111")
        yield 222
        print("333")
        yield 444
        print("555")
        yield 666
    gen = user()
    for el in gen:
        print(el )

    生成器表达式的语法:   [想要的结果,for循环,if判断]

    列表推导式
    求0-100以内的偶数
    lst=[el for el in range(1,100)if el% 2==0] print(lst)
    列表推导式
    求1-100以内能被3整除的数
    gen=(el for el in range(1,100) if el %3==0)
    for num in gen:
        print(num )

    生成器表达式和列表推导式的区别:

    • 列表推导式比较耗内存. ⼀次性加载. ⽣成器表达式几乎不占⽤内存. 使⽤的时候才分配和使用内存
    •  得到的值不⼀样. 列表推导式得到的是一个列表.生成器表达式获取的是一个生成器。

     面试题:

    def func():
        print(111)
        yield 222
        yield 333
    g = func()     #获取生成器
    g1 = (i for i in g)    #生成器
    g2 = (i for i in g1)  #生成器
    print(list(g2))  #   111 
     [222,333]  源头,从源头把数据拿走了
    print(list(g1))  #  []  这里执行的时候,源头已经没有数据
    def add(a,b):       #求和
        return a+b
     
    def test():         #生成器函数 0,1,2,3
        for i in range(4):
            yield i
    g = test()          #获取生成器
    for n in [2,10]:   #到最后才放数据(惰性)
        g = (add(10,i)for i in g)
    print(list(g))      # [20, 21, 22, 23]
    

    什么是迭代器?

      python本身是没有迭代器这个类的,但是如果一个类中有__next__(),和__iter__()方法的话,我们可以把它看成一个迭代器类。

    迭代器的特点?

      只能向前,不能向后,并且也不占用内存,适合遍历数据量比较大的数据。可以使用dir()方法来查看是否可以执行  

  • 相关阅读:
    更好一点的:Vue 利用指令实现禁止反复发送请求
    实现一个深度比较
    Zrender:实现波浪纹效果
    Echarts:实现拖拽效果
    找到树中指定id的所有父节点
    Vue 利用指令实现禁止反复发送请求
    我对组件化的一点细琐的想法
    转盘式旋转抽奖
    信息系统与信息化
    跳出牢笼,逃出生天
  • 原文地址:https://www.cnblogs.com/wqzn/p/9470398.html
Copyright © 2020-2023  润新知