一、可迭代对象(Iterable)
可迭代对象(Iterable):可以直接作用于for循环的对象统称为可迭代对象。可以用isinstance()去判断一个对象是否是可迭代对象(Iterable)。
可以直接作用于for的数据类型一般分两种:
1、集合数据类型,如list、tuple、dict、set、string
2、generator,包括生成器和带yield的generator function
在讲解迭代器之前,我们先来了解一下isinstance()。
二、isinstance() 函数:来判断一个对象是否是一个已知的类型。
语法:isinstance(object, classinfo)
参数:object – 实例对象。
classinfo – 可以是直接或间接类名、基本类型或者由它们组成的元组。
对于基本类型来说 classinfo 可以是:int,float,bool,complex,str(字符串),list,dict(字典),set,tuple。
classinfo 的字符串是 str 而不是 string,字典也是简写 dict。
返回值:
如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。。
from collections.abc import Iterable
print(isinstance([],Iterable)) #返回True 因为list是可迭代对象
print(isinstance((),Iterable)) #返回True 因为tuple是可迭代对象
print(isinstance({},Iterable)) #返回True 因为dict是可迭代对象
print(isinstance("",Iterable)) #返回True 因为string是可迭代对象
print(isinstance((x for x in range(10)),Iterable)) #返回True 是可迭代对象
print(isinstance(1,Iterable)) #返回False
我们简要理解(x for x in range(10))
前面的那一个x是该迭代器生成的列表中每一个元素要代入的表达式,后面的for x in range(10)得出x的取值范围代入前面的x,得到生成的一个列表。
三、迭代器(Iterator对象)
迭代器(Iterator对象):不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出一个StopIteration错误,表示无法继续返回下一个值。
如何判断是否是一个Iterator对象(迭代器)?
可以用isinstance()函数判断一个对象是否是Iterator对象
from collections.abc import Iterator
print(isinstance([],Iterator)) #返回False
print(isinstance((),Iterator)) #返回False
print(isinstance({},Iterator)) #返回False
print(isinstance("",Iterator)) #返回False
print(isinstance((x for x in range(10)),Iterable)) #返回True
#可得只有(x for x in range(10)才是迭代器
我们来验证一下x for x in range(10))以及与这个相似的,是否符合迭代器的定义。
第一个:x for x in range(5)
l = (x for x in range(5))
print(next(l)) #0
print(next(l)) #1
print(next(l)) #2
print(next(l)) #3
print(next(l)) #4
#print(next(l)) #报错StopIteration
第二个:x for x in [23,4,5,64,3435]
l = (x for x in [23,4,5,64,3435])
print(next(l)) #23
print(next(l)) #4
print(next(l)) #5
print(next(l)) #64
print(next(l)) #3435
#print(next(l)) #报错StopIteration
他们符合迭代器的定义,所以都是迭代器。
四、iter() 函数:用来生成迭代器
返回值:迭代器对象
我们使用iter( )可以将list转成Iterator对象
例:
a = iter([1,2,3,4,5])
print(next(a)) #1
print(next(a)) #2
print(next(a)) #3
print(next(a)) #4
print(next(a)) #5
a = iter([1,2,3,4,5])
for i in a:
print(i)
'''
1
2
3
4
5
'''
元组,字典,字符串也可以,我们直接用isinstance( )函数来判断列表、元组,字典,字符串通过iter( )是否变成了Iterator对象。
from collections.abc import Iterator
print(isinstance(iter([]),Iterator)) #返回True
print(isinstance(iter(()),Iterator)) #返回True
print(isinstance(iter({}),Iterator)) #返回True
print(isinstance(iter(""),Iterator)) #返回True
和上面的对比通过使用iter()将列表,元组,字典,字符串转化成了Iterator对象。