生成器与迭代器

生成器与迭代器

一、生成器

1.列表推导式

列表推导式是Python内置的非常简单且强大的可以用来轻松创建列表的方法。它可以使用非常简单的语句利用其他列表创建新的列表。

例如,创建1到10的所有偶数的平方的列表:

list = [i*i for i in range(1,11) if i%2==0]
print(list)   #结果为:[4, 16, 36, 64, 100]

列表推导式的书写规则是,生成的元素放在语句前面,紧跟着的是for循环。

2.生成器表达式

列表一旦被创建,其包含的元素就实实在在地存在内存中,占据着内存空间,列表存放的是元素本身,而生成器存放的是算法,通过next()调用算法实时生成元素,因此生成器所占的内存空间很小。

将列表推导式的方括号[ ]改为小括号( )即可创建一个生成器,即:

list = [i*i for i in range(1,11) if i%2==0]     #列表表达式
print(list)      #打印列表表达式生成的新列表
list = (i*i for i in range(1,11) if i%2==0)     #生成器表达式
print(list)       #打印生成器
print(list.__next__())    #跟下面next()用法一样
print(next(list))             #生成元素

执行的结果为:

[4, 16, 36, 64, 100]
<generator object <genexpr> at 0x0000000000432CF0>
4
16

可以看到,列表list一旦被创建,内存中就存放所有元素,而生成器list的元素内容将随着next()函数的调用实时生成,直到最后没有元素可生成,抛出StopIteration错误。

3.生成器函数

生成器函数跟常规定义函数类型,只不过使用yield关键字返回结果而不是return关键字。即:

def test():yield 1  #相当于returnyield 2
g = test()
print(g)
print(g.__next__())
print(g.__next__())

执行结果如下:

<generator object test at 0x0000000002432CF0>
1
2

生成器函数相比于普通函数的区别:

  • 生成器代码更简洁
  • 生成器内存占用极少
  • 运行方式不同

生成器函数总结:

  • 语法上和函数类似:生成器函数和常规函数几乎是一样的。它们都是使用def语句进行定义,差别在于,生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值。
  • 自动实现迭代器协议:对于生成器,Python会自动实现迭代器协议,以便应用到迭代背景中(for循环、sum函数)。由于生成器自动实现了迭代器协议,所以,我们可以调用它的next方法,并且,在没有值可以返回的时候,生成器自动产生Stopiteration异常。
  • 状态挂起:生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行。

生成器注意事项:生成器只能遍历一次。

二、迭代器

能够用于for循环的对象均被称为可迭代对象。

(字符串、列表、元组、字典、集合、文件对象)这些都不是可迭代对象,只不过在for循环模式,调用他们内部的__iter__()方法,把他们变成了可迭代对象。即:

x='hello'
iter_test = x.__iter__()
print(iter_test)
print(iter_test.__next__())
print(iter_test.__next__())
print(iter_test.__next__())

执行结果如下:

<str_iterator object at 0x0000000002191358>
h
e
l

在所有可以用于for循环的对象中,生成器还可以被next()函数不断调用并生成下一个值,直到抛出StopIteration错误表示无法继续为止。

像生成器这种可以被next()函数调用并不断生成下一个值的对象被称为迭代器。

转载于:https://www.cnblogs.com/lzc69/p/11189947.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Integration Java DSL示例

现在已经为Spring Integration引入了新的基于Java的DSL &#xff0c;这使得可以使用基于纯Java的配置而不是基于Spring XML的配置来定义Spring Integration消息流。 我尝试使用DSL来获得示例集成流–我称其为Rube Goldberg流 &#xff0c;因为它在尝试大写作为输入传递的字符串…

automake linux,Linux下automake软件编译与发布快速入门

Linux下automake软件编译与发布快速入门2008-04-22eNet&Ciweek进入编辑界面&#xff0c;输入内容如下&#xff1a;AUTOMAKE_OPTIONSforeignbin_PROGRAMSsimserver1 #软件包名称simserver1_SOURCESsimserver1.cpp  #源文件列表&#xff0c;如果有多个则用空格分开LIBS -l…

取消 Vue 中格式编译警告

使用VS Code在学习 Vue 的过程中&#xff0c;博主是在2.0之后开始学习的&#xff0c;在写项目的时候发现控制台经常会报一大堆的警告&#xff0c;都是关于格式的&#xff0c;有时候少空格&#xff0c;有时候多空格&#xff0c;不胜其烦&#xff0c;出现这个问题是因为在初始化的…

常用激活函数(激励函数)理解与总结

转载自https://blog.csdn.net/tyhj_sf/article/details/79932893 什么是激活函数&#xff1f; 神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值&#xff0c;并将输入值传递给下一层&#xff0c;输入层神经元节点会将输入属性值直接传递给下一层&#…

[原创]水知道答案吗?(一)

《水知道答案》是一本书的名字&#xff0c;我很有兴趣重复其中的试验&#xff0c;验证其真伪。书中提到的众多试验中&#xff0c;有一个试验最好做。实验内容&#xff1a;初始条件&#xff1a;取三个杯子&#xff0c;倒上相同水源的水&#xff0c;然后每个杯子放进一粒米饭粒。…

html5标签的兼容性处理

