Python进阶教程,生成器、迭代器一文掌握!

python进阶:深入理解迭代器和生成器 可以简单理解为函数运行到yield这一行的时候,程序会从这里暂停,然后生成一个值跳出程序,每次next()函数被调用的时候,暂停的程序又复活了,会把yield生成的值返回给调用者,周而复始;从代码层面上说,迭代器是实现了迭代器协议的对象,即具有__iter__()和__next__()方法,它用于提供一种顺序访问容器中元素的方式,而无需了解容器的内部实现细节。上述代码是生成一个包含一亿元素的列表,迭代器是用[]括起来的,每个元素在生成后都会保存在内存中,此时内存占用大概是迭代器对象 + 元素占用的内存。 阅读详情

迭代的概念

上一次输出的结果为下一次输入的初始值,重复的过程称为迭代,每次重复即一次迭代,并且每次迭代的结果是下一次迭代的初始值

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!??¤
QQ群:961562169

什么是迭代

  1. 访问集合元素的一种方式
  2. 可通过 for 循环遍历的对象 叫可迭代对象
  3. 数字类型 不可迭代

判断对象是否可迭代: isinstance( ) 判断是否为 Iterable(可迭代对象)

from collections.abc import Iterable
#print(isinstance(要判断的对象,数据类型))
print(isinstance([1,2,3,4],Iterable))        
是可迭代对象      返回 True
不是可迭代对象   返回 False

可迭代的对象

内置iter方法的,都是可迭代的对象。 list是可迭代对象,dict是可迭代对象,set也是可迭代对象。

迭代器 Iterator

1.为什么要有迭代器?
对于没有索引的数据类型,必须提供一种不依赖索引的迭代方式。

2.迭代器定义:
迭代器:可迭代对象执行iter方法,得到的结果就是迭代器,迭代器对象有next方法

它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了iter和next()方法的对象都是迭代器,iter返回迭代器自身,next返回容器中的下一个值, 如果容器中没有更多元素了,则抛出StopIteration异常

迭代器的遍历循环:

class MyIterator(object): 
	def __init__(self,list): 
		self.list=list 
		self.xiabiao=0         
	def __iter__(self):              #获取迭代器,自身就为迭代器,所以返回自身
		return self          
	def __next__(self):            #获取迭代器中的下一个数据
		if self.xiabiao < len(slef.list):     
			item=self.list[self.xiabiao]     
			self.xiabiao += 1  
			return item  
		else:  
			raise StopIteration       #抛出 停止迭代异常  
a=[11,22,33,44,55]   
my=MyIterator(a) 
for i in my:    
	print(i) 

for…in… 循环的本质:
先通过iter( )获取可迭代对象的迭代器,然后对获取到的迭代器 不断使用next( )方法来获取下一个值,并赋值给一个变量,当遇到 StopIteration 循环结束

while True: 
	try: 
		print(next( )) 
	except StopIteration:  
		break 

迭代器的应用场景: 斐波那契数列

class Fei(object): 
	def __init__(self,n): 
		self.n=n 
		self.weizhi=0         记录位置 
		self.num1=0          定义初始变量 
		self.num2=1 
	def __iter__(self):           获取迭代器,此类本身就是迭代器,返回自身 
		return self 
	def __next__(self):         获取迭代器中的下一个数据 
		if self.weizhi < self.n: 
			num=self.num1 
			self.num1,self.num2=self.num2,self.num1+self.num2 
			self.weizhi += 1 
			return num 
		else:
			raise StopIteration
fei=Fei(10) 
for i in fei: 
	print(i) 

查看迭代器数据的三种方法: for 、list、tuple

#for   
for i in fei:  
	print(fei)  
                       
#list                      
print(list(fei))                               
                                     
#tuple                                  
print(tuple(fei))      

生成器 generator

