欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

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” 

四、可迭代对象的优缺点

优点

  1. 直观
  2. 操作方法较多

缺点 

  1. 占内存
  2. 不能迭代取值(索引,字典的key)

参考资料:

https://www.cnblogs.com/zanao/p/11054838.html

https://www.cnblogs.com/eastonliu/p/9156418.html

https://www.jianshu.com/p/0e06ba6601c3