迭代器超详细攻略

写的很墨迹,将就看。

首先 理解 for 循环

for i in [1,2,3,4]

print i

这个是正常

如果 for 循环一个 1234

会报错,因为 int 不是一个 iterable 类型

iterable :  字典里的意思是 可迭代的, 可重复的

可迭代的对象: 字符串str          列表 list      元组 tuple      字典 dict    集合set

#证明是否可迭代from collections import Iterable

l = [12,3,4]t = (1,2,3,4)d = {1:2,3:4}s = {1,2,3,4}

print(isinstance(l,Iterable))print(isinstance(t,Iterable))print(isinstance(d,Iterable))print(isinstance(s,Iterable))

#    清一色的 True

结合 for 循环取值的现象,再从字面上理解一下迭代其实就是 : 可以将某个数据  一个接着一个取出来   

那么可迭代协议这么理解呢?

首先,能被 for 循环的就是‘可迭代的’可以被迭代满足的要求就叫做迭代器协议。可迭代协议的定义:  内部实现了__iter__方法。

综上总结!!! 可以被 for 循环的都是可迭代的,要想可迭代,内部必须有一个__iter__方法。

那么这个__iter__做了些什么事?

print([2,3,4].__iter__())

输出结果:<list_iterator object at 0x1005d94a8>

Iterable  可迭代iterator 迭代器

迭代器是个什么鬼东西, 一会一个可迭代,一会一个迭代器,我英语一直都不好, 我也没打算再补。。。

为了python   我忍了

好  那么,我们来看一看这个带 iter 的列表和普通列表在功能实现上面有什么不一样 好不好
‘‘‘‘l([1,2].__iter__())是列表迭代器中实现的所有方法,l[1,2]是列表中实现的所有方法,都是以列表的形式返回给我们,为了看的更清楚,我们分别把他们转换成集合。   然后取差集‘‘‘## print(dir([1,2].__iter__()))# print(dir([1,2]))

print(set(dir([1,2].__iter__())) - set(dir(dir([1,2]))))#注意盯着看你的括号是否给到位

输出结果:

/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 "/Users/macbookpro/PycharmProjects/迭代器生成器/blog 代码.py"
{‘__length_hint__‘, ‘__next__‘, ‘__setstate__‘}

Process finished with exit code 0

重点就看 最后多出来的那三个方法

{‘__length_hint__‘, ‘__next__‘, ‘__setstate__‘}

那么我们继续来看这三个方法,分别都是干啥的,什么来路!

iter_l = [1,2,3,4,5,6].__iter__()
#获取迭代器中元素的长度
print(iter_l.__length_hint__())
#根据索引值指定从哪里开始迭代
print(‘*‘,iter_l.__setstate__(4))
!!!!!!#一个一个的取值
print(‘**‘,iter_l.__next__())
print(‘***‘,iter_l.__next__())

好的,这三个办法我们都一个个试过了。  来, 跟着我回归一下初心 扪心问问自己,今天我们学的是啥。对,最上面写的有,但是我怕我忘,在这再回忆一下。能用 for 循环的的都是可迭代的,可迭代的内部都使用了__iter__方法

__iter__是根据可迭代协议定出来的,没有为什么 你就这样记就行

然后响指!各位宝贝,  上述三个方法中,能一个一个取值,感觉和 for 循环一样样的是谁?对!没错!是他!我们的朋友,小哪吒= __next__
再 for 循环中,就是在内部调用了__next__方法,才能一个一个取值

‘‘‘我是很纯很纯并且很蠢and 年龄还大的小白一个,啥也不会,脑子也笨,刚看过的句子 ,到句号 我就忘记句号前面的东西了。代码没思路 也理解不了,  我要是真的会,我干嘛要一遍一遍的翻博客,早进行下面的东西了,但是这个东西,你学会了 别人也拿不走,以后说不定 你多会一句, 你就能比别人多装一个很完美逼格很高的比了目前我的办法是,  只要有时间,  理解代码理解思路刚开始看到这么一堆我20多年没见过没接触的11002200312030还有这个那个 的时候 我是懵逼 并且很不把它当做一回事的,可是  真的 被这个破 python 教育的不要不要的, 没有什么不劳而获,就算有那个人也不是你深深深深深深*******n 的挫败感  越是让我不好受,我越要征服你。  各位一起加油!!!‘‘‘

