python迭代器
1. 迭代
在之前数据的基础上取下一个,不断重复,是访问集合元素的一种方式。
例如:for循环,它就是挨个把列表中的数据打印输出
for i in range(5):
print(i)
# 打印:0,1,2,3,4
2. 可迭代对象
简单理解就是能够被遍历输出的
python的可迭代对象有:
1.可以迭代的数据类型:
列表
元组
字典
字符串
2. 不可迭代的数据类型
整形
浮点型
for i in 123:
pritn(i)
注意:会报下面这个错误:
TypeError: 'int' object is not iterable
3. 如何判断是否为可迭代对象?
isinstance的结果是True 就代表是可以迭代对象
from collections.abc import Iterable
print(isinstance([],Iterable))
print(isinstance((),Iterable))
print(isinstance({},Iterable))
print(isinstance('asdf',Iterable))
print(isinstance(100.11,Iterable))
print(isinstance(100,Iterable))
打印结果:
True
True
True
True
False
False
4. 迭代器Ierator
迭代器是一个可以记住遍历的位置的对象,迭代器对象从第一个元素开始访问,
直到所有的元素访问结束,迭代器只能往前不能后退
1. 迭代器如何获取呢?
from collections.abc import Iterator
# 1. 建立可迭代对象a
a = [1,2,3,4]
print(type(a))
# 2. 获取a的迭代器
num_iter = iter(a)
print(type(num_iter))
打印结果:
<class 'list'>
<class 'list_iterator'>
2. 使用迭代器 iter()和next()
iter(iterable) 返回迭代器,iterable必须是迭代器对象
next(iterator) 从迭代器iterator中获取下一数据,如果无法获取下一条记录,则触发stoptrerator异常
# 1. 创建可迭代对象
a = [1,2,3]
# 2. 获取可迭代对象的迭代器
num_iter = iter(a)
# 3. 获取下一条数据
a1 = next(num_iter)
print(a1)
a2 = next(num_iter)
print(a2)
a3 = next(num_iter)
print(a3)
打印结果:
1
2
3
5. StopIteration
# 1. 创建可迭代对象
a = [1,2,3]
# 2. 获取可迭代对象的迭代器
num_iter = iter(a)
# 3. 获取下一条数据
a1 = next(num_iter)
print(a1)
a2 = next(num_iter)
print(a2)
a3 = next(num_iter)
print(a3)
a4 = next(num_iter) # 只有三条数据,我取4次会出现什么?
print(a4)
解决方法如下所示:
# 1. 创建一个是可迭代对象
a = [11,22,33,44]
# 2. 获取可迭代对象的迭代器
a_iter = iter(a)
# 3. 循环获取下一条数据
while True:
try:
print(next(a_iter))
except StopIteration:
break
6. 创建 “迭代器”
1. 创建一个可迭代对象
在定义类时如果有 __iter__ 方法,那么这个类创建的对象是可迭代对象
from collections.abc import Iterable
class Person(object):
def __init__(self):
self.age = []
def add(self, a):
self.age.append(a)
def __iter__(self):
pass
per = Person()
per.add(16)
print(isinstance(per, Iterable)) # 注意:返回True代表是可迭代对象,反之False
2. 创建一个迭代器
from collections.abc import Iterable
from collections.abc import Iterator
class ZIterator(object):
"""自定义一个迭代器"""
def __init__(self):
pass
def __next__(self):
return '自定义迭代器'
def __iter__(self):
return self
my = ZIterator()
my_iter = iter(my)
x = next(my_iter)
print(x)
print('迭代对象:', isinstance(my, Iterable))
print('迭代器 :', isinstance(my, Iterator))
3. 验证可迭代对象是否为迭代器
迭代器象一定是可迭代对象,可迭代对象不一定是迭代器
from collections.abc import Iterable
from collections.abc import Iterator
class Person(object):
def __init__(self):
self.age = []
def add(self, a):
self.age.append(a)
def __iter__(self):
pass
per = Person()
per.add(16)
print('可迭代对象',isinstance(per, Iterable)) # 注意:返回True代表是可迭代对象,反之False
print('迭代器',isinstance(per, Iterator)) # 注意:返回True代表是迭代器,反之False