yield关键字:带有yield的函数是一个生成器模板,调用模板会返回一个生成器对象,
    执行到 yield a 时,create_num 函数就返回一个迭代值,下次迭代时,代码从 yield a 的下一条语句继续执行

    1. def create_num(num):
    2. a, b = 0, 1
    3. current_num = 0
    4. while current_num < num:
    5. # 遍历create_num返回的生成器时,会阻塞在yield的位置,遍历出的值都是yield后的值
    6. yield a
    7. a, b = b, a + b
    8. current_num += 1
    9. return "ok...."
    10. ob = create_num(10)
    11. while True:
    12. try:
    13. ret = next(ob)
    14. print(ret)
    15. except Exception as ret:
    16. print(ret.value)
    17. break
    18. ---------------------------
    19. #0
    20. #1
    21. #1
    22. #2
    23. #3
    24. #5
    25. #8
    26. #13
    27. #21
    28. #34
    29. #ok....

    send()迭代生成器,传参给yield

    1. def create_num(all_num):
    2. a, b = 0, 1
    3. current_num = 0
    4. while current_num < all_num:
    5. res = yield a # send的参数就是yield语句的返回值
    6. print("老子是send,强势输出。。。", res)
    7. a, b = b, a + b
    8. current_num += 1
    9. ob= create_num(10)
    10. res = next(ob)
    11. print(res)
    12. res = ob.send("老子是send")
    13. print(res)
    14. -------------------
    15. #0
    16. #老子是send,强势输出。。。 老子是send
    17. #1

    另一个 yield 的例子来源于文件读取。如果直接对文件对象调用 read() 方法,会导致不可预测的内存占用。好的方法是利用固定长度的缓冲区来不断读取文件内容。通过 yield,我们不再需要编写读文件的迭代类,就可以轻松实现文件读取

    1. def read_file(fpath):
    2. BLOCK_SIZE = 1024
    3. with open(fpath, 'rb') as f:
    4. while True:
    5. block = f.read(BLOCK_SIZE)
    6. if block:
    7. yield block
    8. else:
    9. return