1.定义

  1. 生成器(generator)是一个特殊的迭代器,它的实现更简单优雅,yield是生成器实现next()方法的关键。它作为生成器执行的暂停恢复点,可以对yield表达式进行赋值,也可以将yield表达式的值返回。
  2. 也就是说,yield是一个语法糖,内部实现支持了迭代器协议,同时yield内部是一个状态机,维护着挂起和继续的状态。
  3. 生成器可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他数据类型需要调用自己的内置iter方法)
  4. 在Python中,一边循环,一边计算的机制,称为生成器。

yield的功能:

  1. 相当于为函数封装好iter和next
  2. return只能返回一次值,函数就终止了,而yield能返回多次值,每次返回都会将函数暂停,下一次next会从上一次暂停的位置继续执行
  3. 保存当前运行状态,暂停执行
  4. 将 yield 关键字 后面表达式的值,作为返回值返回,可理解为起到了return的作用

生成器的作用

  1. 通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的。
  2. 而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
  3. 所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?
  4. 这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

生成器工作原理

  1. 生成器是这样一个函数,它记住上一次返回时在函数体中的位置。

  2. 对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。

  3. 生成器不仅“记住”了它数据状态;生成器还“记住”了它在流控制构造中的位置。

  4. 生成器是一个函数,而且函数的参数都会保留。

  5. 迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的

yield生成器运行机制
在Python中,yield就是这样的一个生成器。

  1. 当你问生成器要一个数时,生成器会执行,直至出现 yield 语句,生成器把yield 的参数给你,之后生成器就不会往下继续运行。
  2. 当你问他要下一个数时,他会从上次的状态开始运行,直至出现yield语句,把参数给你,之后停下。如此反复
  3. 在python中,当你定义一个函数,使用了yield关键字时,这个函数就是一个生成器
  4. 它的执行会和其他普通的函数有很多不同,函数返回的是一个对象,而不是你平常所用return语句那样,能得到结果值。如果想取得值,那得调用next()函数
  5. 每当调用一次迭代器的next函数,生成器函数运行到yield之处,返回yield后面的值且在这个地方暂停,所有的状态都会被保持住,直到下次next函数被调用,或者碰到异常循环退出。

为什么说生成器是一种迭代器?
Python 判断一个对象是否是迭代器的标准是看这个对象是否遵守迭代器协议 ,判断一个对象是否遵守迭代器协议主要看两个方面:

  1. 对象首先得实现 iter 和 next 方法
  2. 其次iter 方法必须返回它自己

而生成器恰好满足了这两个条件(可以自己写个生成器,然后调用生成器的这两个方法试试)。我们平常还会经常碰到另外一个概念:可迭代对象。可迭代对象就是可迭代的对象,可迭代的对象就是说我们可以从这个对象拿到一个迭代器。在 Python 中,iter 方法可以帮我们完成这个事情,也就是说,可迭代对象和迭代器满足这样一个关系:iter(iterable) -> iterator。

在 Python 中,list 是个可迭代对象,所以我们经常会写这样的代码:

l = [1, 2, 3]
for element in l:
	print(element)

但你想过为什么我们可以这么写吗?为啥在 c 语言里面,我们访问数组元素的时候,必须要通过 index?

因为:list 是个可迭代对象,我们在 Python 中使用 for … in 时,Python 会给我们生成一个迭代器对象,而如上所说:迭代器是个数据流,它可以产生数据,我们一直从里面取数据就好了,而不需要我们在代码中维护 index,Python 已经通过迭代器给我们完成了这个事情。

构建生成器:
将列表推导式的方括号 改为 小括号

g=(i for i in range(1,11))   
print(g)   

使用 yield
构建斐波那契数列

def fei(n):  
	num1,num2=0,1  
	weizhi=0  
	while weizhi < n :   
		num=num1  
		num1,num2=num2,num1+num2   
		weizhi += 1      
		yield num      
print(list(fei(10)))       

唤醒生成器:send( )、next( )、 __next__( )

send( )   

ret=fei(10)         
a=ret.send(None)   
print(a)  


next( )  
 
