Py进阶|可迭代对象、迭代器
2020-01-02 本文已影响0人
凡有言说
可迭代对象
其实,我们见过可迭代对象。像列表、字典、元祖、集合,只是当时不知道而已。为什么称呼为“可迭代对象”呢?
诸如列表、字典、元组、集合,它们可以把数据封装起来,区别只是在于对元素的“安排”不同。由于是装载数据的,我们可以把它们统称为“容器”,其共同的特点就是可被循环。
for i in 容器:
这些可以被for循环的容器,我们说它是可迭代的,即可迭代对象。具体“谁是谁非”,可以使用isinstance
判断。
from collections import Iterable
#列表
print(isinstance([], Iterable))
#元组
print(isinstance((), Iterable))
#字典
print(isinstance({}, Iterable))
#字符串
print(isinstance('', Iterable))
#生成器
print(isinstance((i for i in range(9)), Iterable))
True
True
True
True
True
如何来遍历迭代对象呢?可以使用enumerate
这个内置函数,它是专门用来枚举可迭代对象的。
text = ["China", "Zhejiang", "Hangzhou"]
print(enumerate(text))
<enumerate object at 0x000001887F965558>
当执行了enumerate方法后,它会把传进去的可迭代对象生产含有索引和对应值的enumerate对象。
text = ["China", "Zhejiang", "Hangzhou"]
for i in enumerate(text):
print(i)
(0, 'China')
(1, 'Zhejiang')
(2, 'Hangzhou')
enumerate 函数可以传两个参数,一是可迭代对象,二是计数的起始位置。
text = ["China", "Zhejiang", "Hangzhou"]
for i in enumerate(text, 3):
print(i)
(3, 'China')
(4, 'Zhejiang')
(5, 'Hangzhou')
在枚举的过程中,还可以把计数拿出来:
text = ["China", "Zhejiang", "Hangzhou"]
for count, value in enumerate(text):
print(count)
0
1
2
也可以对 enumerate枚举的结果做优化,比如:
text = ["China", "Zhejiang", "Hangzhou"]
text_1 = list(enumerate(text))
print(text_1)
[(0, 'China'), (1, 'Zhejiang'), (2, 'Hangzhou')]
最后,举个例子看下enumerate的作用:
month = ["January", "February", "March"]
for num, value in enumerate(month, 1):
print(f"{num}月 -> {value}")
1月 -> January
2月 -> February
3月 -> March
迭代器
以上列表、元组、字典、字符串和生成器都是迭代对象。这些迭代对象可以生产迭代器。迭代器的特点是,使用时不用去关心对象的长度,内部构造是怎样的。
迭代器能够进行迭代的原因是,其提供了一个next()
方法,通过这个方法可以不断地去获取容器中的下一个元素,知道没有数据为止。
我们可以用iter()
来构造迭代器,只要把可迭代对象作为参数传进去即得到一个迭代器,从而进行迭代。同样地我们可以使用isintrance
来判断。
from collections import Iterator
print(isinstance(iter([]), Iterator))
print(isinstance(iter(()), Iterator))
print(isinstance(iter({}), Iterator))
print(isinstance(iter(''), Iterator))
print(isinstance(iter(i for i in range(5)), Iterator))
True
True
True
True
True
简单做个总结:
- 迭代不同于遍历枚举,迭代不需要知道容器的“容量”,每次都能获取到下一个元素,直到没有为止。
- 只有迭代器能使用
next()
方法,可迭代对象通过iter
方法可以成为迭代器。 - 生成器是一个迭代器。列表、元组、字典等是可迭代对象。
- 迭代器能够降低不必要的内存浪费。
- for i in 迭代器,实际上不断地调用
next()