一、迭代器
迭代器可以理解为是一个容器,每次从容器中取出一个数据,就是迭代操作,列表元组字符串和字典都是迭代器,也都支持迭代操作。
迭代器有两个基本的方法:
iter() :对一个容器对象调用iter()就得到它的迭代器。
next():调用 next()迭代器就会返回下一个值,如果没有值返回了就会抛出一个StopIteration的异常。
>>> str1 = 'laohu'
>>>
>>> data = iter(str1)
>>>
>>> next(data)
'l'
>>>
>>> next(data)
'a'
>>>
>>> next(data)
'o'
>>>
>>> next(data)
'h'
>>>
>>> next(data)
'u'
>>>
>>> next(data)
Traceback (most recent call last):
File "<pyshell#79>", line 1, in <module>
next(data)
StopIteration
把一个类作为迭代器需要在类中实现两个方法
iter()::需要返回对象本身
next():返回容器中的下一个元素,当数据取完时,要引发一个StopIteration异常。
>>>#自定义迭代器,通过传入最小值和最大值,返回该范围内所有数值的平方。
>>>
>>> class Number():
def __init__(self,min,max):
self.min = min
self.max = max
def __iter__(self):
return self
def __next__(self):
num = self.min
if self.min <= self.max:
self.min += 1
return num ** 2
else:
raise StopIteration
>>> for i in Number(1,7):
print(i,end='--')
1--4--9--16--25--36--49--
二、生成器
python中函数如果包含了yield关键字,那么这个函数就不再是一个普通函数,而是一个生成器(generator)
生成器就是一个迭代器,在调用生成器的过程中,每次遇到 yield 时函数会暂停并保存运行信息,并在下次执行 next() 方法时从当前位置继续运行
>>> def test_gene():
print('test generator')
yield 'h'
yield 'j'
yield 'y'
>>> my_gene = test_gene()
>>>
>>> next(my_gene)
test generator
'h'
>>> next(my_gene)
'j'
>>> next(my_gene)
'y'
>>> next(my_gene)
Traceback (most recent call last):
File "<pyshell#113>", line 1, in <module>
next(my_gene)
StopIteration
>>>
yield 与 return 的区别:
a、return 语句执行后,会跳出当前函数,yield 不会。
b、yield 会保存当前的执行状态,再次调用会从上次暂停的位置继续执行。