首页 > 编程语言 >Python中生成器和迭代器的概念及两者区别

Python中生成器和迭代器的概念及两者区别

时间:2024-02-25 13:12:22浏览次数:26  
标签:__ 迭代 Python self 生成器 current time

本文详细介绍Python中生成器和迭代器的概念及两者区别。并通过一个案例分析两者在实际应用中的性能差异。   生成器 生成器是一种特殊类型的迭代器,它使用函数和yield关键字定义,可以像普通函数一样调用和执行。生成器在每次迭代时产生一个值,并在下一次迭代时恢复执行。   在使用时,生成器函数会返回一个生成器对象,这个对象可以用于在函数中挂起和恢复函数的执行状态。   这种产生和恢复执行的机制,使得它只在需要的时候生成一个值,而不是一次性生成整个序列。这样,生成器在内存使用和效率上更加优化,特别适合大型数据处理。 下面是一个简单的生成器函数的例子: def simple_generator_function():yield 1 yield 2 yield 3 在这个例子中,函数simple_generator_function包含了三个yield语句,每次调用这个函数时,它会返回一个生成器对象。这个对象包含了yield语句后面的值。 下面是如何使用这个生成器对象: for value in simple_generator_function():print(value) 运行效果 这个for循环会遍历生成器对象中包含的所有值。 迭代器 迭代器是Python中实现迭代协议的一个对象,本质上是一种Python数据结构,它实现了__next__()和__iter__()等方法。   其中,__iter__()方法返回迭代器自身,__next__()方法返回序列中的下一个值。 迭代器能够支持for循环以及next()函数的调用。在每次迭代时,迭代器都会产生一个值,直到遍历完所有值,如果没有下一个值了,就会抛出StopIteration异常。   下面是一个简单的迭代器的例子: class SimpleIterator:def __iter__(self): self.current = 0 return selfdef __next__(self): if self.current < 3: self.current += 1 return self.current else: raise StopIteration 在这个例子中,我们定义了一个简单的迭代器SimpleIterator。 这个迭代器重写了__iter__()和__next__()方法。__iter__()方法返回迭代器自身,并初始化一个计数器self.current,__next__()方法返回这个计数器的下一个值,如果计数器大于3,就会抛出StopIteration异常。 下面是如何使用这个迭代器: for value in SimpleIterator():print(value) 这个for循环会遍历迭代器SimpleIterator中包含的所有值。 运行效果 生成器和迭代器的区别 虽然生成器和迭代器都可以用于for循环的遍历,但是它们之间有明显的不同之处。   1.实现方式不同 生成器使用了yield语句来实现,而迭代器使用了类的魔法方法__iter__()和__next__()来实现。 2.生成方式不同 生成器可以逐个生成序列中的值,而迭代器一次性生成整个序列,将其存储在内存中。 3.执行方式不同 生成器像函数一样调用和执行,可以在每次迭代时产生和恢复值,而迭代器则按照序列的下一个元素依次执行。 4. 功能不同 生成器主要用于生成序列,而迭代器主要用于遍历序列。 案例:生成器与迭代器性能差异 用于比较生成器和迭代器的性能差异: import timedef simple_generator_function():for i in range(100000): yield iclass SimpleIterator: def __init__(self): self.values = list(range(100000))def __iter__(self): self.current = 0 return selfdef __next__(self): if self.current < len(self.values): self.current += 1 return self.values[self.current - 1] else: raise StopIterationstart_time = time.time()for value in SimpleIterator(): passprint("Time for iterator:", time.time() - start_time)start_time = time.time()for value in simple_generator_function(): passprint("Time for generator:", time.time() - start_time) 运行效果 在这个例子中,我们定义了一个生成器函数和一个迭代器类,它们都是用于生成一个包含100000个整数的序列,我们分别用for循环遍历它们,并测量它们的运行时间。   运行结果显示,生成器比迭代器运行速度更快,这是因为生成器只在需要时才生成值,而迭代器则需要一次性生成整个序列。 结论 生成器和迭代器都是用于处理序列的重要工具。它们在功能和实现方式上有很大的不同,而且在性能方面也有明显的差异。开发者在选择使用哪种类型时,应该根据具体的需求进行评估,并选择最适合的一种类型。

