Python学习第十六天--迭代器和生成器

一、可迭代对象

六大标准数据类型:字符串,列表,元组,字典,集合,数值类型

可迭代对象:字符串,列表,元组,字典,集合。即:通过for...in...方式遍历的类型即为可迭代对象

定义:

1)实现了__iter__方法
2)__iter__方法方法返回了一个选代器对象

本质:

其实都是collections(容器数据类型)模块里的iterable类创建出来的实例。

查看是否为可迭代对象:

from collections.abc import Iterable   #3.3-3.9版本需要加abc
print(isinstance([1, 2, 3], Iterable))>> True

二、迭代器

迭代器是访问可迭代对象的工具。其从集合的第一个元素开始访问,直到所有的元素被访问完才结束。迭代器只能往前不能后退。

两个函数

1、iter()函数--可取得可迭代对象的迭代器

2、next()函数

迭代器= iter(可迭代对象)
下个值=next(迭代器) 

 

对迭代器调用iter()方法则返回迭代器本身 。

list = [1,2,3,4]
it = iter(list)print(it)
>> <list_iterator object at 0x000001A907BDAFD0>print(iter(it))
>> <list_iterator object at 0x000001A907BDAFD0>

功能

1)for 循环
2)逐行遍历文本文件

3)列表推导式

4)元组拆包

特征

1、访问者不需要关心选代器内部结构,只需要不断执行next()方法获取下一个内容

2、不能随机访问集合中某个值,只能从头到尾顺序的读取  ---缺点

3、访问过程中不能回退,不能访问之前的值  ---缺点

4、选代器经过依次取值的循环后就耗尽,如果想再次迭代要重建选代器  --缺点易耗损性

5、适合遍历很大的数据集合,节省内存,提升速度   --应用场景

for循环工作原理

1、在内部对可迭代对象调用__iter__()方法,获取到选代器对象

2、再一次次的通过选代器对象调用__next__()方法获取选代结果 

3、循环步骤2,取尽所有值,直到抛出StopIteration的异常,for循环会捕捉到异常后结束循环

演示

list = [1,2,3,4]
it = iter(list)
print(it)  #输出<list_iterator object at 0x00000203602FAFD0>
print(next(it))  #输出1
print(next(it))  #输出2
print(next(it))  #输出3
print(next(it))  #输出4
print(next(it))  #抛出StopIteration异常

三、迭代器协议

概念

迭代器对象必须提供一个next方法,执行该方法要么返回迭代的下一项,要么就引起一个StopIteration异常来终止迭代(只能往后走,不能往前退)

构造迭代器

类中创建__iter__()和__next__()2个方法,__iter__()返回self对象,即可把类作为迭代器使用

class Calculate:def __iter__(self):self.number = 1return selfdef __next__(self):self.number += 1return self.numberfrom collections.abc import Iterable
cal = Calculate()
print(isinstance(cal, Iterable))  #输出Trueit = iter(cal)
print(next(it)) #输出2
print(next(it)) #输出3
print(next(it)) #输出4

四、生成器

迭代器与生成器区别

迭代器用于从数据集中取出元素;

生成器用于“凭空”生成元素,它不会一次性将所有元素全部生成,而是按需一个一个地生成,所以从头到尾都只需占用一个元素的空间。

生成器函数

只要在def中有yield关键字的 就称为 生成器。

使用yield语句返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行。第一次调用完后状态挂起,下次执行时,从挂起的位置继续开始执行。

def func():yield 1yield 2yield 3return "End of function" #return返回一个值,是StopIteration的说明,而不是程序的返回值#取值方式1
fn = func()
print(next(fn))
print(next(fn))
print(next(fn))
print(next(fn)) #抛异常:StopIteration: End of function#取值方式2
for i in func():print(i)>> 
1
2
3

生成器创建 

只要把列表生成式中的[]改成()即可

