Python 可迭代对象 / 迭代器 / 生成器
可迭代对象
Python 可迭代对象可以分为三类:
-
迭代器(iterator): 生成器(generator)
-
序列(list, str, tuple, set)
-
字典(dict)
# 可迭代对象
for i in set(1,2,3,4):
print(i)
# 不能用next(i) TypeError: 'set' object is not an iterator
set集合是一个可迭代对象,但不是迭代器
迭代器
可迭代对象需要实现
__iter__
方法,迭代器不仅要实现__iter__
方法,还需要实现__next__
方法
迭代器是可迭代对象的一个子集,它是一个可以记住遍历的位置的对象,它与列表、元组、集合、字符串这些可迭代对象的区别就在于__next__
方法的实现,其他列表、元组、集合、字符串这些可迭代对象可以通过Python内置的iter函数能很简单的转化成迭代器。
X = [1,2,3,4,5]
print(type(X))
Y = iter(X)
print(type(Y))
print(next(Y))
print(next(Y))
print(next(Y))
# 输出
<class 'list'>
<class 'list_iterator'>
1
2
3
自定义迭代器
class Iterator(object):
def __init__(self, array):
self.x = array
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.x):
value = self.x[self.index]
self.index += 1
else:
raise StopIteration
return value
it = Iterator([1,2,3,4,5])
print(type(it))
for i in it:
print(i)
# 输出
<class '__main__.Iterator'>
1
2
3
4
5
使用itertools库生成迭代器
todo
生成器
生成器是迭代器的子集
使用yield关键字构建生成器
yield 后接单个内容
def generator(array):
for i in array:
yield i
gen = generator([1,2,3,4,5])
print(type(gen))
for j in gen:
print(j)
# 输出
<class 'generator'>
1
2
3
4
5
使用yield from关键字构建生成器
yield from 后接可迭代对象,但也是逐个返回
def generator(array):
for sub_array in array:
yield from sub_array
gen = generator([(1,2,3), (4,5,6,7)])
# 输出
1
2
3
4
5
6
7