Python中的迭代器、生成器

本文深入探讨迭代器和生成器的概念与应用,讲解如何使用Python实现自定义迭代器,包括斐波那契数列迭代器。同时,介绍了生成器的两种创建方法及其在节省资源方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

迭代器

迭代时访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个远胜于开始访问,直到所有元素被访问完结束。迭代器只能往前不会后退。
迭代器的优点是占用极小的内存空间。

可迭代对象

列表、元组、字符串等类型的数据可以使用for…in…的循环来依次拿到数据进行使用,这个过程称为遍历,也叫迭代。
一个类中只要有__iter__方法,那么它就是一个可迭代对象;一个类中既有__iter_方法, 又有__next__方法,那么它就是一个迭代器。因此如果一个对象是一个迭代器,那么它一定可迭代;但是一个对象可迭代,它不一定是一个迭代器。

利用类的内置方法自己实现一个迭代器

若for temp in xxx_obj,那么该语句实现的实际流程为:

  1. 判断当前对象xxx_obj是否为可迭代的对象:看类对象中是否创建了方法__iter__。
  2. 在第1步成立的前提下,调用方法__iter__得到xxx_obj对象的__iter__方法返回值。
  3. __iter__方法的返回值是一个迭代器,而后调用__next__方法进行循环遍历。

下面给出自己实现的一个迭代器的代码:

from collections import Iterable
from collections import Iterator
class Classmate(object):
    def __init__(self):
        self.names = list()
        self.current_num = 0
    def add(self, name):
        self.names.append(name)
    def __iter__(self):
        """如果想要一个对象称为一个 可以迭代的对象,即可以使用for,那么必须实现__iter__方法"""
        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
def main():
    classmate = Classmate()
    classmate.add("张灿")
    classmate.add("里斯")
    classmate.add("王五")
    # print("判断classmate是否是可以迭代的对象:", isinstance(classmate, Iterable))
    # classmate_iterator = iter(classmate)
    # print("判断classmate_iterator是否是迭代器:", isinstance(classmate_iterator, Iterator))
    for name in classmate:
        print(name)
if __name__ == "__main__":
    main()

迭代器的应用

斐波那契数列迭代器的实现:

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
fibo = Fibonacci(100)
for num in fibo:
    print(num)

生成器

生成器是一个特殊的迭代器。生成器表达式并不真正的创建列表,而不是返回一个生成器对象,此对象在每次计算出一个条目后,把这个条目“产生”(yield)出来。当一个序列过长,并且每次只需要获取一个元素时,应当考虑使用生成器表达式而不是列表解析,以避免占用过多的资源。

创建生成器方法1

生成器创建的语法:

(expr for iter_var in iterable)
(expr for iter_var in iterable if cond_expr)

创建生成器方法2

def create_num(all_num):
    a, b = 0, 1
    current_num = 0
    while current_num < all_num:
        yield a  # 如果一个函数中有yield语句,那么这个就不再是函数,而是一个生成器模板
        a, b = b, a+b
        current_num += 1


# 如果在调用create_num的时候,发现这个函数中有yield,那么此时不是调用函数,而是创建一个生成器对象
obj = create_num(10)

for num in obj:
    print(num)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值