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()
Take a small step every day