yield(自定迭代器)

若函数体包含yield关键字,再调用函数,并不会执行函数体代码,得到的返回值是一个生成器对象也叫自定义迭代器,

  1. def index():
  2. print('Hello World_1')
  3. yield 'hhhh_1'
  4. print('Hello World_2')
  5. yield 'hhhh_2'
  6. print(index) # 普通函数
  7. # <function index at 0x7fd9168c5ea0>
  8. print(index()) # 迭代器
  9. # <generator object index at 0x7ff534fd3a40>
  10. res = index()
  11. print(next(res))
  12. # Hello World_1
  13. # hhhh_1
  14. print(next(res))
  15. # Hello World_2
  16. # hhhh_2

补充:

  1. 没有调用之前,只是一个普通的函数
  2. 加括号调用并接受结果,不执行代码,只是变成了生成器对象(迭代器)
  3. 当变成生成器对象(迭代器),可以通过__next__取值
  4. 当函数题代码存在多个yield关键字,调用一次__next__将会执行代码,并返回yield关键字,后面的值让代码停留在yield位置,再次调用也是一样的
  5. 当没有可执行代码,再次执行则会报错 StopIteration

yield表达式作用

作用

  1. 在函数体代码中出现,可以将函数变成生成器
  2. 在执行过程中,可以将后面的值返回出去,类似于return
  3. 可以暂停住代码的运行
  4. 可以接收外界的传值

使用

  1. def index(name):
  2. print(f"Hello, {name}")
  3. while True:
  4. word = yield
  5. print(f"Hello, {word}! --{name} ")
  6. res = index('kevin')
  7. res.__next__()
  8. # Hello, kevin
  9. res.send('world') # send可以给yield传值,并且自动调用一次__next__方法
  10. # Hello, world! --kevin
  11. res.send('hacker') # send可以给yield传值,并且自动调用一次__next__方法
  12. # res.send('hacker')

生成器表达式(元组推导式)

元组推导式和列表推导式的用法也完全相同,只是元组推导式是用 () 圆括号将各部分括起来,而列表推导式用的是中括号 [],另外元组推导式返回的结果是一个生成器对象。

定义

  1. res = (表达式 for 变量名 in 循环对象)
  2. res = (表达式 for 变量名 in 循环体对象 if 条件 )

使用

  1. res = (i for i in range(10))
  2. print(res) # # 返回的是生成器对象
  3. # <generator object <genexpr> at 0x7f85ab2c0a40>
  4. print(next(res)) # 通过next取值
  5. # 0
  6. print(next(res))
  7. # 1
  8. print(next(res))
  9. # 2
  10. print(next(res))
  11. # 3
  12. print(next(res))
  13. # 4
  14. print(next(res))
  15. # 5

自定义range方法

  1. # 通过生成器模拟range方法
  2. def my_range(start=0, end=None, step=1):
  3. if not end:
  4. end, start = start, 0
  5. while start < end:
  6. yield start
  7. start += step
  8. for j in my_range(8):
  9. print(j)

笔试题

  1. def add(n, i):
  2. return n + i
  3. def test():
  4. for i in range(4):
  5. yield i
  6. g = test()
  7. for n in [1, 10]:
  8. g = (add(n, i) for i in g)
  9. res = list(g)
  10. print(res)
  11. # A. res=[10,11,12,13]
  12. # B. res=[11,12,13,14]
  13. # C. res=[20,21,22,23]
  14. # D. res=[21,22,23,24]