python之__iter__函数与__next__函数

容器(container)

容器是用来储存元素的一种数据结构,容器将所有数据保存在内存中,Python中典型的容器有:list,set,dict,str等等。

class test():
    def __init__(self,data=1):
        self.data = data

    def __iter__(self):
        return self
    def __next__(self):
        if self.data > 5:
            raise StopIteration
        else:
            self.data+=1
            return self.data

for item in test(3):
    print(item)

for … in… 这个语句其实做了两件事。第一件事是获得一个可迭代器,即调用了__iter__()函数。
第二件事是循环的过程,循环调用__next__()函数。

对于test这个类来说,它定义了__iter____next__函数,所以是一个可迭代的类,也可以说是一个可迭代的对象(Python中一切皆对象)。

迭代器

含有__next__()函数的对象都是一个迭代器,所以test也可以说是一个迭代器。如果去掉__itet__()函数,test这个类也不会报错。如下代码所示:

class test():
    def __init__(self,data=1):
        self.data = data

    def __next__(self):
        if self.data > 5:
            raise StopIteration
        else:
            self.data+=1
            return self.data

t = test(3)   
for i in range(3):
    print(t.__next__())

生成器

生成器是一种特殊的迭代器。当调用fib()函数时,生成器实例化并返回,这时并不会执行任何代码,生成器处于空闲状态,注意这里prev, curr = 0, 1并未执行。然后这个生成器被包含在list()中,list会根据传进来的参数生成一个列表,所以它对fib()对象(一切皆对象,函数也是对象)调用__next()__方法,

def fib(end = 1000):
    prev,curr=0,1
    while curr < end:
        yield curr
        prev,curr=curr,curr+prev


print(list(fib()))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]

简单理解Python迭代器

迭代器

在使用列表时,直接将数据存入列表将会占据大量空间,且复用率较低,为解决这个问题,这里了解一下迭代器,从而创建一种数据产生的方式,以此来节省空间。

迭代对象

注意,这里需要使用到内建函数__iter__,简单理解为,使用了__iter__才会是一个可迭代对象,关于这部分,我们可以对一些对象做一些判断,从而清楚是不是可迭代对象,比如L1列表:

from collections.abc import Iterable
# 判断L1是否为可迭代对象
L1 = [i for i in range(4)]
print(isinstance(L1, Iterable)) # 结果为True,确定为迭代对象

这里我们使用__iter__()方法和__next__()方法来将元素取出。

L2 = L1.__iter__()
# L2 = iter(L1) # 和上面一句等价
print(next(L2))
print(L2.__next__()) # 和上面一句等价
print(next(L2))

在这里我们实现了使用for循环来取出元素的方法,在了解这里之后,我们开始做一个自己的迭代器

# 构造迭代器
class NewIter():
    # 用于生成斐波那契数列
    def __init__(self, num):
        self.num = num
        self.a = 0
        self.b = 1

    def __iter__(self):
        # 创建可迭代对象
        return self
    
    def __next__(self):
        while self.num > 0:
            result = self.a
            self.a, self.b = self.b, self.a + self.b
            self.num -= 1
            return result
        # 循环结束后跳出
        raise StopIteration
        
new_iter = NewIter(5)
print(next(new_iter))
print(next(new_iter))

生成器

这里引入生成器个概念,生成器能做到迭代器能做的所有事,由于自动创建了iter()next()方法,生成器显得特别简洁。除了创建和保存程序状态的自动方法,当发生器终结时,还会自动抛出 StopIteration 异常。简单理解他就是迭代器的一种!!使用yield即可实现。

# 生成器实现
def new_create(num):
    # 用于生成斐波那契数列
    a, b = 0, 1
    while num > 0:
        yield a
        a, b = b, a+b
        num -= 1
        
new_iter = new_create(5)
print(next(new_iter))
print(next(new_iter))

结语

目的就是节省空间,提高复用率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值