列表 元祖 字典 集合 字符串 都可以使用for循环,这些都可以迭代
如何判断一个元素是否可以被迭代?
1、导入一个包
from collections import Iterable
print(isinstance([11,22,33],Iterable))
2、格式
print(isinatance(元素,Iterable))
说明列表【11,22,33】可以被迭代,会返回true
假设有个for循环(如果想要循环遍历的话)
for temp in ***—object:
pass
1、判断***—object是否可以迭代
看***—object对象的类中是否有__iter__方法
2、在第一步成立的前提下,调用iter函数,得到***—object对象的iter方法的返回值
调用iter函数会自动调用__iter__方法
3、iter犯法的返回值就是一个迭代器
for循环会自动调用迭代器的__next__方法,
调用一次取一个给temp
!!!一个类中有一个iter就可以被迭代;如果是既有iter又有next就可以称为迭代器
代码
from collections import Iterable
from collections import Iterator
import time
class Classmate(object):
##object是为了兼容python2
def __init__(self):
self.names = list()
#names就是一个列表
self.current_num = 0
def add(self,name):
self.names.append(name)
def __iter__(self):
# 如果想要一个对象成为可迭代的对象,必须使用iter方法
#使用这个方法必须要返回一个对象的引用,
#返回的对象满足的条件:必须有一个iter方法和next方法
# return ClassIterator(self)
return self
#返回自己的原因,自己就有iter
def __next__(self):
if self.current_num < len(self.names):
ret = self.names[self.current_num]
self.current_num += 1
return ret
else:
raise StopIteration
# class ClassIterator(object):
# def __init__(self,object):
# self.object = object
# self.current_num = 0
# def __iter__(self):
# pass
# def __next__(self):
# if self.current_num < len(self.object.names):
# ret = self.object.names[self.current_num]
# self.current_num += 1
# return ret
# else:
# raise StopIteration
#主动抛出一个异常,for循环会自动通知
classmate = Classmate()
classmate.add('小明')
classmate.add('小洪')
classmate.add('小凉')
# print('判断classmate是否是可以迭代的对象',isinstance(classmate,Iterable))
#
# #iter的调用
# classmate_iterator = iter(classmate)
# print("classmate_iterator是否为迭代器",isinstance(classmate_iterator,Iterator))
#
# print(next(classmate_iterator))
for name in classmate:
print(name)
time.sleep(1)
迭代器的优点是什么?为什么使用迭代器?
迭代器能实现for,能取里面的数据,但是他里面所保存的不是生成这个序列的结果,而是生成这个序列的方式,占用空间极小。
网友评论