python yield

初始:将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理解的有点模糊,昨天搜索发现了一个讲解非常清楚的版本,所以mark一下。来源:p...
    俊采星驰_87e0阅读 1,356评论 1 1
  • 以下内容改编自廖雪峰老师的博客:https://www.ibm.com/developerworks/cn/ope...
    Vector_Wan阅读 383评论 0 3
  • Python中,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 gene...
    TinlokLee阅读 236评论 0 0
  • 首先,如果你还没有对yield有个初步分认识,那么你先把yield看做“return”,这个是直观的,它首先是个r...
    g_ices阅读 140评论 0 1
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,575评论 16 22