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)必须只能调用可迭代对象,否则报错