标签:__,迭代,Python,self,生成器,current,time
From: https://www.cnblogs.com/liuxuelin/p/18032278

相关文章

  • 【Python】 回文数的四种解法
    回文数就是指整数倒过来和原整数相等。1234Example1:  Input:121Output:true12345Example2:  Input:-121Output:falseExplanation:Fromlefttoright,itreads-121.Fromrighttoleft,itbecomes121-.Therefore......
  • 全能代码生成器,自动生成前后端代码、生成项目框架、生成JavaBean、生成数据库文档、自
    TableGo_20240224v8.4.0正式版发布,此次版本累计更新如下: 1、TableGo专属LOGO上线 2、生成数据库文档ER图新增备注+字段名的生成配置 3、生成自定义文件功能新增临时参数配置,用于使用临时数据生成自定义文件 4、新增基于Excel数据生成自定义文件,可导入Excel数据生成程序代码......
  • python——面向对象——知识汇总
    面向对象技术简介类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法:类中定义的函数。类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。......
  • Python函数每日一讲1 - 一文让你彻底掌握Python中的frozenset函数
    引言在Python中,frozenset()函数是一个重要的工具,用于创建不可变的集合对象。本文将介绍frozenset()函数的语法、用法示例以及实际应用场景,帮助大家更好地理解和应用这个函数。语句概览frozenset()函数的语法如下:frozenset(iterable)其中,iterable是一个可迭代对象,例如......
  • Python 字符串格式化输出
    数字n:int=1000000000print(f'{n:_}')#1_000_000_000print(f'{n:,}')#1,000,000,000对齐var:str='var'#右对齐,使用_填充print(f'{var:_>20}')#_________________var#左对齐,使用#填充print(f'{var:#<20}�......
  • python dict 哈希表
    哈希值Python 内置函数 hash 返回对象 哈希值 ,哈希表 依赖 哈希值 索引元素:根据哈希表性质, 键对象 必须满足以下两个条件,否则哈希表便不能正常工作:哈希值在对象整个生命周期内不能改变;可比较,且比较相等的对象哈希值必须相同;满足这两个条件的对象便是......
  • python GIL 全局锁
    GIL由来我们先思考一个问题:我们在前面介绍的 list 、 dict 等内建对象是 线程安全 的吗?在 Python 层面,list 、dict 等内建对象是线程安全的,这是最基本的常识。研究 list、dict 等内建对象源码时,我们并没有看到任何 互斥锁 的痕迹,这多少有点令人意外。以 li......
  • python 内存优化
    Python 内存管理层次:众所周知,计算机硬件资源由操作系统负责管理,内存资源也不例外。应用程序通过 系统调用 向操作系统申请内存,而 C 库函数则进一步将系统调用封装成通用的 内存分配器 ,并提供了 malloc 系列函数。C 库函数实现的通用目的内存管理器是一个重要......
  • python 对象
    面向对象理论中“ 类 ”和“ 对象 ”这两个重要概念,在 Python 内部均以对象的形式存在。“类”是一种对象,称为 类型对象 ;“类”实例化生成的“对象”也是对象,称为 实例对象 。根据对象不同特点还可进一步分类:类别特点可变对象对象创建后可以修改不可......
  • Python数据结构与算法05——归并排序
    归并排序:defmerge_sort(aimlist):#归并排序拆分-排序-合并也就是merge_返回的是是一个已经排好序的列表n=len(aimlist)ifn<=1:returnaimlistmid=n//2aimlist_left=merge_sort(aimlist[:mid])aimlist_right=merge_sort(aimlist[mid:......