Python中迭代对象(Iterable)是非常核心的内容, 今天就和大家分享一下, 什么是迭代对象和迭代器。
简单来说迭代就等于循环, 那么迭代对象就是可以用for循环的对象.一句话记忆, 可以直接用于for循环的数据类型, 就是迭代对象.
常见的可迭代对象包括:
一、集合数据类型, 如元组(tuple), 列表(list), 字典(dict), 集合(set), 字符串(str)等
二、生成器generator, 包括生成器和带yield的generator function.
这些可以直接作用于 for 循环的对象统称为 可迭代对象: Iterable
可迭代对象的实质: 在语法层面,如果一个对象实现了__iter__函数,那么这个对象就是可迭代对象.
迭代对象(Iterable)并不是指某种特定的数据类型或数据结构,它是指存储元素的容器对象,且容器中的元素允许使用__iter__( )函数或__getitem__( )函数进行访问
__iter__函数的作用是让对象可以用for … in循环遍历
getitem( )方法是让对象可以通过“实例名[index]”的方式访问实例中的元素.
如何判断数据是否为可迭代对象呢?
判断时可以使用 isinstance(数据类型, Iterable) 判断一个对象是否是Iterable对象
from collections import Iterable
print(isinstance('qftest', Iterable)) # True
print(isinstance((),Iterable)) # True
print(isinstance([],Iterable)) # True
print(isinstance({},Iterable)) # True
print(isinstance((x for x in range(6)), Iterable)) # True
print(isinstance(10086, Iterable)) # False
通过上面例子可以看出,Python中的内置类型元组(tuple), 列表(list),字典(dict),字符串(str)等对象都是可迭代的.
接下来, 我用自定义一个类, 看一下类是否为可迭代对象.
class ListDemo:
def __init__(self):
self.listnum = []
def add(self, n):
self.listnum.append(n)
list = ListDemo()
list.add(10)
list.add(20)
print(isinstance(list, Iterable)) # False
我们自定义了一个类ListDemo,由于这个类没有实现iter方法,所以这个类的实例不是可迭代对象。
那么什么是迭代器呢?
可以被next()函数调用并不断返回下一个值的对象称为迭代器: Iterator.
可以使用 isinstance() 判断一个对象是否是Iterator对象:
from collections import Iterator
print(isinstance('qftest', Iterator)) # False
print(isinstance((),Iterator)) # False
print(isinstance([],Iterator)) # False
print(isinstance({},Iterator)) # False
print(isinstance((x for x in range(6)), Iterator)) # True
print(isinstance(10086, Iterator)) # False
生成器都是Iterator对象, 但元组(tuple), 列表(list), 字典(dict), 字符串(str)虽然是Iterable, 但却不是Iterator.
如何将元组(tuple), 列表(list), 字典(dict), 字符串(str)等Iterable转为Iterator呢?
使用用iter() 函数即可。
print(isinstance(iter([]),Iterator)) # True
print(isinstance(iter({}),Iterator)) # True
print(isinstance(iter(()),Iterator)) # True
print(isinstance(iter('qftest'),Iterator)) # True
大家可能会有疑问, 为什么元组(tuple), 列表(list), 字典(dict), 字符串(str)等数据类型不是 迭代器呢(Iterator), 是迭代对象又不是迭代器,云里雾里的, 我们接着往后看.
python中的Iterator对象表示的是一个数据流, Iterator对象可以被next()函数调用并不断返回下一个值直到没有数据返回最后抛出StopIteration错误提示。
可以将该数据流当做一个序列, 但我们不知道该序列的长度, 只能不断通过next() 函数实现按需计算下一个数据.
所以Iterator的计算是惰性的. 只有在需要返回下一个数据时, 它才会做计算.
Iterator表示一个无限数量的元素容器.
凡是可作用于for循环的对象 都是Iterable对象
凡是可作用域next() 函数的对象都是 Iterator 类型, 它们表示一个惰性计算的序列.
集合数据类型 list, tuple, dict, str等是Iterable但不是Iterator, 不过可以通过iter() 函数获得一个Iterator对象.
例如: python中的for循环底层就是通过不断的进行调用next() 函数实现的.
for i in [10, 20, 30, 40,50]:
print(i)
完全等价于:
先将列表数据 转换为Iterator迭代器
i = iter([10,20,30,40,50])
再循环
while True:
try:
# 获取下一个值
x = next(i)
except StopIteration:
# 没有数据 捕获StopIteration异常
break
以上就是迭代对象与迭代器的相关内容.