Python基础之迭代器

Python基础之迭代器

本节将介绍Python中的迭代器以及如何为自己的类添加迭代功能。


我们知道,在Python中有 for...in... 的语法,通过该语法可以方便的遍历某个容器中的所有元素。之所以能够这样操作,是因为这些容器都实现了迭代器功能,例如列表,元组,字符串,字典等。

遍历容器

下面这个例子将介绍通过迭代器遍历列表,元组,字符串和字典。例如:

my_list = [1, 2, 3, 4, 5]
my_iter = iter(my_list)
while True:
    try:
        print(next(my_iter), end=" ")
    except StopIteration as e:
        break

print()

my_tuple = [1, 2, 3, 4, 5]
my_iter = iter(my_tuple)
while True:
    try:
        print(next(my_iter), end=" ")
    except StopIteration as e:
        break

print()

str = "This is a string."
my_iter = iter(str)
while True:
    try:
        print(next(my_iter), end=" ")
    except StopIteration as e:
        break

print()

dic = {'name': 'xiaoming', 'age': 24, 'sex': 'M'}
my_iter = iter(dic)
while True:
    try:
        print(next(my_iter), end=" ")
    except StopIteration as e:
        break

运行结果:

D:\work\python_workspace\python_study\venv\Scripts\python.exe D:/work/python_workspace/python_study/basic_10/iterator_01.py
1 2 3 4 5 
1 2 3 4 5 
T h i s   i s   a   s t r i n g . 
name age sex 
Process finished with exit code 0

可以看出,如果某个对象是可迭代的,那么我们可以通过调用iter()内置函数获取到该对象的迭代器对象,然后一直调用next()函数来遍历此迭代器。如果抛出StopIteration异常,那么表示原对象遍历完毕。

for循环的本质就是创建了一个迭代器对象,然后一直调用next()函数来完成遍历的。

自定义列表

可以创建一个自定义的列表,使其支持迭代器功能。例如:

class MyList:
    def __init__(self, data=[]):
        self.__data = data
        self.__index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if len(self.__data) == 0 or self.__index >= len(self.__data):
            raise StopIteration
        element = self.__data[self.__index]
        self.__index += 1
        return element


my_list = MyList("Hello world!")
for i in my_list:
    print(i, end=" ")

print()

my_list = MyList([1, 2, 3, 4, 5])
my_iter = iter(my_list)
while True:
    try:
        print(next(my_iter), end=" ")
    except StopIteration as e:
        break

运行结果:

D:\work\python_workspace\python_study\venv\Scripts\python.exe D:/work/python_workspace/python_study/basic_10/iterator_02.py
H e l l o   w o r l d ! 
1 2 3 4 5 
Process finished with exit code 0

要让自己的某个类是可迭代的,需要实现两个方法,__iter__(self) 和 __next__(self)。前者可以做一些初始化的工作,但必须返回self本身,后者用于实现如何得到下一个元素的逻辑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值