快捷搜索: 王者荣耀 脱发

python之可迭代对象简介


1 可迭代对象

Python中,列表、元组、字典、集合、字符串等类型的数据可以使用for ..in...的语法从其中依次取到数据来使用,这样的过程称为遍历,也叫迭代。

可迭代对象:可以通过for ..in...这类语句迭代读取一条数据给用户使用的对象。

下面是一段列表的迭代示例代码:

>>> list1 = [1, 2, 3]
>>> for n in list1:
...     print(n)
...
1
2
3

下面是一段字典的迭代示例代码:

>>> dict1 = {
          
   one:1, two:2, three:3}
>>> for key in dict1.keys():
...     print(key)
...
one
two
three

2 判断对象是否为可迭代的

使用isinstance判断一个对象是否为可迭代对象(Iterable)

示例代码如下:

from collections import Iterable

>>> isinstance([1,2,3], Iterable) # 列表为可迭代对象
True
>>> isinstance({
          
   1,2,3}, Iterable) # 集合为可迭代对象
True
>>> isinstance(100, Iterable) 
False

3 可迭代对象的本质

分析迭代的过程,可发现:每迭代一次(即在for…in…中每循环一次),都会返回对象中的下一条数据,一直向后读取,直到迭代完全部数据才结束。

在迭代过程中,应该有一个“记录员”去记录每次访问到第几条数据,以便每次迭代都可以返回下一条数据。Python将这个“记录员”称为迭代器。可迭代对象的本质是:这个对象提供给用户一个迭代器,来帮助用户在遍历对象时使用。

可迭代对象通过__iter__方法通过给我们一个迭代器。当用户在迭代一个可迭代对象时,实际上就是先获取该对象提供的迭代器,然后通过这个迭代器来一次获取对象中的每一个数据。

具备__iter__方法的对象,就是一个可迭代对象。

示例代码如下:

>>> from collections import Iterable

>>> class MyList(object):
...     def add(self, item):
...         self.container = []
...     def add(self, item):
...         self.container.append(item)
...     def __iter__(self):
...         """返回一个迭代器"""
...         # 暂时忽略如何构造一个迭代器对象
...         pass
...
>>> mylist = MyList()
>>> isinstance(mylist, Iterable) # mylist对象是一个可迭代对象
True

4 iter()与next()

对于可迭代对象,可以使用iter()函数得到这些可迭代对象的迭代器,然后对迭代器使用next()函数来获取下一条数据。(iter()函数调用了可迭代对象的__iter__方法)

示例代码如下:

>>> list1 = [1, 2, 3]
>>> list1_iter = iter(list1)
>>> next(list1_iter)
1
>>> next(list1_iter)
2
>>> next(list1_iter)
3
>>> next(list1_iter)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

在使用next()迭代完最后一个元素后,再次调用next就会抛出StopIteration异常,以此来告诉我们所有元素均迭代完成。


经验分享 程序员 微信小程序 职场和发展