迭代器:从一个实例对象中一个一个的取内容,取一个,指针移动到下一个内容,在往出去一个,指针在移动到下一个 最常见的实现迭代功能的方法是 for 循环 for i in xx: # 想要判断一个实力对象是否可以迭代 需要使用 collections 函数中 Iterable 类 # 例如 from collection import Iterable isinstance() 方法的作用判断 一个东西的生成是否受到另一个东西的影响 isinstance(a,A) 如果a的出现是受到A的影响 isinstance() 方法就会返回一个True Iterable 被称为可迭代对象,在python 中任意对象 只要它定义了一个可迭代方法 __iter__ 方法,或者定义了可以支持下标索引的__getitem__方法 ,那么它就是一个可迭代对象 # 我们常见的可迭代对象包括 list, tuple dict set str ,不可迭代对象 int folt
# 自定义类
class Classmate(object):
def __init__(self):
self.names = [11,22,33]
# 创建类对象从概念上理解也可以称为调用类实例
classmate = Classmate()
# for 循环实现迭代功能 从一个实例对象中一个一个的取内容,取一个,指针移动到下一个内容,在往出去一个,指针在移动到下一个
for i in classmate:
pass
# 如果一个对象想要被迭代,即可以正确使用for 循环 ,那么这个实例对象必要要有 __iter__ 方法
def __iter__(): pass # 即便我什么也不做,但他只要有__iter__() 方法,它就是一个可迭代对象,但它不具备可以被迭代的功能 return xxx # 这个对象想要被迭代 你只有__iter__ 方法只是第一步,第二步还要__iter__ 返回一个对象的引用
场景:
class Classmate(object):
def __init__(self):
self.names = list()
def add(self,name):
self.names.append(name)
# 重点
def __iter__(self):
return ClassIterable(self)
实例对象: 指的是 Classmate
步骤二:
# 想要使用for 循环 第一步先要看对象是否是可迭代对象,即它具备__iter__ 方法,第二步要看可迭代对象的__iter__ 方法,引用的返回值是否具备 __iter__ 方法 和__next__ 方法 class Classmate(object): def __init__(self): self.names = [11,22,33] # 首要具备条件 def __iter__(self): return ClassIterable # 返回ClassIterable对象的引用 / 必须返回一个迭代器
迭代器具备:__iter__ 和 __next__ 方法
# 所谓引用它就会执行ClassIterable中的内容 class ClassIterable(object): def __iter__(self): pass # 如果引用ClassIterable类 对于for循环来说 ,就会调用 __next__ 方法 # 调用一次取一个,for 每循环一次,都会调用__next__ ,直到 可迭代对象中没有内容 def __next__(self): pass
__next__ 方法类似c++ 中的指针 [11,22,33] 我如果已经取了11,__next__ 方法会将指针指向22,等待我区22,如果我取了22,__next__ 方法会指向33
class Classmate(object): def __init__(self): self.names = [11,22,33] def __iter__(self): return ClassIterable(self) # 这是什么意思,Classmate()对象把自己的引用返回给了 ClassIterator 一份 class ClassIterable(object): def __iter__(self,obj): self.obj = obj def __init__(self): pass def __next__(self): return self.obj.names classmate = Classmate()
如果类 Classmate 实例对象想要被迭代,必须具备以上函数功能要求
1. 实例对象自己有没有 __iter__ 方法
2. 自己的__iter__方法的返回值(实例对象)是不是一个迭代器。
3.如何判断是不是一个迭代器,看它具备 __iter__ 和__next__ 方法不。
4.如果都满足说明这个小伙子可以使用for循环来遍历结果,迭代对象不一定能被for循环遍历,看它自己 __iter__方法,返回的实例对象具备 __iter__ 和__next__ 方法不,如果具备说明可行,如果不具备,说明不能被for循环遍历
5.for 循环遍历的对象一定是一个迭代器或者 迭代器对象
上代码:
可迭代的实例对象:
import time
class Classmate(object):
def __init__(self):
self.names = list()
def add(self,name):
self.names.append(name)
def __iter__(self):
return ClassIterable(self) # 这是什么意思,Classmate()对象把自己的引用返回给了 ClassIterator 一份
class ClassIterable(object):
def __init__(self,obj):
self.obj = obj
self.current = 0
def __iter__(self,obj):
pass
def __next__(self):
if self.current < len(self.obj.names) :
ret = self.obj.names[self.current]
self.current += 1
return ret
else:
raise StopIteration # 抛出异常 异常的作用我想是结束for循环
classmate = Classmate()
classmate.add("小王")
classmate.add("小李")
for d in classmate:
print(d)
time.sleep(1)
迭代器对象:
import time
class Classmate(object):
def __init__(self,):
self.names = list()
self.current = 0
def add(self,name):
self.names.append(name)
def __iter__(self):
return self # 返回自己
def __next__(self):
if self.current < len(self.names) :
ret = self.names[self.current]
self.current += 1
return ret
else:
raise StopIteration # 抛出异常 异常的作用我想是结束for循环
classmate = Classmate()
classmate.add("小王")
classmate.add("小李")
for d in classmate:
print(d)
time.sleep(1)
# 迭代器一定可以迭代,可迭代的对象不一定是迭代器
那么python中如何检查一个对象是不是迭代器对象呢
什么可以称为迭代对象 一个类中存在__iter__方法
什么可以称作迭代器对象 一个类中存在 __iter__ 和 __next__() 方法我们就可以把他称为迭代器对象
如何检查一个对象是不是迭代器对象
from collection import Iterable # 导入模块 Iterable 被称为可迭代对象,在python 中任意对象 只要它定义了一个可迭代方法 __iter__ 方法,或者定义了可以支持下标索引的__getitem__方法 ,那么它就是一个可迭代对象 # 我们常见的可迭代对象包括 list, tuple dict set str ,不可迭代对象 int folt # isinstance() 方法的作用判断 一个东西的生成是否受到另一个东西的影响 # isinstance(a,A) 如果a的出现是受到A的影响 isinstance() 方法就会返回一个True