python小小白

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

简单做个总结:

参考资料:
Python3中yield理解与使用(一遍就懂系列,绝不反驳)
Python 的可迭代对象、迭代器

公众号.png
上一篇下一篇

猜你喜欢

热点阅读