zoukankan      html  css  js  c++  java
  • python三大神器之生成器

    生成器Generator:

      本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)

      特点:惰性运算,开发者自定义

    在python中有三种方法来获取生成器:

            1.通过生成器函数

            2.通过各种推导式来实现生成器

            3.通过数据的转换获取生成器

    一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束。

    def func():
        print('hello')
        yield 1
        print('world')
        yield 2
    
    g = func()       # 调用"生成器函数"
    a = g.__next__()
    print(a)          # a  generator(生成器)
    b = g.__next__()
    print(b)
    
    # yield关键字的特点: 可以记录当前函数中执行的位置,下一次继续执行
    # next和yield是一对搭档 : next开始函数的执行 yield停止函数的执行

    列表推导式的常用写法:[结果 for 变量 in 可迭代对象]

    生成器表达式和列表推导式的语法基本上是一样的,只是把[ ]替换成( )

    俩个的区别:

            列表推导式比较耗内存,一次性加载.生成器表达式几乎不占用内存,使用的时候才分配

            和使用内存

    lst = [i for i in range(10)]
    print(lst)
    #结果:
    #[0,1,2,3,4,5,6,7,8,9]
    g= (i for i in range(10))
    print(g)
    #结果:
    #<generator object <genexpr> at 0x106768f10>
    #打印的结果就是一个生成器. 我们可以使用for循环来循环这个生成器:
    for i in g:
        print(i)

    send方法:send和__next__一样都可以让生成器执行到下一个yield.

    def generator():
        print(123)
        content = yield 1
        print('=======',content)
        print(456)
        yield2
    
    g = generator()
    ret = g.__next__()
    print('***',ret)
    ret = g.send('hello')   #send的效果和next一样
    print('***',ret)
    
    #send 获取下一个值的效果和next基本一致
    #只是在获取下一个值的时候,给上一yield的位置传递一个数据
    #使用send的注意事项
        # 第一次使用生成器的时候 是用next获取下一个值
        # 最后一个yield不能接受外部的值

    生成器的应用:监听文件的输入,对于文件中随时输入的内容进行自动化展示

    import time
    
    
    def tail(filename):
        f = open(filename)
        f.seek(0, 2) #从文件末尾算起
        while True:
            line = f.readline()  # 读取文件中新的文本行
            if not line:
                time.sleep(0.1)
                continue
            yield line
    
    tail_g = tail('tmp')
    for line in tail_g:
        print(line)
    
  • 相关阅读:
    UVa 1151 Buy or Build【最小生成树】
    UVa 216 Getting in Line【枚举排列】
    UVa 729 The Hamming Distance Problem【枚举排列】
    HDU 5214 Movie【贪心】
    HDU 5223 GCD
    POJ 1144 Network【割顶】
    UVa 11025 The broken pedometer【枚举子集】
    HDU 2515 Yanghee 的算术【找规律】
    Java基本语法
    Java环境变量,jdk和jre的区别,面向对象语言编程
  • 原文地址:https://www.cnblogs.com/ppf3678/p/9984354.html
Copyright © 2011-2022 走看看