Python 迭代器

在了解迭代器之前,我们需要明确一个概念--可迭代对象。什么是可迭代对象,在Python中能够使用for...in...来进行遍历的对象都可以称为可迭代对象。

一、可迭代对象与不可迭代对象

如何判断一个对象是否是可迭代对象(即能否用for...in...循环来遍历),可以通过

isinstance(obj, Iterable)方法进行判断

#  判断一个对象是否是可迭代对象:
#  导入Iterable
from collections.abc import Iterable 
   
# 判断一个字典是否是可迭代对象
d = {"name": "hhh", "age": "122"}
print(isinstance(d, Iterable))

>> True

常见的可迭代对象有:列表、元组、字符串、字典

常见的不可迭代对象有:整数、浮点数

二、迭代器

了解了可迭代对象,那么什么是迭代器呢?二者之间又有什么关系呢?

迭代器是一种特别的对象,它可以记住遍历对象的位置,它的特点是从集合的第一个元素开始访问,直到所有元素访问完结束。

不同于可迭代对象,迭代器对象不仅可以通过for...in...循环来遍历,还能通过next()来获取下一个元素。同时,可迭代对象可以通过Iter()方法将自己转变为迭代器对象,也就是说迭代器一定是可迭代对象,可迭代对象不一定是迭代器。

若是直接对可迭代对象使用next()遍历会有什么结果呢?如下:

    test_l = [1, 2, 5]
    print(next(test_l))

 那么对于迭代器对象呢?使用for循环与next()都获取元素,不同的是next()方法一次只能获取一个,若是取完后再取,则此时会抛出StopIteration异常。

test_l = [1, 2, 3, 4]

# 获取可迭代对象的迭代器对象
Iter = iter(test_l)

# 使用for循环来遍历迭代器对象
for i in Iter:
    print(i)

>> 1
>> 2
>> 3
>> 4

# 使用next()方法来遍历
print(next(Iter))
>> 1

三、迭代器对象的本质及自定义迭代器 

实现迭代器的关键是__iter__()和__next__()方法,如果一个类中实现了__iter__方法,则该类创建出来的对象就是可迭代对象;如果一个类中同时实现了__iter__()和__next__()方法,那么该类创建出来的对象就是迭代器对象。

当对一个可迭代对象调用iter()函数时,它会自动调用这个可迭代对象的__iter__()方法,这个方法返回的对象当做迭代器
当对一个迭代器对象调用next()函数时,它会自动调用这个迭代器对象的__next__()方法,这个方法返回想要的下一个数据

知道了迭代器对象的本质,我们就可以自定义一个类来生成迭代器对象:

# 自定义类实现迭代器
class SelfListIterable:
    def __init__(self):
        self.ls = []
        self.current = 0

    def add(self, ele):
        self.ls.append(ele)

    def __iter__(self):
        # __iter__方法的作用:标记当前类创建出来的对象是可迭代对象;返回指定的迭代器
        # myiterator = SelfIeterator(self)  # 迭代器
        return self

    def __next__(self):
        # __next__方法作用:标记当前类创建出来的对象是迭代器(前提是必须先有__iter__方法)
        # 当调用next()函数时这个方法会被自动调用,它返回一个数据
        # print(self.current, len(self.ls))
        if self.current < len(self.ls):
            ele = self.ls[self.current]
            self.current += 1
            return ele
        else:
            raise StopIteration

# 实例化一个对象
mylist = SelfListIterable()  
mylist.add(23)
mylist.add(45)

print("mylist是否是可迭代对象: %s"%(isinstance(mylist, Iterable)))
>>mylist是否是可迭代对象: True

print("mylist是否是迭代器: %s"%(isinstance(mylist, Itertor)))
>>mylist是否是迭代器对象: True

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在Python迭代器是一种用于遍历可迭代对象的对象。一个对象要成为迭代器,需要实现两个方法:__iter__和__next__。__iter__方法返回迭代器本身,而__next__方法返回下一个迭代器对象。\[1\] 迭代器本身也是可迭代的,所以它也要实现__iter__方法并返回自身。\[1\] 一个对象只有同时实现了__iter__和__next__方法,才能被称为迭代器。\[1\] 在Python可迭代对象是指实现了__iter__方法的对象。可迭代对象可以使用isinstance()函数来判断是否是可迭代对象。\[1\] 迭代器可迭代对象的一种特殊形式,它具有返回下一个迭代器对象的功能。\[2\] 可以使用isinstance()函数来判断一个对象是否是迭代器。\[2\] 下面是一个示例代码,展示了如何实现一个迭代器和一个可迭代对象: ```python class MyIterator: def __init__(self, data): self.data = data self.index = 0 def __iter__(self): return self def __next__(self): if self.index >= len(self.data): raise StopIteration value = self.data\[self.index\] self.index += 1 return value class MyIterable: def __init__(self): self.data = \[\] def add(self, item): self.data.append(item) def __iter__(self): return MyIterator(self.data) myIterable = MyIterable() myIterable.add(1) myIterable.add(2) myIterable.add(3) print(isinstance(myIterable, Iterable)) # 输出True,表示myIterable是可迭代对象 print(isinstance(myIterable, Iterator)) # 输出False,表示myIterable不是迭代器 for item in myIterable: print(item) # 输出1、2、3 ``` 在上面的示例,MyIterator是一个迭代器,它实现了__iter__和__next__方法。MyIterable是一个可迭代对象,它实现了__iter__方法并返回一个迭代器对象。通过使用isinstance()函数,我们可以判断一个对象是否是可迭代对象迭代器。\[1\]\[2\] #### 引用[.reference_title] - *1* [Python迭代器(Iterator)](https://blog.csdn.net/weixin_45068714/article/details/126863082)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Python 迭代器(Iterator)](https://blog.csdn.net/qq_45807032/article/details/105219674)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值