来,接着上面,我们码起来,  你看再多,不如自己照着码一遍有用,码一遍你没收获,那就再码继续码  

#用迭代器的 next 方法来写一个不依赖 for 的遍历
l = [1,2,3,4]‘‘‘__iter__是上面说过的,想要可迭代内部必须有__iter__方法这里就是先调用这个方法,让这个列表可迭代然后下面就是用__next__取值‘‘‘l_iter = l.__iter__()item = l_iter.__next__()print(item)

item = l_iter.__next__()print(item)

item = l_iter.__next__()print(item)

item = l_iter.__next__()print(item)

item = l_iter.__next__()print(item)

item = l_iter.__next__()print(item)

打印结果:

StopIteration
1
2
3
4

报错了,但是这个报错我们不尴尬,因为我们把迭代器里的元素取完了,然后你还要取它就给

你抛出一个异常StopIterration,就是在告诉我们,列表中已经没有有效的元素了。

如何处理呢?comeon 
l = [1,2,3,4]#先把它转化为可迭代的用 iterl_iter = l.__iter__()while 1 :    try:        #取它值   用 next        item = l_iter.__next__()        print(item)    except StopIteration:        break

好, 那么everybody ,我们是如何用 while 循环来实现 for 循环的功能呢,来看 我们是从谁哪里拿的一个又一个的值啊, 是妈妈??!l_iter 就是一个迭代器
so 总结一下: 迭代器遵循迭代器协议:必须拥有__iter__和__next__方法。

来吧, 看一下 range()是个什么鬼。我们目前可以确定的是, 它肯定是一个可迭代对象,来查一波看看他是不是一个迭代器
print(‘__next__‘in dir(range(7)))print(‘__iter__‘in dir(range(7)))

from collections import Iteratorprint(isinstance(range(100),Iterator))

打印结果: False True False 

so想要可迭代 内部必须有__iter__方法和__next__方法 so    range()不是一个迭代器

是,很多东西我们也可以通过下标来取值, 比如序列类型字符串,列表,元组但是,那些没有下标的呢,它们不要面子的吗?  你觉得字典,集合这些非序列类型不够漂亮吗?so for 循环就是基于迭代器协议提供了一个统一的可以遍历所有对象的方法,就是我们上面说的调用对象的__iter__方法将其转换成一个迭代器,然后使用迭代器协议取实现循环访问,这样所有的对象就都可以通过 for 循环来遍历了。

下一篇是生成器。
时间: 2024-12-28 01:55:19

迭代器超详细攻略的相关文章

黑客榜中榜,超详细攻略!小白整理

黑客榜中榜第一期攻略 本人萌新小白一个,尽量把步骤都详细的整理出来,供新手参考. 先是第一期第一关 上图..... 这个是在未知的情况下要求通过各种方法获取到密码,然后登陆! 我使用的是火狐浏览器,使用F12快捷键,可以看到网页HTML源代码,分析源代码! 很多我都看不懂....... 分析一下能看懂的: if判断试 首先定义了一个全局变量"X"(至于"X"等于啥玩意我就不知道了,回头再研究) 下面就是判断 "X"是否等于 "go   

Android Xml解析之DOM详细攻略

参考地址:http://wenku.baidu.com/view/aca83d12cc7931b765ce15d1.html 由于dom方式是保存于内存中,比较耗内存,不过对于一些数据量比较小但又比较常用的隐秘信息,可以用此方法 People类是自己写的一个类,主要保存各个字符串数据. 1.为了具有扩展性 自己编了一个xml文件: <?xml version="1.0" encoding="utf-8"?> <peoples> <peo

去塞班生子入境详细攻略