HTML5的语义化标签以及属性   1.可以让开发者非常方便地实现清晰的web页面布局&#xff0c;加上CSS3的效果渲染&#xff0c;快速建立丰富灵活的web页面显得非常简单 2.使用他们能让代码语义化更直观,而且更方便SEO优化。 但是此HTML5新标签在IE6/IE7/IE8上并不能识别&#xf…

Spring Security配置错误

我最近看到Mike Wienser的SpringOne2GX谈论了Application Security Pitfalls 。 如果您在Servlet容器上使用Spring的堆栈&#xff0c;这将非常有用&#xff0c;值得一看。 它使我想起了我曾经面临的一个严重的Spring Security Misconfiguration。 在Spring的指导项目Securing …

android fragmentactivity fragment,Android:Activity与Fragment通信(99%)完美解决方案

前言最近一直在想着能否有一种更好的方案来解决&#xff1a;Android中Activity与Fragment之间通信的问题&#xff0c;什么叫更好呢&#xff0c;就是能让Fragment的复用性高&#xff0c;性能还有好(不用反射)&#xff0c;代码还要好维护&#xff0c;不需要为每对Activity和Fragm…

分布式人工智能标记语言(DAIML)示例

DAIML&#xff08;Distributed Artificial Intelligence Markup Language&#xff09;是用于分布式人工智能系统中智能语言的标记库。DAIML主要分为Pattern和Template两部分&#xff0c;Pattern用于模式匹配&#xff0c;Template用于回答模板&#xff0c;下面将分别介绍两者的示…

Ext.js数据展示问题name展示code

出现以上问题是因为model中定义的类型跟数据库不匹配 去掉js中vehicleModel的type或者改为type:int即可。转载于:https://www.cnblogs.com/feifeicui/p/10438900.html

新一代网络模式Web 2.0火爆发展

据TechnologyReview网站2006年4月12日消息&#xff0c;如果你是一位网络高手&#xff0c;你会发现网络工具和服务领域天翻地覆的新变化越来越充斥你的生活。你可以在Eventful网站或Upcoming网站上保存社交日历&#xff1b;可以在Gootodo上安排计划&#xff1b;在Box.net上储存1…

Solr中的前缀和后缀匹配

搜索引擎都是关于查找字符串的。 用户输入一个查询词&#xff0c;然后从反向索引中检索它。 有时&#xff0c;用户正在寻找的值只是索引中值的子字符串&#xff0c;并且用户可能也对这些匹配感兴趣。 对于德语这样的包含复合词&#xff08;例如Semmelkndel&#xff09;的语言&a…

评价viper4android,ViPer4android. FX顶级音效!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼名称&#xff1a;OPPO X903 杜比音效脉冲反馈样本 For VIPER4Android FX v2.0样本数量&#xff1a;72适配V4A版本&#xff1a;ViPER4Android FX v2.2.0.1 或更高适用范围&#xff1a;耳机内放制作者&#xff1a;漫游因特网授权&…

使用FormData进行Ajax请求上传文件

Servlet3.0开始提供了一系列的注解来配置Servlet、Filter、Listener等等。这种方式可以极大的简化在开发中大量的xml的配置。从这个版本开始&#xff0c;web.xml可以不再需要&#xff0c;使用相关的注解同样可以完成相应的配置。 我笔记里也有记文件上传&#xff1a;https://w…

基于 jq 实现拖拽上传 APK 文件,js解析 APK 信息

技术栈 jquery文件上传&#xff1a;jquery.fileupload&#xff0c;github 文档apk 文件解析&#xff1a;app-info-parser&#xff0c;github 文档参考&#xff1a;前端解析ipa、apk安装包信息 —— app-info-parser 支持功能 点击或拖拽上传 apk 文件校验文件类型及文件大小js …

POI获取WORD信息

最近由于工作需要&#xff0c;调研了一下关于poi获取word字体信息方面的方法&#xff0c;在这里mark一下。 首先word格式分为doc和docx&#xff0c;分别利用HWPFDocument和XWPFDocument对文档进行解析&#xff0c;话不多说&#xff0c;直接贴代码&#xff1a; 解析doc格式1 imp…

安全性

•完全适用ASP.NET的认证机制 –可以使用FormsAuthentication •WebService方法可以操作Cookie –Impersonation –PrincipalPermissionaspx<form id"form1"runat"server"><asp:ScriptManager runat"server"ID"ScriptManager1&quo…

调试以了解终结器

这篇文章涵盖了Java内置概念之一&#xff0c;称为Finalizer 。 这个概念实际上是众所周知的&#xff0c;也是众所周知的&#xff0c;这取决于您是否有足够的时间来仔细研究一下java.lang.Object类。 就在java.lang.Object本身中&#xff0c;有一个名为finalize&#xff08;&…

C++ constexpr变量和constexpr函数

constexpr 类型变量必须用常量表达式或 constexpr 函数来初始化&#xff1a; constexpr int a10;   constexpr int ba10;   constexpr int cd();  //当 d()为一个 constexpr 函数时才可以 constexpr 函数的形参和返回值都只能是字面型类型&#xff0c;且只能有一条 retur…

Zookeeper实现注册与发现

1.Zookeeper的数据模型 (1) Zookeeper的数据模型&#xff0c;类似于树形结构&#xff1a; (2) Zookeeper的每一个节点成为称为Znode&#xff0c;主要用来存储数据。 data : 存储数据信息。acl : 记录Znode的访问权限。child : 当前节点的子节点引用。stat &#xff1a;包含Zn…