python中的迭代器和生成器

本文深入解析Python中的迭代器和生成器概念,通过具体代码示例解释两者的工作原理及区别。迭代器通过实现__iter__和__next__方法进行元素遍历,而生成器则是一种特殊的迭代器,用于生成序列,特别适用于大数据处理。

python中的迭代器和生成器

迭代器

看如下代码:

class A:
def __init__(self, data): self.data = data def __iter__(self): return self # __iter__方法返回的就是一个迭代器。reurn的这个self对象就是下面的__next__方法的结果,如果不写__next__方法,将return self替换为(i+1 for i in range(x) if x < 6)即可 def __next__(self): if self.data > 7: raise StopIteration else: self.data += 1 return self.data for i in A(5): print(i)

输出结果:

6

7

8

这里面的for ... in ... 做了两件事:

  1. 调用了A的__iter__()方法,就是要得到一个iteration迭代器,就是这个self,而这里的self此时是__next__()方法返回的迭代器。
  2. 循环调用了__next__()方法。

对于A这个类,它里面定义了__iter__()和__next__()方法,他就是一个可迭代的类。也可以说是一个可迭代的对象(python中一切皆对象)。

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

如下代码所示:

class A:

    def __init__(self, data):
        self.data = data

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

生成器

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

# 斐波那契数列
def
f(end = 1000): p, c=0,1 while c < end: yield c p, c=c, c+p print(list(f()))

结果如下:

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]

也可以这样:

def f(end = 1000):
    p, c=0,1
    while c < end:
        yield c
        p, c=c, c+p

a = f()print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())

一次只取一个数。

posted @ 2018-12-25 20:59 aaronthon 阅读( ...) 评论( ...) 编辑 收藏
迭代器生成器Python 中用于处理可迭代对象的两种重要机制。 迭代器是一个实现了迭代协议的对象,它通过定义 `__iter__()` `__next__()` 方法来实现。`__iter__()` 方法返回迭代器本身,而 `__next__()` 方法返回下一个元素。当没有更多元素时,`__next__()` 方法会引发 `StopIteration` 异常。可以使用内置的 `iter()` 函数从可迭代对象中获取迭代器生成器是一种特殊的迭代器,它使用函数来创建。生成器函数使用 `yield` 语句来产生一个值,并在下次调用时从离开的地方继续执行。与普通函数不同,生成器函数在调用时不会立即执行,而是返回一个生成器对象。可以使用 `next()` 函数或 `for` 循环来迭代生成器对象。 使用生成器可以有效地处理大型数据集或无限序列,因为它们按需生成值,而不需要一次性将所有值存储在内存中。 下面是一个迭代器生成器的示例代码: ```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 my_iter = MyIterator([1, 2, 3]) for num in my_iter: print(num) # 生成器示例 def my_generator(data): for num in data: yield num my_gen = my_generator([1, 2, 3]) for num in my_gen: print(num) ``` 输出结果为: ``` 1 2 3 1 2 3 ``` 希望以上内容能对你有所帮助!如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值