ret=fei(10)  
while True:   
	try:   
		print(next(ret))   
	except StopIteration:    
		break   

生成器和迭代器之间的区别

在使用生成器时,我们创建一个函数;在使用迭代器时,我们使用内置函数iter()和next()。 在生成器中,我们使用关键字‘yield’来每次生成/返回一个对象。 生成器中有多少‘yield’语句,你可以自定义。 每次‘yield’暂停循环时,生成器会保存本地变量的状态。而迭代器并不会使用局部变量,它只需要一个可迭代对象进行迭代。 使用类可以实现你自己的迭代器,但无法实现生成器。 生成器运行速度快,语法简洁,更简单。 迭代器更能节约内存。

再来看看Python中的迭代器&生成器 阅读详情

相关推荐

Python3 | 筑基期, 推导式、迭代器、生成器!

[知识是人生的灯塔,只有不断学习,才能照亮前行的道路]0x00 前言简述描述:前面,我们一起学习了Python3开发中使用最多的函数(Function),相信大家在作者的实践下也已经掌握函数的创建、多参数的传递,以及匿名函数、闭包了吧,这一章我们一起学习Python3编程中的推导式、迭代器以及生成器等相关知识,它也是Python编程中进阶常用的部分,对于程序健壮性以及效率都有所帮助,所以说也是...

全栈工程师修炼指南-IT知识分享 1380

Python面试:迭代器和生成器

讲讲python的迭代器和生成器 参考:菜鸟教程 如何更好地理解Python迭代器和生成器? 区别:生成器是一种特殊的迭代器,只能迭代一次 迭代器 迭代器是python中的一个强大功能,用于访问集合元素。是一个能记住遍历位置的对象,遍历时只能往前,不能后退。迭代器常用方法有 iter() 和 next(). 把一个类作为迭代器使用需要在类中实现两个函数:__iter__() 和 __next__(). 生成器 Python 中使用了 yield 的函数称为生成器,生成器函数返回一个迭代器。在调用生成器运行的

QI_YUE710的博客 1526

迭代器和生成器的区别

什么是迭代呢,迭代也就是遍历,我们把通过for in 循环语句依次从其中取出数据的过程叫做迭代

迭代器和生成器有什么区别?

总结一下,迭代器和生成器都是用于处理可迭代对象的工具,但生成器具有更简洁的定义方式和惰性计算的特性,使得它们在处理大数据集时更具优势。而迭代器则提供了更加灵活的定义方式,可以通过实现。方法来实现自定义的迭代逻辑。

m0_57236802的博客 1264

2023年全国赛C题《 电容电感测量装置》设计报告

参考下面网站的方案参考LCR测试仪,基本工作原理为给DUT加上正弦激励信号,然后测得该DUT两端的电压和流过DUT的电流,即可通过计算得到DUT的性质和参数。对于一个理想电容,电流相位应该超前电容两端电压90°。然而实际的电容存在损耗,可以等效为一个理想电容Cp​和一个理想电阻Rp​的并联,因此电流超前电压的相位将小于90°,这个角度差即为损耗角。假设DUT两端电压V˙Vcosωt,流过DUT的电流为I˙Isinωt−φ。

moerjie的博客 4818

记一次springboot集成海康威视SDK过程

一开始没有接触过物联网这块,走了很多弯路,后面还是自己一点点摸索出来的。有个项目,需要对海康的门禁设备进行集成,后台统一管理设备,进行设备人脸数据的下发、删除等操作。3.我还接入了门禁设备的事件监听,门禁所有的事件都会上报到后台服务,这块代码有需要的可以找我。在linux系统中,sdk我使用的是绝对路径,把Linux版本的文件放到服务时,Acs文件夹下的 各个Manage都有现成的代码,可以根据自己的需要调用即可。路径也不要有中文,切记!2.sdk的存放路径不要有中文,不然会出现很多奇怪的问题。

huang_xiaoen的博客 2351

