深入理解python的迭代器,生成器,可迭代对象区别-程序员宅基地

技术标签: 面试  python  

要先搞清楚这三者区别首先需要给文章点个赞。呸呸呸,说错了,需要先弄明白什么是迭代,先补充一下迭代的概念在进入正题的讲解。

迭代:像list,tuple,dict这样的数据类型,我们通过for...in...语法从中依次拿到数据进行使用,这样的遍历过程,就叫做迭代


正文开始

1,可迭代对象

简单来说,某个对象内部具有__iter__方法,那么它就是可迭代对象(Iterable)。

全剧终!事情并不是这么简单,作为一个有追求的程序员我们需要深入了解一下可迭代对象的本质是什么?

我们分析我们在对可迭代对象进行迭代的时候,迭代一次(就是在for...in...中循环一次),都会返回一个值,直到将可迭代对象中的所有值取完。

那么问题来了,是不是存在一个“人”记录了什么时候访问到了第几个数据。答案是肯定的,这个“人”就是迭代器(Iterator)

可迭代对象的本质就是提供这样个迭代器帮助我们进行迭代遍历使用

可迭代对象就是通过__iter__方法向我们提供这样一个迭代器,在迭代一个可迭代对象的时候,首先就是获取该对象的迭代器,然后利用该迭代器对可迭代对象中的数值进行迭代。

综上所述,一个具备了__iter__方法的对象,就是一个可迭代对象。


接下来进入迭代器的讲解,我们再补充一点概念性的东西

iter()函数与next()函数

list、tuple等都是可迭代对象,我们可以通过iter()函数获取这些可迭代对象的迭代器。

然后我们可以对获取到的迭代器不断使用next()函数来获取下一条数据。

iter()函数实际上就是调用了可迭代对象的__iter__方法。

当序列遍历完时,将抛出一个StopIteration异常。这将使迭代器与循环兼容,因为它们将捕获这个异常以停止循环。 要创建定制的迭代器,可以编写一个具有next方法的类。


2,迭代器

通过上面的分析,相信你已经掌握了迭代器就是帮我记录每次迭代访问的位置,当我们对迭代器使用next()函数的时候,迭代器会向我们返回它所记录位置的下一个位置的数据。

实际上我们使用的next函数,调用的就是迭代器对象的__next__方法(python3中是__next__方法,python2中是next()方法)

所以我们想要构造一个迭代器就是要实现他的__next__方法,但是实现__next__方法还远远不够,python要求迭代器自身也是可以进行迭代的,所以我们还要为迭代器实现__iter__方法,而__iter__方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的__iter__方法返回自身即可。

是不是像一个绕口令,十分难记,简答来说

迭代器就是一个实现了__iter__和__next__方法的对象


通过以上讲解,你需要明白的一些结论

如果一个对象拥有__iter__方法,那么它是可迭代对象;

如果一个对象拥有next方法,其是迭代器;

定义可迭代对象,必须实现__iter__方法;

定义迭代器,必须实现__iter__和next方法;

迭代器一定是可迭代对象,反过来则不一定成立。用iter()函数可以把list、dict、str等Iterable变成Iterator


3,生成器

进入到今天的最后一个话题。激动!(一不小心又掌握了一个面试必考点,圈起来)

生成器是一种特殊的迭代器,生成器自动实现了“迭代器协议”(即__iter__和next方法),不需要再手动实现两方法。

生成器在迭代的过程中可以改变当前迭代值,而修改普通迭代器的当前迭代值往往会发生异常,影响程序的执行。

具有yield关键字的函数都是生成器,yield可以理解为return,返回后面的值给调用者。

不同的是return返回后,函数会释放,而生成器则不会。

在直接调用next方法或用for语句进行下一次迭代时,生成器会从yield下一句开始执行,直至遇到下一个yield

当然是点赞啊,哈哈哈哈

转载于:https://juejin.im/post/5cdd1431e51d456e6479b566

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33910434/article/details/91477624

智能推荐

Web技术的“后现代主义”_后现代系统模式协作开发-程序员宅基地

文章浏览阅读1.3k次。 注:今日整理电脑,无意发现以前练笔的一篇旧文,贴出来玩吧 Web技术正进入“后现代主义”后现代主义是20世纪60年代左右产生于西方发达国家的泛文化思潮,它的特点是以逆向思维的分析方法来批判,否定,超越近现代主流文化的理论基础,思维方式,价值取向为特征。它曾只是当代西方社会经济政治的观念反应,但随着近年来网络信息技术的发展和普及,包括中国在内,_后现代系统模式协作开发

spring -- 2、springIOC_spring ioc 获取ioc容器中的具体对象,需要强制类型转换-程序员宅基地

