6、迭代器

Iterable和Iterator
在说迭代器之前,先明确下Iterable和Iterator分别是什么
Iterable:可迭代的
Iterator:迭代器
Iterable
在Python中,以下数据类型都是可迭代的
1.列表list
2.字典dict
3.元组tuple
4.字符串str
lt = iter([1, 2, 3, 4])
print(lt) # <list_iterator object at 0x0000000001D6DE10>

dic = iter({1, (1, 2), ‘str’})
print(dic) # <set_iterator object at 0x0000000002813900>

tup = iter((1, 2, [2, 3]))
print(tup) # <tuple_iterator object at 0x0000000001DC53C8>

st = iter(‘str’)
print(st) # <str_iterator object at 0x00000000021BA358>

it = iter(123)
print(it) # TypeError: ‘int’ object is not iterable
通过看这几种数据类型的源码,会发现它们内部都实现了__iter__方法
str.iter()
list.iter()
dict.iter()
tuple.iter()
Iterable特点
内部实现了__iter__,可使用for进行迭代
能通过iter(iterable)方法来转换成迭代器iterator
内部其实是调用的iterable.iter();除了__iter__以外,__getitem方法也是可以的。两者并存的话,__iter__先被调用

Iterator
iterator对象是可进行迭代的
iterator内部实现了__next__方法,可通过next(iterator)来获取迭代器的下一个值;直到抛出StopIteration错误表示后面已无值,无法继续返回值
iterator可通过for循环来进行迭代并返回下一个值
for循环做了哪些事情?
调用Iter(),把可迭代对象iterable转换成迭代器iterator
调用next(),依次获取迭代器的下一个值
对StopIteration错误进行了处理
所以,for的对象需要是可迭代对象或迭代器
生成器和迭代器的区别
生成器是一种特殊的迭代器,而迭代器并不一定是生成器
生成器可以有效降低内存占用率,编写出的代码更加优雅,提高程序速度

上一篇:Google Guava 集合(Collections)


下一篇:在Python中,如何确定对象是否可迭代?