Python3 迭代器与生成器 学习总结

迭代器

介绍
迭代是访问集合元素的一种方式,是 python 最强大的功能之一。

迭代器是一个可以记住遍历的位置的对象,该对象访问时从第一个元素开始访问,类似于Java中的 iterator ,每次都指向下一个元素,不会回退,直到全部访问完。

两个基本方法 iter() next()

iter() 用于创建迭代器,字符串,列表以及元组都可以作为入参
next() 用于获取下一个元素

示例:

>>> list1 = ["aaa", 'bbb', "ccc", 'ddd'];
>>> iter1 = iter(list1)
>>> print(next(iter1))
aaa
>>> print(next(iter1))
bbb
>>>

因为属于迭代对象 所以也可以使用 for 去遍历该迭代器

也可以如下操作:

>>> import sys
>>> list1 = ["aaa", 'bbb', "ccc", 'ddd'];
>>> iter1 = iter(list1)
>>> while True:
...     try:
...         print(next(iter1))
...     except StopIteration:
...         sys.exit()
...
aaa
bbb
ccc
ddd

迭代器创建

当将一个类作为迭代器来使用时需要实现 __iter__() 与 __next__() 两个方法

__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的结束,

__next__() 方法 会返回下一个迭代器对象

例如:
创建一个普通的数字递增的迭代器

class numberIncreat:
    def __iter__(self):
        self.a = 1
        return self

    def __next__(self):
        x = self.a
        self.a += 1
        return x
        
class1 = numberIncreat()
iter1 =iter(class1)

print(iter1)
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))
迭代器异常 StopIteration

StopIteration 异常用于标识迭代器迭代的完成,防止不停的迭代下去,可以在 __next__ 中设定指定的迭代次数,达到指定次数后使用该异常终止,具体可以可以参考如下:

>>> class numberIncreat:
...     def __iter__(self):
...         self.a = 1
...         return self
...     def __next__(self):
...         if self.a <= 10:
...             x = self.a
...             self.a += 1
...             return x
...         else:
...             raise StopIteration
...
>>> class1 = numberIncreat()
>>> iter1 =iter(class1)
>>> for item in iter1:
...     print(item)
...
1
2
3
4
5
6
7
8
9
10

生成器(generator)

Python 中使用yield 的函数被称为生成器
生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行

调用一个生成器函数,返回的是一个迭代器对象

参考如下:

import sys

# 函数定义
def function1(n):
    a, b, stopNum = 0, 1, 0;
    while True:
        if stopNum > n:
            return;
        yield a;
        a, b = b, a + b;
        stopNum  += 1;
# 生成器返回迭代器对象
gene1 = function1(10);

# 迭代
while True:
    try:
        print(next(gene1), end=", ");
    except StopIteration:
        sys.exit();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值