#列表推导式
list1=[i*2 for i in range(3)] #列表推导式print(list1)
print(list1) #[0,2,4]#创建生成器表达式
list2=(i*2 for i in range(3))
print(list2) #<generator object <genexpr> at 0x000002B1B4728200>
print(next(list2))
print(next(list2))
print(next(list2))

按需生成,只占一个元素内存空间

优点

  • 延迟计算,每次返回一个结果。它不会一次生成所有的结果,对于大数据量的处理,将会非常有用
  • 节省内存
  • 节省代码

yield与return的区别

相同点:都是返回函数执行的结果。

不同点:return在返回结果后结束函数的运行,yield让函数变成一个生成器 。

yield生成器相比return一次返回所有的结果的优势:1.反应更加迅速;2.更节省空间;3.使用更加灵活

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/33858.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaScript】选项卡切换

选项卡切换 选项卡切换是一种常见的网页设计模式&#xff0c;用于在一个页面内显示和切换不同内容区域&#xff0c;而无需加载页面。用户可以通过点击选项卡切换显示不同的内容&#xff0c;而隐藏其他内容。 多选项显示&#xff1a;页面顶部、侧边或其他地方通常有多个选项卡…

【Spring】Spring 整合 MyBatis

在实际项目开发中&#xff0c;将 Spring 和 MyBatis 进行整合可以提高开发效率、简化配置、增强事务管理和可维护性&#xff0c;同时利用 Spring 的强大功能能提升系统的稳定性。这里从独立使用 MyBatis 开始&#xff0c;逐步实现与 Spring 框架的整合。 MyBatis 独立开发 现…

JavaWeb学习(1)(同步或异步请求、依赖jQuery简单实现Ajax技术)

目录 一、Web的基本流程与页面局部刷新。 &#xff08;1&#xff09;web开发时基本流程。 &#xff08;2&#xff09;页面的"全局刷新"与"局部刷新"。 二、Ajax技术。 &#xff08;1&#xff09;基本介绍。 &#xff08;2&#xff09;基本特点。 1、与服务…

win11 vs2022 python3.9环境下运行jupyterlab

jupyter官网及简介&#xff1a;https://jupyter.org/ Jupyter 集合“浏览器 编程 文档 绘图 多媒体 发布”众多功能与一身&#xff0c;适合探究式学习。 JupyterLab是最新的基于网络的笔记本、代码和数据的互动开发环境。 Jupyter Notebook是JupyterLab的上一代版本。 由…

STM32 进阶 定时器 2基本定时器 基本定时器中断案例:LED闪烁

基本定时器 基本定时器TIM6和TIM7各包含一个16位自动装载计数器&#xff0c;由各自的可编程预分频器驱动。 这2个定时器是互相独立的&#xff0c;不共享任何资源。 这个2个基本定时器只能向上计数&#xff0c;由于没有外部IO&#xff0c;所以只能计时&#xff0c;不能对外部…

libaom 源码分析:帧间帧内预测编码

