python中的迭代器和生成器

本文介绍了Python中的迭代器和生成器,包括它们的工作原理、实现方法(如`__next__`和`__iter__`),以及生成器的独特之处(如yield关键字和暂停执行)。同时,讲解了如何通过`next()`、`for`循环和list/tuple函数操作生成器。

一、迭代器

支持迭代的容器,如列表(list)、元组(tuple)、字典(dict)、集合(set)这些序列式容器。

自定义迭代器的类中必须实现以下2个方法:

__next__(self):返回容器的下一个元素。
__iter__(self):该方法返回一个迭代器(iterator)。

除此之外,Python 内置的 iter() 函数也会返回一个迭代器,该函数的语法格式如下:

iter(obj[, sentinel])

其中,obj 必须是一个可迭代的容器对象,而 sentinel 作为可选参数,如果使用此参数,要求 obj 必须是一个可调用对象(__call__)。

二、生成器

特殊的迭代器,与迭代器不同的是,它可以实现在迭代的同时生成元素,而迭代器必须先将所有数据存储到容器中,才能开始迭代

生成器创建方式也比迭代器简单很多:

定义一个以 yield 关键字标识返回值的函数;
调用刚刚创建的函数,即可创建一个生成器。

def intNum():
    print('开始执行')
    for i in range(5):
        yield i
        print('继续执行')
num = intNum()  # 成功过创建了一个num生成器对象

和 return 相比,yield 除了可以返回相应的值,还有一个更重要的功能,即每当程序执行完该语句时,程序就会暂停执行。

print(intNum()) 即便调用生成器函数,Python 解释器也不会执行函数中的代码,它只会返回一个生成器(对象)。

要想使生成器函数得以执行,或者想使执行完 yield 语句立即暂停的程序得以继续执行,有以下 2 种方式:

通过生成器(上面程序中的 num)调用 next() 内置函数或者 __next__() 方法
通过 for 循环遍历生成器

# 调用next()内置函数
print(next(num))

# 调用__next()__方法
print(num.__next__())

# 通过for循环遍历生成器
for i in num:
    print(i)

 

 除此之外,还可以使用 list() 函数和 tuple() 函数,直接将生成器能生成的所有值存储成列表或者元组的形式。例如:

num = intNum()
print(list(num))

num = intNum()
print(tuple(num))

迭代器生成器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、付费专栏及课程。

余额充值