python-迭代器 生成器 可迭代对象

 总结(可迭代对象):

  只要一个对象有__iter__方法,那么这个对象就是可迭代对象

  如:字符串 字典 元祖 集合 打开的文件句柄(能够被for循环的都是 )

迭代器:

  只要一个对象有__iter__和__next__方法,这个对象就是迭代器

  迭代器的优点:

  1.不依赖索引

  2.惰性计算,节省内存  缺点:1.不如索引取值方便 2.一次性,只能往后取值,不能回退

生成器:

  使用yield的函数被称为生成器(操作类似迭代器)

  #生成器(列表式)

  generator = (x*x for x in range(10)) 把列表生成式的【】改成(),就创建了一个生成器

yield from 后面加上一个生成器后,就实现了生成的嵌套。
当然实现生成器的嵌套,并不是一定必须要使用yield from,而是使用yield from可以让我们避免让我们自己处理各种料想不到的异常,而让我们专注于业务代码的实现。
如果自己用yield去实现,那只会加大代码的编写难度,降低开发效率,降低代码的可读性。既然Python已经想得这么周到,我们当然要好好利用起来。
讲解它之前,首先要知道这个几个概念

  1、调用方:调用委派生成器的客户端(调用方)代码2、委托生成器:包含yield from表达式的生成器函数3、子生成器:yield from后面加的生成器函数

# 子生成器
def average_gen():
    total = 0
    count = 0
    average = 0
    while True:
        new_num = yield average
        count += 1
        total += new_num
        average = total/count

# 委托生成器
def proxy_gen():
    while True:
        yield from average_gen()

# 调用方
def main():
    calc_average = proxy_gen()
    next(calc_average)            # 预激下生成器
    print(calc_average.send(10))  # 打印:10.0
    print(calc_average.send(20))  # 打印:15.0
    print(calc_average.send(30))  # 打印:20.0

if __name__ == '__main__':
    main()

 

posted @ 2020-09-03 17:37  coding天荒地老  阅读(119)  评论(0编辑  收藏  举报