众所周知,去塞班现在都是落地签,从而就吸引了很多想要去塞班生孩子的孕妈们,因为不需要涉及到签证,但是要准备去塞班生子入境的材料就尤为重要了.孕妈在怀孕37.38周的样子就可以入境了,只有充分准备好了塞班生子入境的材料,挺着大肚子才能入境,如果没有准备好塞班生子入境的资料被拒绝入境,那么孕妈的塞班生子之旅就要结束了.接下来就说说塞班生子入境的详细攻略. 1.材料准备 首先去塞班岛是实行的落地签证,所以要准备的有护照(有效期超过半年).去塞班岛的往返机票.入境塞班的登记表等入境的资料. 除开以上的塞

《天煞》天煞妖灵职业技能详细攻略技巧介绍

<天煞>继上次开测后已经有一段时间,不知道有多少小伙伴怀念游戏中萌萌哒的小妖灵,今天小编就<天煞>妖灵职业技能做个详细的介绍,一起来看看吧! 不要以为我小就好欺负!哼! 强大的爆发兼具控制的法师,这就是妖灵. 妖灵是远程职业,以法器为武器,攻击以输出和爆发为主,以控制为辅. 妖灵的技能也突出爆发和控制. 地火突袭:请注意你的脚下!哎呀,不好意思,提醒晚了! 双手拍击地面,震动地火攻击敌人,使敌人浮空.远程先手技能,可以使敌人浮空之后接其他技能或者普攻.需要注意的是,如果范围内没有目

zabbix接入百度告警详细攻略

第一章:百度告警端配置 首先需要申请百度告警账号,使用以下链接注册百度告警账号: http://gaojing.baidu.com/#/register 输入邮箱后,点击验证注册码,所注册的邮箱会收到一封来自百度告警平台的验证码: 账号注册完成后来到登录界面,依次分别验证手机.短信.及微信账号,其中微信账号的验证为点击后出现一幅二维码,使用微信手机客户端扫描验证即可. 点击我创建的空间,进入个人告警管理界面 首先点击"升级策略",选择"新增升级策略" 在新增界面升级

iOS打包Framework真机和模拟器兼容合并版本 - 详细攻略步骤

打包Framework,测试时: 1.用模拟器打包,测试时只能跑在模拟器 2.用真机打包,测试时只能跑在真机 那么怎么做到一个版本兼容以上两种场景呢? 解决如下: 1.打开终端 2.输入   lipo -create [模拟器打包path] [真机打包path] -output [导出兼容版本path] =======================  示例  Demo========================== 准备前提: -- 假设我们包已经完成,并在模拟器和真机都能编译通过. --

C++ 类 超细节攻略

C++坑了我不少的时间,这回把类算是弄得明白一些,在此记录一下.内容非常繁杂,请做好心理准备. 我会以代码的形式来表达,并且附上一些解释. ① 编译器分两步处理类: 编译成员的声明 直到类全部可见后才编译成员函数体 ② C++ 中class与struct的区别? C++中唯一区别就是默认的访问权限,struct是public,class是private C#中区别很大,详情百度 ③ .h文件 (注意:是struct) 1 struct Sales_data 2 { 3 // 定义友元函数让其可以

CentOS 下安装 nagios 详细攻略

一.安装环境 1.CentOS 6.5 64 位 2.nagios-4.3.2 3.nagios-plugins-2.2.1 二.安装步骤1.su root #切换到 root 用户 2.yum install -y gcc glibcglibc-common gd gd-devel xinetd openssl-devel httpd php unzip perl vim /etc/selinux/config #关闭防火墙,将 SELINUX=enforcing 改为 SELINUX=dis

axios全攻略

随着 vuejs 作者尤雨溪发布消息,不再继续维护vue-resource,并推荐大家使用 axios 开始,axios 被越来越多的人所了解.本来想在网上找找详细攻略,突然发现,axios 的官方文档本身就非常详细!!有这个还要什么自行车!!所以推荐大家学习这种库,最好详细阅读其官方文档.大概翻译了一下 axios 的官方文档,相信大家只要吃透本文再加以实践,axios 就是小意思啦!! 如果您觉得本文对您有帮助,不妨点个赞或关注收藏一下,您的鼓励对我非常重要. axios 简介 axios