生成器(Generator)和迭代器(Iterator)区别

生成器和迭代器都可以用来遍历数据,但是生成器更加灵活和内存友好,因为它可以自动管理状态和延迟执行。迭代器则需要手动实现迭代协议,包括管理状态和抛出异常。在实际编程中,生成器由于其简洁性和高效性,通常更受欢迎。

KIKI3666的博客 5013

【Linux内核】Linux内核裁剪完全指南:从理论到实战的系统优化

在嵌入式设备、专用服务器和物联网系统日益普及的今天,如何让Linux系统在资源受限的环境中高效运行成为开发者必须面对的问题。Linux内核裁剪正是解决这一问题的关键技术,它通过移除不必要的内核组件,打造出更精简、更安全、更高效的自定义操作系统。本文将系统全面地介绍Linux内核裁剪的完整流程和实用技巧,帮助您掌握这一核心技能。Linux内核裁剪是一项结合技术知识与实践经验的系统工程。明确需求:裁剪前必须清晰了解目标系统的硬件配置和功能需求。循序渐进:采取小步修改、反复测试的策略,避免一次性大幅修改。

撬动未来的支点的专栏 1391

生成器和迭代器的区别

总的来说,生成器是一种特殊的迭代器,它更加简洁,易于理解,同时也更加强大和灵活。

qq_38122800的博客 1965

MIT Bevfusion环境安装 Docker方式,nuscenes数据处理

Bevfusion环境安装,数据生成报错解决module 'numpy' has no attribute 'long';most likely due to a circular import。bevfusion docker环境

Jack_Man_N的博客 1144

树莓派4B:控制步进电机

文章目录准备阶段接线阶段树莓派程序 准备阶段 准备以下物品,淘宝都可以买到: 57步进电机 电源开关(220v转24v,3A,72W) 步进电机驱动器 电源线 电线 杜邦线 树莓派4B一套 具体型号如下: 接线阶段 整体:接线效果如下图 电源开关起220v转24v作用,很好接线,输出24v接入步进电机驱动器 步进电机驱动器的 A+ A- B+ B- 按提示接步进电机四线,步进电机上就会有说...

学习路上的鸭子的博客 1万+

Python进阶干货速递!【超详细迭代器、生成器、装饰器使用教程】

Python基础及进阶内容持续更新中!欢迎小伙伴们一起关注学习! 目录 写在前面 一、深入理解迭代器和生成器 1、什么是迭代?(Iteration) 2、迭代器(Iterator) (1)for 循环的迭代过程 (2)可迭代(Iterable)对象 (3)自定义迭代器 (4)迭代器的好处 3、生成器(Generator) (1)生成器表达式(Generator Expression) 二、生成器表达式和列表生成式 1、列表生成式 (1)列表生成式的写法 2、字典生成式 3.

累计发表博客60余万字,优快云 博客专家、Java 领域优质创作者、华为云享专家、阿里云专家博主。专注分享 Java 优质文章,毕设实战项目开发,全网粉丝10W+ 5415

【ARMv8 异常模型入门及渐进7 - GIC及安全中断介绍】

GIC-v3中,引入了支持2种安全状态(secure state),也就是对于中断,根据secure状态,分为安全中断和非安全中断。当然也可以只支持一种安全状态。这里的2种安全状态和1种安全状态,主要是影响中断分组,所使用IRQ和FIQ管脚的映射,以及gic中的寄存器访问。

CodingCos的博客 2116

Python入门:Python3 迭代器与生成器全面学习教程

Python入门:Python3 迭代器与生成器全面学习教程,本文详细讲解了 Python3 中迭代器与生成器的相关知识。迭代器是能记住遍历位置的对象,可通过 iter () 和 next () 方法操作,也能用 for 循环遍历,还可自定义,需实现iter__() 与__next__() 方法并处理 StopIteration 异常。生成器是含 yield 的特殊函数,返回迭代器,能逐步产生值,更简洁高效,适合处理大量数据。文中还对比了二者特性及适用场景,助力读者掌握这两种核心迭代机制。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 18万+

