python 遍历操作
遍历 for in
什么是遍历:按照特定次序访问数据元素的过程。
for in 语句in后面跟 可迭代对象/迭代器/支持序列协议的对象
什么是可迭代对象/迭代器/支持序列协议的对象呢
实现了__iter__方法的对象叫可迭代对象
实现了__iter__与__next__方法的对象叫迭代器
序列协议 — Python 3.7.13 文档
有点抽象对吧
下面我们看实例(需要学习完面向对象知识!!!)
- _getitem_(self, item)方法( 注意停止条件,否则一直循环)
def __init__(self):
self.result = 1
def __getitem__(self, item):
self.result += 1
if self.result >= 6:
print(item)
print("这是一个getitem方法")
raise StopIteration("停止遍历")
return self.result
我们可以用Python的一个库来判断一个对象是可迭代对象还是迭代器
# Iterator 迭代器
# Iterable 可迭代对象
from collections.abc import Iterator, Iterable
a = 1
print(isinstance(a, Iterable))
- _iter_(self)方法( 该方法的优先级大于__getitem__方法 )实现了__iter__方法,叫作可迭代对象
def __iter__(self)
return self
- __iter__和__next__方法 实现了这两个方法,叫作迭代器
def __init__(self):
self.result = -1
def __iter__(self):
self.result = -1
return self
def __next__(self):
self.result += 1
if self.result > 6:
raise StopIteration("停止遍历")
return self.result
注意:当我们把__iter__注释,留下_next_,此时,这个对象也可以用next函数/__next__来进行取值
但是不能用for - in 来遍历,它不是可迭代对象也不是迭代器了
def __init__(self):
self.result = -1
def __next__(self):
self.result += 1
if self.result > 6:
raise StopIteration("停止遍历")
return self.result
小知识点:for in 的原理或者说他是怎么实现循环取值的
先用iter函数将需要进行遍历的对象转换为迭代器,在用next函数来对这个迭代器进行取值
当我们使用iter(对象)函数时,将会调用该对象的_iter_方法, 但是该方法是返回一个迭代器,所以我们只实现__iter__方法没有实现迭代器取值逻辑或依据时,会报错。我们还需要实现__next__方法,才可以使用iter函数将对象转换为一个迭代器
如果这个对象不是可迭代对象,但是***支持序列访问协议(_getitem_)***那也可以用iter将其变成迭代器
iter函数
当我们传两个参数的时候iter(对象, 终止值)
会直接调用对象,所以我们要实现__call()__方法,让对象变成可被调用,随后返回一个callable_iterator对象,该对象是迭代器,可以取值,取值范围是终止值 4
def __call__(self, *args, **kwargs):
print("call")
if self.result >2:
raise StopIteration()
self.result += 1
return self.result
a = Animal()
pt = iter(a, 4)
print(pt)
for i in pt:
print(i)