Python学习笔记5:了解可迭代对象
最编程
2024-01-13 21:13:59
...
一、什么是可迭代对象?
大白话:可以重复迭代的东西
专业话:实现了__iter__方法的对象就是可迭代对象
- 实现了__iter__方法的对象就叫做可迭代对象,__iter__方法的作用就是返回一个迭代器对象。
- 直观理解就是能用for循环进行迭代的对象就是可迭代对象。
- 比如:字符串、列表、元组、字典、集合等,都是可迭代对象。
for循环与__iter__方法又有什么关系呢?
list = [1, 2, 3]
for i in list:
print(i)
实际执行情况如图:
运行原理:
- 调用可迭代对象的__inter__方法返回一个可迭代对象(iterator)
- 不断调用迭代器的__next__方法返回元素
- 直到迭代完成之后,返回一个StopIteration异常
二、怎么查看一个对象是否是可迭代对象?
第一种方法:利用dir()方法
list = [1, 2, 3] print(dir(list))
- 输出:['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
第二种方法:
list = [1, 2, 3] print('__iter__' in dir(list))
- 输出:True(True:可迭代对象;False:不可迭代对象)
三、自定义可迭代对象
实现了__iter__方法的对象就是可迭代对象。
__iter__ 函数
- 需要返回一个可迭代的对象,一般都是对象本身(当然对象本身也必须是可迭代的)
__next__ 函数
- next函数用来取值,就是返回一个数据,也就是for中每次循环的取值。
- __next__ 函数两个事项:返回数据和结束迭代
- 迭代结束机制使用的是异常机制,抛出StopIteration异常即可
class IteratorTest:
def __iter__(self):
return self
T = IteratorTest()
print('__iter__' in dir(T)) # True
上述代码中的类已是可迭代对象,但此时用还是不能用for循环迭代次类,会报错,因为没有实现__next__方法,没办法控制迭代的动作。
TypeError: iter() returned non-iterator of type 'int'
一个自定义可迭代对象的完整代码如下所示:
class IteratorTest:
def __init__(self):
self.counter = 0
def __iter__(self):
return self
def __next__(self):
if self.counter >= 5:
raise StopIteration
else:
self.counter += 1
return "x"
T = IteratorTest()
# print('__iter__' in dir(T))
for i in T:
print(i)
会输出5行“X”
四、可迭代对象的优缺点
优点
- 直观
- 操作方法较多
缺点
- 占内存
- 不能迭代取值(索引,字典的key)
参考资料:
https://www.cnblogs.com/zanao/p/11054838.html
https://www.cnblogs.com/eastonliu/p/9156418.html
https://www.jianshu.com/p/0e06ba6601c3
上一篇: Python里的迭代对象和迭代器解析