谈谈个人对python3中迭代器的理解

目前在重新学习python,在学习python时重新学习到迭代器,这里对迭代器进行总结;

首先是一些基础的定义:
(1)可迭代对象:
目前来说,数组,元组集合,字典,字符串都是可迭代对象,这些可迭代对象都是python原生提供的,除了python原生提供的可迭代对象之外,我们还可以自己去创建可迭代的对象,对于自己创建的可迭代对象来说,只要是实现了__iter__()方法,那么这个对象就是可迭代对象;具体可以看以下的实例:

    from collections import Iterable

	class IteratorInstance(object):
	    def __init__(self):
	        pass
	
	    def __iter__(self):
	        pass
	
	
	it = IteratorInstance()
	print(isinstance(it, Iterable))

如上述代码所示,在IteratorInstance类中添加了__iter__()方法之后,它就是可迭代的,我们可以采用isinstance方法来判断对象是否可迭代返回为True即表示可迭代

在这里插入图片描述
(2)迭代器对象:
迭代器对象是在可迭代对象的基础上更进了一步,你可以说迭代器对象是可迭代的,反之则不行;怎样生成一个迭代器对象呢?其实很简单,在可迭代对象类中添加__next__()方法,由该类生成的对象即是迭代器对象;

from collections import Iterable
from collections import Iterator

class IterableInstance(object):
    def __init__(self):
        pass

    def __iter__(self):
        pass

class IteratorInstance(object):
    def __init__(self):
        pass
    def __iter__(self):
        pass
    def __next__(self):
        pass

it = IterableInstance()
it2 = IteratorInstance()

print(isinstance(it, Iterable))
print(isinstance(it, Iterator))
print(isinstance(it2, Iterable))
print(isinstance(it2, Iterator))

在上述例子中,我们分别生成了一个迭代器类和可迭代类,最终print返回的结果如下:

True
False
True
True

由此证明了,迭代器对象是可迭代对象,但是可迭代对象不一定是迭代器对象

接下来,我们要模拟如何创建一个迭代器类,并生成一个迭代器对象,对该迭代器进行迭代,这里我们阐述以下迭代器运算的方式,对于迭代器类来说,我们需要创建一个迭代器类,而迭代器类需要实现__iter__()方法和__next__()方法,iter()方法需要我们返回一个迭代器对象A,之后进行迭代的过程中,我们会调用该可迭代对象A的__next__()方法进行迭代,一般情况下,我们返回的可迭代对象是我们自身,然后调用自身的__next__()方法:

class IteratorInstance(object):
    def __init__(self,num):
        self.nums = list()
        for i in range(num):
            self.nums.append(num - i)
        self.num = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.num < len(self.nums):
            ret = self.nums[self.num]
            self.num += 1
            return ret
        else:
            raise StopIteration

it = IteratorInstance(10)
print(it.nums)
it1 = iter(it)
print(next(it1))
print(next(it1))
print(next(it1))
print(next(it1))
print(next(it1))

可以看到,我们先创建了一个迭代器类,然后实例化成对象,当我们执行iter()方法时,即调用了对象的__iter__()方法,该方法返回给我们一个可以迭代的对象,之后我们执行next方法,即可以调用该对象的__next__()方法,需要注意的是,我们这边__iter__()方法返回的对象是我们自身,当然也可以是其他的对象;以下是执行上述代码之后,具体的返回结果:

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
10
9
8
7
6

除了上述的方法对对象进行迭代,也可以采用for循环进行迭代,具体代码如下:

class IteratorInstance(object):
    def __init__(self,num):
        self.nums = list()
        for i in range(num):
            self.nums.append(num - i)
        self.num = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.num < len(self.nums):
            ret = self.nums[self.num]
            self.num += 1
            return ret
        else:
            raise StopIteration

its = IteratorInstance(10)

for it in its:
    print(it)

返回结果如下:
10
9
8
7
6
5
4
3
2
1

需要注意的是,当我们在采用for循环的开始,即调用了iter()的方法,并采用该方法返回一个新的可迭代对象,并采用该可迭代对象,调用__next__()方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值