美文网首页
python yield

python yield

作者: 手捧樱花v | 来源:发表于2020-08-19 23:24 被阅读0次

    初始:将yield看作是return
    重点:
    1)带有yield的函数是生成器,不会像list一样占用大量内存,使用iterator迭代,python3中的range已经是range而不是一个list
    2)就下面代码来看g=foo()并不会打印任何东西,而是先得到一个generator,类似实例化
    3)直到generator的next/send方法,执行到yield sakura相当于程序结束,并没有走到打印res
    4)再次执行next(g)并不是从foo函数头开始,而是上次程序停止的地方执行,但由于上次运行已经return sakura,所以print(res)的结果为None,程序继续循环while,直到yield sakura

    def foo():
        print('starting....')
        while True:
            res = yield sakura
            print(res)
    
    g = foo()
    print(next(g))
    print("*"*20)
    print(next(g))
    
    >>> sakura
    >>> ********************
    >>> None
    >>> sakura
    

    作用一:使用yield生成range

    def foo(num):
        while num < 10:
            num+=1
            yield num
    for n in foo(0):
        print(n)
    

    作用二:大文件读取,如果直接对文件对象调用 read() 方法,会导致不可预测的内存占用,好的方法是利用固定长度的缓冲区来不断读取文件内容(这个是简写/复杂需要考虑换行,加缓存)

    def read_file(dir_path):
        BLOCK_SIZE = 1024
        with open(dir_path,'rb') as f:
              while True:
                  block = f.read(BLOCK_SIZE)
                  if block:
                        yiled block
                  else:
                        return
    

    斐波那契数列

    def foo(max):
        n, a, b = 0, 0, 1
        while n < max:
            print(b) 
            a, b = b, a+b
            n += 1
    
    print(foo(100))
    

    相关文章

      网友评论

          本文标题:python yield

          本文链接:https://www.haomeiwen.com/subject/aikjjktx.html