迭代器的作用

迭代器1:

import time


class Classmates(object):
    def __init__(self):
        self.names = list()

    def add(self, name):
        self.names.append(name)

    def __iter__(self):
        """如果想要一个对象成为一个可以迭代的对象,即可以使用for,那么必须实现__iter__方法"""
        return ClassIterator(self)


class ClassIterator(object):
    def __init__(self, obj):
        self.obj = obj
        self.current_num = 0

    def __iter__(self):
        pass

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


classmate = Classmates()
classmate.add("张三")
classmate.add("李四")
classmate.add("王五")


"""循环遍历一个对象:
for name in classmate:
    pass
这两行代码可以解读为:
1.判断classmate是否可以迭代
2.在第1步成立的前提下,自动调用iter函数,得到classmate对象的__iter__方法的返回值
3.__iter__方法的返回值是一个迭代器 
4.__iter__方法返回的是哪一个对象的引用,就执行哪一个对象对应的类中的__next__方法
    """
for name in classmate:
    print(name)
    time.sleep(1)

迭代器2:

import time


class Classmate(object):
    def __init__(self):
        self.names = list()
        self.current_num = 0

    def add(self, name):
        self.names.append(name)

    def __iter__(self):
        return self

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


classmate = Classmate()
classmate.add("张三")
classmate.add("老王")
classmate.add("李四")


"""
for name in classmate:
    print(name)
    
解读:
1.先判断classmate对象是否是可迭代对象(就看这个对象对应的类里面有没有__iter__方法)
2.如果是可迭代对象,自动调用iter函数进入到__iter__方法中,查看__iter__方法的返回值
3.__iter__方法返回什么(哪个对象),就执行它(哪个对象对应的类)下面的__next__方法代码(这里返回自身,就执行自己内部的__next__方法)
4.把__next__方法的返回值赋给name,此时name 就表示__next__方法的返回值

"""
for name in classmate:
    print(name)
    time.sleep(1)

迭代器的作用(重点):

"""使用for...in 来遍历fibonacci数列的前10个值
法一:使用列表先把斐波那契数列的前10个数存起来,再遍历
代码如下:
nums = list()
a = 0
b = 1
i = 0
while i < 10:
    nums.append(a)
    a, b = b, a + b
    i += 1

for num in nums:
    print(num)
    

法二:用迭代器实现,代码如下


比较:使用列表的方式要先往列表中存入数,数值太多时会占用大量的存储空间;
而使用迭代器的好处是 节省存储空间,因为迭代器里面存储的是不是数据本身,而是生成数据的方法,
只占用生成数据方法的几行代码空间,所以占用内存少   
"""


class Fibonacci(object):

    def __init__(self, all_num):
        self.all_num = all_num
        self.current_num = 0
        self.a = 0
        self.b = 1

    def __iter__(self):
        return self

    def __next__(self):
        if self.current_num < self.all_num:
            ret = self.a
            self.a, self.b = self.b, self.a + self.b
            self.current_num += 1
            return ret
        else:
            raise StopIteration


if __name__ == "__main__":
    fibo = Fibonacci(10)
    for num in fibo:
        print(num)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

*Heygirl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值