python中可以使用 for … in …进行遍历(迭代)的数据类型,都是可迭代的对象。如 列表,字符串,字典,元组 都是可迭代的(Iterable),而浮点数,整型,布尔值都是不可迭代。
for i in [1,2,3,4]:
print(i)
for i in "abcd":
print(i)
for i in {"key1":1,"key2":2,"key3":3}:
print(i)
for i in ("tupe1","tupe2","tupe3"):
print(i)
运行结果
判断一个对象是否可迭代
from collections.abc import Iterable
list1=[1,2,3]
print(isinstance(list1, Iterable))
# 结果为 True
迭代的过程实质上就是对 数据进行逐条的读取返回,直到所有数据均被迭代完成。python内部通过迭代器(Iterator)来实现这个功能。
可迭代的对象首先通过 __iter__
生成一个迭代器, 然后对该迭代器不断调用 __next__
方法,逐条返回迭代数据,从而实现对数据的迭代。
当使用 for … in …时,运行本质如下: 先通过 iter()方法返回数据的迭代器,然后通过next()方法进行逐条读取。
seq=[1,2,3,4]
diedaiqi = iter(seq) # iter()函数获取数据的迭代器
while True:
try:
i = next(diedaiqi) #next()函数返回迭代器的下一个值
except StopIteration: #当迭代到没有数据时,退出
break
print(i)
iter()方法 调用的为对象内部的 __iter__()
方法, next() 调用的对象内部的 __next()__
方法,所以当我们自定义迭代器时,需要使用这两种方法。
#定义一个可迭代的类
class test(object):
def __init__(self,data1):
self.data1=data1
self.data2=0
def __iter__(self):
return self
def __next__(self):
if self.data2 < self.data1:
self.data2 +=1
return self.data2
else :
raise StopIteration
for i in test(5):
print(i)
# 结果
1
2
3
4
5
__iter__
方法是在__next__
方法之前执行的,所以如果不用__next__
,可以在__iter__
便返回一个生成器,也可实现类的迭代
class test(object):
def __init__(self,data1):
self.data1=data1
self.data2=0
self.get_dict={}
def dict1(self):
x=1
y=2
self.get_dict={x:self.data1,y:self.data2}
return self.get_dict
def __iter__(self):
test.dict1(self)
for q in self.get_dict:
yield self.get_dict[q]
for i in test(5):
print(i)
#结果
0
5