怎样让我们自己创建的对象可以使用for in进行遍历?
实现__getitem__方法。或者实现__iter__方法。
注意:__iter__方法优先级高于__getitem__方法
# 怎样让我们自己创建的对象可以使用for in进行遍历? # # 实现__getitem__方法。或者实现__iter__方法。 # # # # 怎样让我们自己创建的对象可以使用next函数进行访问? # # 补充: # 方式1 # class Person: # def __init__(self): # self.result = 0 # def __getitem__(self, item): # self.result += 1 # if self.result >= 6: # raise StopIteration("停止遍历") # # return self.result # pass # # p = Person() # # for i in p: # print(i) # 方式2 class Person: def __init__(self): self.result = 0 # def __getitem__(self, item): # print("getitem") # self.result += 1 # if self.result >= 6: # raise StopIteration("停止遍历") # # return self.result def __iter__(self): print("iter") # return iter([1, 2, 3, 4, 5]) return self def __next__(self): self.result += 1 if self.result >= 6: raise StopIteration("停止遍历") return self.result pass p = Person() # for i in p: # print(i) print(next(p)) print(next(p)) print(next(p)) print(next(p)) print(next(p)) print(next(p))
怎样让我们自己创建的对象可以使用next函数进行访问?
print(next(p)) print(next(p)) print(next(p)) print(next(p)) print(next(p)) print(next(p))
补充:
恢复迭代器初始值
class Person: def __init__(self): self.age = 1 def __iter__(self): # 加入self.age = 1就可以使迭代器复用,将age初始化为1了。 self.age = 1 return self def __next__(self): self.age += 1 if self.age >= 6: raise StopIteration("遍历操作停止") return self.age p = Person() for i in p: print(i) for i in p: print(i) import collections print(isinstance(p, collections.Iterator))
补充:
判定是否为可迭代对象
一个迭代器肯定是一个可迭代对象。而一个可迭代对象,不一定是迭代器。因为:迭代器需要判定__iter__和__next__两个。迭代对象只需要判定__iter__。
# 判定是否为可迭代对象
import collections
print(
isinstance(p
, collections.Iterable))
补充:
一个可迭代对象,肯定可以通过for in进行访问。但是能通过for in访问的,不一定是可迭代对象。因为:当对象中使用__getitem__时for in 可以访问。但是因为没有__iter__这个标志。不会为可迭代对象。
补充:
iter函数的使用
class Person: def __init__(self): self.age = 1 # def __getitem__(self, item): # self.age += 1 # if self.age >= 6: # raise StopIteration("遍历终止") # return self.age def __iter__(self): # 加入self.age = 1就可以使迭代器复用,将age初始化为1了。 self.age = 1 return self # def __next__(self): # self.age += 1 # if self.age >= 6: # raise StopIteration("遍历操作停止") # return self.age def __call__(self, *args, **kwargs): self.age += 1 if self.age >= 6: raise StopIteration("遍历操作停止") return self.age p = Person() # pt = iter(p) # print(pt is p) # # for i in pt: # print(i) # pt = iter(p.__next__, 4) pt = iter(p, 4) for i in pt: print(i) # l = [1, 2, 3] # lt = iter(l) # print(lt) # print(next(lt)) # print(next(lt)) # print(next(lt))