迭代是访问集合元素的一种方式。
- 迭代器
是一个可以记住遍历的位置的对象,迭代器的对象是从集合的第一个元素开始访问,直到所有的元素被访问结束,迭代器只能往前不能往后。 - 可迭代的对象
使用for … in …的循环语法从其中依次拿到数据进行使用,把这样的过程叫做迭代
只有可迭代对象才可以迭代(tuple\list\str等类型的数据)
迭代器一定是可迭代对象,是可迭代对象不一定是迭代器
以下为自定义的一个可迭代对象及迭代器
class Classmate(object):
def __init__(self):
self.names=list()
self.num=0
def add(self,name):
self.names.append(name)
def __iter__(self):
return self
def __next__(self):
if self.num < len(self.names):
ret = self.names[self.num]
self.num += 1
return ret
else:
raise StopIteration
for name in a:
time.sleep(1)
两者之间的联系以for循环为例
for x in obj:
pass
1.判断obj是否是可以迭代->可迭代对象(具有iter方法)
2.在1的成立条件下,调用iter函数得到obj对象的iter方法返回值
3.在得到iter方法的返回值是一个迭代器 ->(具有iter 和next方法)
总结:一个类有__iter__方法就是一个可迭代对象,同时具有__iter__和__next__方法就是迭代器
- 生成器
是一个特殊的迭代器
- 创建方法1:把一个列表生成式[ ]改成() nums =(x for x in range(10))
- 创建方式2:使用函数具有yield则就是一个生成器
def nums(all_num):
a, b=0, 1
curr_num=0
while curr_num<all_num:
yield a#如果一个函数中有yield语句 则不是一个函数 是一个生成器
a,b=b,a+b
curr_num+=1
#调用时发现函数中有yield那么则是创建一个生成器的对象
t=nums(10)
for z in t:
print(z)
yield与return的对比
- yieid 会暂停函数的运行,返回当前数据,执行 next方法,函数会从暂停的位置继续向下执行
- return 会打断函数的运行,返回结果,再次运行函数,会从头开始重新执行
- yieid 相同条件多次执行可以返回一组有关联的数据
- return 相同条件多次执行返回同一结果
- yieid 和 return 联用只有python3 支持,并且执行到return 会抛出StopIteration 异常