整体流程框架逻辑 帧间帧内预测模式的分区类型 不论是 RD 模式还是 nonRD 模式,libaom 中分区只应用 PARTITION_NONE、PARTITION_HORZ、PARTITION_VERT、PARTITION_SPLIT 四种类型,不像 AV1 标准中介绍的那样有十种类型(其实 libaom 源码中也实现了所有了类型,但在正式版中…

达梦归档文件名与实例对应关系

默认的&#xff0c;达梦归档文件名比较难以看懂&#xff0c;且多实例下不好区分 靠它就行 select upper(to_char((select DB_MAGIC), xxxxxxxxxx)) mag_id; 这样就对上号了。

JavaScript实现圆周运动效果

在 JavaScript 中&#xff0c;可以通过 requestAnimationFrame 和数学公式来实现圆周运动效果。以下是示例代码&#xff1a; 示例代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewp…

11.爬虫

前言&#xff1a; 正则表达式的作用&#xff1a; 作用一&#xff1a;校验字符串是否满足规则 作用二&#xff1a;在一段文本中查找满足要求的内容 一.Pattern类和Matcher类&#xff1a; 1.Pattern类&#xff1a;表示正则表达式 a.因此获取Pattern对象就相当于获取正则表达式…

Java项目实战II基于微信小程序的无中介租房系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着城市化进程的加速&#xff0c;租房市场日益繁荣&a…

Linux里面实时查看项目的tomcat服务器日志文件

目录 前言 一、查看tomcat服务器日志 二、运行项目验证&#xff08;篇外&#xff09; (一)运行自己的项目 二、发送验证码测试 前言 这个可以查看在Linux系统里面部署运行项目的日志&#xff0c;日志内可以查看到运行和各种错误以及前后端交互传输的各种数据&#xff0c;…

12,攻防世界simple_php

simple_php 题目来源:Cyberpeace-n3k0 题目描述: 小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。 进入靶场 这段PHP代码是一个简单的web应用示例&#xff0c;让我们逐步分析这段代码&#xff1a; show_source(__FILE__);&#xff1a;这行代码会显示当前文件的…

Webpack Tree Shaking 技术原理及应用实战,优化代码,精简产物

前言 在前端开发中&#xff0c;优化代码体积和提升应用性能是至关重要的课题。Webpack 提供了多种优化手段来帮助开发者实现这一目标&#xff0c;Tree Shaking 就是其中一种非常重要的优化技术&#xff0c;它通过在编译阶段移除未被使用的代码模块&#xff0c;从而显著减小最终…

5G CPE核心器件-基带处理器(三)

5G CPE 核心器件 -5G基带芯片 基带芯片简介基带芯片组成与结构技术特点与发展趋势5G基带芯片是5G CPE中最核心的组件,负责接入5G网络,并进行上下行数据业务传输。移动通信从1G发展到5G,终端形态产生了极大的变化,在集成度、功耗、性能等方面都取得巨大的提升。 基带芯片简…

SpringBoot高级-底层原理

目录 1 SpringBoot自动化配置原理 01-SpringBoot2高级-starter依赖管理机制 02-SpringBoot2高级-自动化配置初体验 03-SpringBoot2高级-底层原理-Configuration配置注解 04-SpringBoot2高级-底层原理-Import注解使用1 05-SpringBoot2高级-底层原理-Import注解使用2 06-S…

ES常见问题汇总

ES常见问题汇总 1.Es的作用&#xff08;elasticsearch&#xff09; 作用&#xff1a; elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 ELK技术栈 elasticsearch结合kibana、Logstash&…

linux环境宝塔服务部署安装及介绍

一、简介 宝塔面板是一款服务器管理软件&#xff0c;支持windows和linux系统&#xff0c;可以通过Web端轻松管理服务器&#xff0c;提升运维效率。例如&#xff1a;创建管理网站、FTP、数据库&#xff0c;拥有可视化文件管理器&#xff0c;可视化软件管理器&#xff0c;可视化C…

ONES 功能上新|ONES Project 甘特图再度升级

ONES Project 甘特图支持展示工作项标题、进度百分比、依赖关系延迟时间等信息。 应用场景&#xff1a; 在使用甘特图规划项目任务、编排项目计划时&#xff0c;可以对甘特图区域进行配置&#xff0c;展示工作项的工作项标题、进度百分比以及依赖关系延迟时间等维度&#xff0c…

跨域请求限制的通俗解释

什么是跨域 想象一下&#xff0c;每个网站就像一个独立的小国家&#xff0c;有自己的边界&#xff08;域名&#xff09;。比如&#xff0c;https://example1.com是一个国家&#xff0c;https://example2.com是另一个国家。浏览器就像是这些国家之间的海关&#xff0c;它会检查从…

javascript删除对象属性

1、操作符 delete object.property const obj {age: 19,name: hanmeimei, } delete obj.age2、Reflect.deleteProperty(object, propertyKey) 还会返回布尔值 const obj {age: 19,name: hanmeimei, } Reflect.deleteProperty(obj, name)