电磁场仿真软件:Sonnet_(12).Sonnet与其他软件的集成

Sonnet作为电磁场仿真领域的强大工具,不仅能够独立完成复杂的仿真任务,还可以通过与其他软件的集成,实现更高效的工作流程和更广泛的功能扩展。通过与CAD、EDA、数据处理软件、MATLAB、Python以及云计算平台的集成,Sonnet用户可以更好地利用现有设计资源,进行参数优化和结果分析,从而提升设计和仿真效率。希望本节的内容能够帮助你更好地理解和应用Sonnet的集成功能。

kkchenjj的博客 1432

第28节:cesium 加载高程数据(含源码+视频)

cesium 加载高程(地形)数据

qq_29384639的博客 1742

Python进阶教程丨迭代器、生成器

任何实现了。

凌小添的博客 1226

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

详解 Python 生成器与迭代器 及其区别

不论是初学python还是进阶,这都是绕不开的知识点,生成器与迭代器的概念相较于其他基础概念显得晦涩难懂,知识点囊括很多方面,查阅越多的资料,头就越大,现在这加以理解归纳总结。

Yy_Rose的博客 8439

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Python进阶————迭代器与生成器

Python中的迭代器与生成器的区别与联系

记录学习笔记 2179

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【Python】从基础到进阶(九):探索Python中的迭代器与生成器

迭代器和生成器是Python提供的强大工具,能够帮助开发者以更高效、更内存友好的方式遍历和生成大量数据。

Allen- 1545

详解Python迭代器,生成器,装饰器

文章目录迭代器生成器装饰器 迭代器 简介:迭代器是python里面可以记住遍历位置的对象,迭代器只能往前不能往后,使用iter()创建一个迭代器,使用next()返回一个迭代器里面的元素。 应用场景:数列的数据规模巨大,或者数列有规律,但是通过列表推导式推导不出来 #!/usr/local/bin/python3 import sys it = iter([1,32,43,2]) ...

Zijian Su的博客 3314

【Python知识】Python进阶-迭代器与生成器

迭代器(Iterator)是Python中的一个重要概念,它提供了一种统一的方法来遍历容器对象(如列表、元组、字典、集合、字符串等)中的元素,而无需了解容器的内部结构。__iter__()和__next__()。__iter__()方法:返回迭代器对象本身。对于迭代器来说,这个方法通常只是简单地返回self,表示迭代器自身就是一个可迭代对象。但需要注意的是,这个方法并不是迭代器特有的,任何实现了该方法的对象都可以被视为可迭代对象(Iterable)。__next__()方法:返回序列中的下一个元素。

wendao76的专栏 1047

python 函数进阶(迭代器和生成器)

迭代器与生成器是两个很重要的概念,它们不仅简化了数据遍历与处理的过程,还极大地提升了代码的可读性与执行效率。

2201_75622573的博客 2047

Python进阶教程,生成器、迭代器一文掌握

  在使用生成器时,我们创建一个函数;在使用迭代器时,我们使用内置函数iter()和next()。 在生成器中,我们使用关键字‘yield’来每次生成/返回一个对象。 生成器中有多少‘yield’语句,你可以自定义。 每次‘yield’暂停循环时,生成器会保存本地变量的状态。而迭代器并不会使用局部变量,它只需要一个可迭代对象进行迭代。 使用类可以实现你自己的迭代器,但无法实现生成器。 生成器运行速度快,语法简洁,更简单。 迭代器更能节约内存。...

zouduchen的博客 180

Python进阶笔记——迭代器、生成器、协程。

else:# 使用自定义迭代器。

qq_46332458的博客 1042
上一篇: Python生成桌面文件,并添加数据(应用于数据的下载等等)
下一篇: 一篇文章教会你使用Python网络爬虫下载酷狗音乐
Python_sn
博客等级 码龄6年 324粉丝 290原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值