生成器

生成器

内容概要


  • 生成器对象
  • 自定义range方法
  • yield关键字用法
  • 生成器表达式

内容详情


生成器对象

# 本质其实还是迭代器 只不过是我们自己通过写代码产生(自定义迭代器)
  也是有__iter__和__next__方法
# 生成器对象也是节省存储空间的 特性与迭代器对象一致
  """
  当函数体代码中含有yield关键字
      第一次调用函数并不会执行函数体代码
      而是将函数变成了生成器
  如何验证?
      是否有iter()和next()方法
  """
# 没有调用之前 就是一个普通的函数
  print(index)  # <function index at 0x1096c0ea0>
# 加括号调用并接收结果:不执行代码 而是变成生成器对象(迭代器)
  res = index()
  print(res)  # <generator object index at 0x11da33468>
# 变成生成器对象之后调用__next__就会开始执行函数体代码
  """
  如果函数体代码中含有多个yield关键字
  执行一次__next__返回后面的值并且让代码停留在yield位置 
  再次执行__next__基于上次的位置继续往后执行到下一个yield关键字处
  如果没有了 再执行也会报错  StopIteration
  """

自定义range方法

# range方法其实是一个可迭代对象
  for i in range(1, 10):
      print(i)
'''
需求:通过生成器模拟range方法
    def my_range():
        pass
    for i in my_range(1,10):
        print(i)
'''
# 先以两个参数的range方法为例
def my_range(start, end=None, step=1):
    if not end:  # 没有给end传值  my_range(10)
        end = start
        start = 0
    while start < end:
        yield start
        start += step
# for i in my_range(1,100):
      print(i)
# 初步功能实现之后 再去考虑不同参数的情况 一个参数 三个参数
# 针对一个参数情况
"""
end可以不传值 应该设置成默认参数  end=None
代码层面做判断 将形参数据做替换处理
    end = start
    start = 0
"""
# for i in my_range(100):
      print(i)
# 这对三个参数情况
"""
给函数添加第三个形参 并且设置成默认参数 默认值是1  step=1
    每次递增的时候只需要递增step的数值即可
        start += step
"""
for i in my_range(10):
    print(i)
"""
写代码一定不要想太多 先搭建主题功能 之后再考虑其他情况
思路一定要清晰!!!
"""

yield关键字作用

# 1.在函数体代码中出现 可以将函数变成生成器
# 2.在执行过程中 可以将后面的值返回出去 类似于return
# 3.还可以暂停住代码的运行
# 4.还可以接收外界的传值(了解)
def eat(name):
    print(f'{name}准备干饭')
    while True:
        food = yield
        print(f'{name}正在吃{food}')
res = eat('赵公子')
# 想执行一次代码  如果想执行多次直至结束 可以直接用for循环
res.__next__()
# res.__next__()  赵公子正在吃None
# res.__next__()  赵公子正在吃None
res.send('生日蛋糕')  # 可以给yield传值 并且自动调用一次__next__方法
res.send('大鸡腿')  # 可以给yield传值 并且自动调用一次__next__方法

生成器表达式

# 是为了节省存储空间
res = (i for i in 'jason')
print(res)  # <generator object <genexpr> at 0x1130cf468>
print(res.__next__())
"""生成器内部的代码只有在调用__next__迭代取值的时候才会执行"""
posted @ 2022-03-27 16:04  弄臣  阅读(107)  评论(0)    收藏  举报