迭代器
1,可迭代对象
- 在Python中,含有iter方法的对象,都是可迭代对象
- str ,list,dict,set,tuple都是可迭代对象
- 判断方法:print(dir(数据类型)),查看源码
- 优点:,使用灵活,可以直观的查看里面的数据
- 缺点:占用内存
2,迭代器
-
可迭代对象执行obj.iter()得到的结果就是迭代器
而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象 -
在Python中,内部含有iter方法并且含有next方法的对象就是迭代器
-
迭代器:在可迭代对象中,只有文件句柄是迭代器
-
可迭代对象转换为迭代器
-
str list ... ### .__iter__() 就是迭代器 dict set
-
s = [1,2,3,4,5,6.] count = len(s) new_s = s.__iter__() while count: print(new_s.__next__()) count -= 1
-
-
for i in 的方式
-
s = [1,3,4,5,6,2,7] new_s = s.__iter__() while True: try: pirnt(new_s.__next__()) except StopIteration: break
-
优点:节省内存,惰性机制
-
缺点:不能直观的看到里面的数据,
递归
- 不断调用自己本身
- 有明确的终止条件
生成器
1,定义
- 生成器的本质就是迭代器
- 只要函数内部含有yield 关键字,那么函数名()得到的结果就是生成器,并且不会执行函数内部代码
- 迭代器是Python解释器自带的,生成器是后期程序编写的
- 生成器的特性
- 节省内存,惰性机制
- 一次性,不能逆行
- 一个next对应一个yield
- yield能够进行返回内容,还能返回多次
- yield能够临时停止循环
- yield能够记录执行 的位置
- yield from ——将一个可迭代对象的元素逐个返回
- 通过生成器函数构建生成器
- 通过生成器推导式
2,推导式
- 列表推导式的两种模式
- -循环模式
- 筛选模式
- list:[变量 for 循环 条件]
- dict:{键:值 for循环 条件}
- set:{变量 for循环 条件}
- 生成器表达式
- -把列表推导式的 [ ] 换成 ( ) 就是生成器表达式
- 两者比较
- -列表推导式比较耗内存,所有数据一次性加载
- 生成器表达式遵循迭代器协议,逐个产生元素
- 得到的值不一样,列表推导式的得到是一个列表
- 生成器表达式得到的是一个生成器
- 列表推导式一目了然,生成器表达式只是一个内存地址