一. 迭代器:迭代取值的工具
迭代:一个重复的过程,每次重复是基于上一次重复的结果
优点:提供一种不是依赖索引的迭代取值方式(通用方式)// 更节省内存
缺点:只能按顺序依次取值,不如索引取值灵活// 只能 一次性取值,无法预测值的个数
如何用:
可迭代对象:有内置__iter__方法的对象(字符串,元组,列表,字典,集合,文件)
调用可迭代对象下的__iter__方法,会有一个返回值,该返回值就是内置的迭代器对象。
迭代器对象:既有__iter__对象(for 循环的底层机制要用到),又有__next__方法的对象(只有文件对象是迭代器对象)
d={'k1':1,'k2':2,'k3':3} iter_d=d.__iter__() # 生成迭代器对象 iter_d.__next__() # 取出第一个key iter_d.__next__() # 取出第二个key iter_d.__next__() # 取出第三个key # 完整代码 d={'k1':1,'k2':2,'k3':3} iter_d=d.__iter__() while True: try: v=iter_d.__next__() print(v) except: break 步骤:1. 将可迭代对象用__iter__方法编程迭代器对象 2. 用__next__方法将每个元素取出 3. 用try, except 捕捉异常
for 循环底层运行机制: for k in d:
1. 调用 in 后边的可迭代对象d 的 __iter__() 方法,得到迭代器对象
2. 调用迭代器对象下面的__next__() 方法,将返回值赋值给 k
3. 直到取完,抛出异常,然后处理异常
二, 生成器: 一种自定义的迭代器
如何得到迭代器: 但凡函数出现yield 关键字,再去调用函数不会立即执行函数代码,会得到一个返回值,该返回值就是生成器对象,即自定义的迭代器
def func(): a=1 yield a b=2 yield 2 c=3 yield 3 g=func() # 生成器对象(自定义迭代器) res1=next(g) print(res1) # 结果为1 res2=next(g) print(res2) #结果为2
yield : 提供一种自定义迭代器的解决方案
yield & return :
相同点:都可以返回值,返回值没有类型,个数限制
不同点:return 只返回一次值,yield 可以让函数暂停在某一个位置,可以返回多次值
# range 函数的实现 def range(start, end, step=1): while start<end+1: yield start start+=1 for i in range(1,5,2): print i # 结果为1 ,3