20.python迭代器

可迭代对象Iterable和迭代器对象Iterator

可迭代对象:

满足前提:

可以被循环操作的对象,就是可迭代对象

举例:str、list、tuple、set、dict、range、generator...

如何高效的检测一个对象是否是可迭代对象?

可以使用collections模块中的Iterable类型配合isinstance(obj,type)内置函数来判断即可

操作步骤如下:

步骤一:导入collections模块

步骤二:collections.Iterable(类型)配合内置函数isinstance()来进行判断,代码如下:

isinstance(obj,collections.Iterable)

如果返回值为True,那么它就是一个可迭代对象

如果返回值为False,那么它不是一个可迭代对象


演示如何判断是否是可迭代对象

import collections
str1 = 'abcdefg'
lt = [1,2,3,4,5]
tp = (10,20,30)
s = {100,200,300,400}
dic1 = {'aa':'AA','bb':'BB'}
r = range(10)
gen = (x for x in range(5))

print(isinstance(str1,collections.Iterable))       #True
print(isinstance(lt,collections.Iterable))         #True
print(isinstance(tp,collections.Iterable))         #True
print(isinstance(s,collections.Iterable))          #True
print(isinstance(dic1,collections.Iterable))       #True
print(isinstance(r,collections.Iterable))          #True
print(isinstance(gen,collections.Iterable))        #True

print(isinstance(100,collections.Iterable))        #False 对于这种整数型数据100没有循环的概念

迭代器对象:

满足前提:

1).必须是一个可迭代对象

2).可以被next()函数所调用的

举例:generator...

如何高效的检测一个对象是否是迭代器对象

可以使用collections模块中的Iterator类型配合isinstance(obj,type)内置函数来判断即可

操作步骤如下:

步骤一:导入collections模块

步骤二:collections.Iterator(类型)配合内置函数isinstance()来进行判断,代码如下:

isinstance(obj,collections.Iterator)

如果返回值为True,那么它就是一个可迭代对象

如果返回值为False,那么它不是一个可迭代对象

演示是否是迭代器对象

import collections
str1 = 'abcdefg'
lt = [1,2,3,4,5]
tp = (10,20,30)
s = {100,200,300,400}
dic1 = {'aa':'AA','bb':'BB'}
r = range(10)
gen = (x for x in range(5))

print(isinstance(str1,collections.Iterator))      #False
print(isinstance(lt,collections.Iterator))        #False
print(isinstance(tp,collections.Iterator))        #False
print(isinstance(s,collections.Iterator))         #False
print(isinstance(dic1,collections.Iterator))      #False
print(isinstance(r,collections.Iterator))         #False

print(isinstance(gen,collections.Iterator))       #Ture 只有gen能被next()函数调用
以下代码有问题:问题在于iterator对象才能被next()函数所调用
# print(next(lt))     #TypeError

 

再谈类型转换:
将可迭代对象转换为迭代器对象
内置函数:iter(iterable)

#假设一个内置函数iter()里面必须传入一个叫iterable对象,将可迭代对象转换成迭代器对象
#内置函数iter 传入lt对象 返回给it1对象

lt = [1,2,3,4,5]
tp = (10,20,30)

it1 = iter(lt)
print(it1,type(it1))   #<tuple_iterator object at 0x00000000021BD160> <class 'tuple_iterator'>
it2 = iter(tp)
print(it2,type(it2))
print(next(it1))           #1
print(next(it2))           #10

#print(next(lt))    而直接next()是会报错的,因为next()不会执行lt对象类型   TypeError: 'list' object is not an iterator
以下代码有问题:
因为3.14属于float类型,它并不是一个Iterable(可迭代对象),
所以不能被iter()函数转换称为Iterator(迭代器对象)
# obj = iter(3.14)
# print(obj,type(obj))

【注意事项】:

内置函数:

iter(iterable)必须只能调用可迭代对象,否则报错

20.python迭代器

全文结束