文章浏览阅读172次。1、普通创建项目方式:java文件:UserDao(用户访问接口)public interface UserDao { public void getUser();}java文件: UserDaoImpl(用户访问)public class UserDaoImpl implements UserDao { @Override public void getUser() { System.out.println("获取用户"); }_spring ioc 获取ioc容器中的具体对象,需要强制类型转换

weblogic历史漏洞利用-程序员宅基地

文章浏览阅读146次。weblogic部分漏洞利用

并行导出clob大表_exclude="constraint,grant,index,statistics-程序员宅基地

文章浏览阅读499次。#!/bin/bashchunk=10for ((i=0;i<=9;i++));doexpdp cis/cis123890@cisdb TABLES=MEDICAL_CHECK_SYSINFO_H QUERY=MEDICAL_CHECK_SYSINFO_H:\"where mod\(dbms_rowid.rowid_block_number\(rowid\)\, ${chunk}\) = ${i}\" directory=DMP dumpfile=MEDICAL_CHECK_SYSINFO_._exclude="constraint,grant,index,statistics

不义联盟网站无法连接服务器,不义联盟:人间之神无法连接服务器是什么原因...-程序员宅基地

文章浏览阅读876次。不义联盟:人间之神无法连接服务器是什么原因,相信大家在玩不义联盟:人间之神的过程中,经常会遇到这样的问题,下面ourplay小编就简单为大家介绍几种常见的解决方案。不义联盟:人间之神游戏简介《不义联盟:人间之神》是一款超级英雄格斗类游戏。游戏中,玩家可以选择自己喜欢的美国超级英雄进行对战。还原度极高的英雄形象,加上逼真的场景,使玩家身临其境。以前经常讨论的这些超级英雄究竟谁最厉害?是超人?蝙蝠侠?..._不义联盟二服务器维护什么意思

java学习笔记之webservice(四)--用Myeclipse在web项目中发布WebService_myeclipse java接口发布-程序员宅基地

文章浏览阅读2.5k次。》》接上一篇准备工作:1、新建一个web项目;2、定义服务的接口Speaker:package com.beauxie.webservice;import javax.jws.WebService;/** * 定义服务的接口 * @author * */@WebService//此注解用在类上指定将此类发布成一个WebServicepublic in_myeclipse java接口发布

随便推点

迷你极客主机Station M1开箱体验-程序员宅基地

文章浏览阅读696次。Station M1最吸引我的地方就是它迷你的尺寸随便放进口袋里就可以把主机带走只要接上显示屏或者电视就可以分享自己的工作和娱乐让我们来看看,Station M1收货到手后会有哪些东西附上开箱视频1,首先是一个包装盒和一条HDMI线和一个遥控器2,打开包装盒,里面有三样东西:Station M1主机、原装充电器、Type C线3,主机和所有的配件:4,主机的表面除了LOGO部分,其他位置做了横条散热的处理,摸起来手感很好5..._station m1

11_Power_powerunsignedexponent-程序员宅基地

文章浏览阅读217次。代码和详细注释如下:#include&lt;iostream&gt;#include&lt;math.h&gt;bool g_InvalidInput = false;bool equal(double num1, double num2);double PowerWithUnsignedExponent(double base, unsigned int exponent);doub..._powerunsignedexponent

11.数电复刻 之 组合逻辑电路_8-3线逻辑表达式-程序员宅基地

文章浏览阅读419次。1.四个基本值的关系| IOL | >= n*| IIL ||IOH | >= n* | IIH |VOH >= VIHVOL <= VIL2.门电路接负载的接入电路门—非门–LED—负载电阻----地R = (VOH - VF)/ID门—非门–LED—负载电阻----VCCR = (VCC - VOL - VF) / ID四:组合逻辑电路..._8-3线逻辑表达式

php-Arrays 函数-array_intersect_ukey-用回调函数比较键名来计算数组的交集_function func($a, $b) { return 0; } $newarray = ar-程序员宅基地

文章浏览阅读291次。array_intersect_ukey() 用回调函数比较键名来计算数组的交集【功能】 该函数将返回一个数组, 该数组包含了所有在array1中但是不在其他任何参数数组中的键名的值。 此比较是通过用户提供的回调函数进行的。 如果认为第一个参数小于、等于、或大于第二个参数时,必须_function func($a, $b) { return 0; } $newarray = array_intersect_ukey($array1

第四章 触发器练习题答案_创建一张emp1的日志记录表,emp1_log,日志记录表的字段为emp1表的字段, 并且在emp1-程序员宅基地

文章浏览阅读8k次,点赞3次,收藏15次。1、(1)创建一张emp1的日志记录表,emp1_log,日志记录表的字段为emp1表的字段, 并且在emp1表的字段基础上添加三个字段信息elogno (日志主键), execdesc(操作描述),操作时间(exectime) 创建序列,用来生成日志表的主键信息 create table emp1_log as select * from emp1 where 1=2; –要记住:..._创建一张emp1的日志记录表,emp1_log,日志记录表的字段为emp1表的字段, 并且在emp1

移动端uniapp使用uview组件在表单中上传图片并回显,预览,删除操作_uview上传图片-程序员宅基地

文章浏览阅读2.4k次。移动端uniapp使用uview组件在表单中上传图片并回显,预览,删除操作_uview上传图片

推荐文章

热门文章

相关标签