python中的迭代器和生成器

本文探讨了在处理文件和生成斐波那契数列时,如何利用迭代器和生成器来优化代码性能,减少内存使用并提升并发性。具体展示了迭代器与生成器在不同场景下的应用优势,包括查找文本文件中最长记录、生成斐波那契数列等。同时,通过对比不同方法的内存消耗和代码复杂度,强调了生成器在简化代码和提高效率方面的价值。

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

迭代器:

使用迭代器的一个好处是为列表类型的对象提供一个统一的遍历接口,即next方法。另一个好处是提高内存利用率。比如需要读取并且遍历一个很大的文本文件,如果使用列表解析,系统会将整个文件的内容先放入内存,然后再进行处理,对内存大小要求较高。而使用迭代器,每次只会取出文件中的一条记录放入内存,因此可以提高内存的使用效率。

生成器:

生成器相对于迭代器可以进一步对代码进行简化。

 

 

以查找一个文本文件中最长的一条记录为例,介绍迭代器的好处。

'''
不使用迭代器,逐条遍历后处理
多线程情况下,会长时间占用文件,并发性低
'''
def func1(file_name):
    f = open(file_name)
    max_length = 0
    while True:
        temp_len = len(f.readline().strip())
        if not temp_len: break
        if temp_len > max_length:
            max_length = temp_len
    f.close()
    return max_length

'''
一次性读取整个文件后,关闭文件然后使用迭代器遍历
文件很大时,需要将整个文件内容加载到内存,内存使用率低下
'''
def func2(file_name):
    f = open(file_name)
    text = f.readlines()
    f.close()
    max_length = 0
    for line in text:
        temp_len = len(line)
        if temp_len > max_length:
            max_length = temp_len
    return max_length

'''
只将文件中的所有行的长度列表化,然后遍历长度列表查找最长的行
只需要将文件中的所有行的长度加载到内存,内存使用率比fun2()文件遍历过程,处理步骤较简单,并发性比func1()
'''
def func3(file_name):
    f = open(file_name)
    len_list = [len(line) for line in f]
    f.close()

    max_length = 0
    for temp_len in len_list:
        if temp_len > max_length:
            max_length = temp_len
    return max_length

'''
使用生成器,代码比func3()更加简洁
max()方法的参数不仅仅可以是列表,也可以是一个可迭代对象,如迭代器和生成器

ps:
[len(line) for line in f] 生成一个普通的列表
len(line) for line in f 为生成器表达式,产生生成器,与上式的区别仅仅是去掉了中括号
'''
def func4(file_name):
    f = open(file_name)
    max_length = max(len(line) for line in f.readline())
    f.close()
    return max_length

 

 

下面再介绍生成斐波那契数列的例子,说明生成器相对应迭代器的好处。

'''
1开始,生成长度为maxNum个斐波那契数
使用迭代器
'''
class Fabs(object):
  def __init__(self, maxNum):
    self.max = maxNum
    self.n, self.a, self.b = 0, 0, 1 #特别指出:第0项是0,第1项是第一个1.整个数列从1开始

  def __iter__(self):
    return self

  def next(self):
    if self.n < self.max:
      r = self.b
      self.a, self.b = self.b, self.a + self.b
      self.n = self.n + 1
      return r
    raise StopIteration()

'''
1开始,生成长度为maxNum个斐波那契数
使用生成器,与使用迭代器相比,不需要重写各种方法,代码更简洁
'''
def fab(maxNum):
  n, a, b = 0, 0, 1
  while n < maxNum:
    yield b
    a, b = b, a + b
    n = n = 1

 

下面的链接介绍了一个使用生成器自定义contextManager装饰器的例子,是对装饰器和生成器的一个综合应用,可以更好地帮助理解上下文管理器、装饰器以及生成器。

点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值