python3迭代器
一、前提
1.dir()函数
dir()函数带参数时,返回参数的属性和方法列表;不带参数时,返回当前范围内变量、方法和定义的类型列表
# dir(参数):带参数,返回参数的属性和方法
s = ''
print(dir(s))
print(dir([]))
2.双下法
双下法:带双下划线的方法。双下很少被直接调用,一般通过其它语法触发效果
l1 = [2, 1]
l2 = [1, 2]
print(l1 + l2) # l1+l2 -> l1.__add__(l2),通过python解释器转化
print(l1.__add__(l2))
二、可迭代协议
1.可迭代协议:只要含有__iter__方法,就是可迭代的
2.判断
# 方法1,判断是否含义__iter__方法
l1 = list(range(10))
res = '__iter__' in dir(l1)
if res:
print('l1,可迭代')
else:
print('l1,不可迭代')
# 方法2,通过导入模块
from collections import Iterable, Iterator # from collections import Iterable 被弃用 s = 'Hello, World!'
res = isinstance(s, Iterable)
if res:
print('s,可迭代')
else:
print('s,不可迭代')
三、迭代器协议
1.迭代器协议:含有__iter__和__next__方法,就是迭代器
2.获取迭代器
li = list(range(5))
iterator = li.__iter__() # __iter__()方法的返回值,就是迭代器,将可迭代变成迭代器
print(iterator)
3.判断
# 方法1,通过__iter__和__next__方法判断
li = list(range(-5, 0))
# li = list(range(-5, 0)).__iter__() # list不是迭代器,但list.__iter__()是迭代器
_iter = '__iter__' in dir(li)
_next = '__next__' in dir(li)
if _iter and _next:
print("li,是迭代器")
else:
print('li,不是迭代器')
# 方法2,通过导入模块
from collections.abc import Iterator
li = list(range(10))
if isinstance(li, Iterator):
print('l1,是迭代器')
else:
print('li,不是迭代器')
4.遍历
1)__next__
"""
__next__()方法
只要迭代器才有__next__()方法
__next__()方法,从迭代器中一个一个取值 """
l1 = list(range(10, -5, -1))
count = 0
iterator = l1.__iter__()
while count < 5:
count += 1
print(iterator.__next__()) # 输出前五个元素
print('>>>', iterator.__next__()) # 输出第六个元素
2)for循环
"""
for循环1
对象是可迭代,但不是迭代器
使用for循环,实质是通过for循环创建一个迭代器
所以,每次使用for循环都会创建一个新的迭代器 """
l1 = list(range(10, -5, -1))
count = 0
for i in l1(): # l1是可迭代对象,不是迭代器
count += 1
print(i)
if count > 5:
break
for i in l1(): # for循环内部创建一个新的迭代器
print(i)
"""
for循环2
对象是迭代器
使用for循环,不用通过for循环内部另创一个迭代器
所以,每次使用for循环使用的都是同一个迭代器 """
l1 = list(range(10, -5, -1))
count = 0
iterator = l1.__iter__()
for i in iterator: # iterator是迭代器
count += 1
print(i)
if count > 5:
break
for i in iterator: # 重新开始for循环,使用的依然是同一个迭代器
print(i)
四、迭代器的优点
1.从容器类型中取值,不需要索引、key等
2.降低内存消耗
原因:迭代器的数据通过for循环或__next__()方法加载到内存,而不是一次加载全部数据
五、总结
1.迭代器一定可迭代,可迭代不一定是迭代器
2.可迭代一定可以使用for循环,可以使用for循环一定可迭代
3.for循环,通过内部处理:可迭代->迭代器
4.迭代器:取容器类型的值,不依靠索引、key等
减低内存的消耗
5.可迭代,可以通过__iter__()方法变成迭代器
6.通过判断是否可迭代,来确定是否使用for循环
python3迭代器的更多相关文章
- Python3+迭代器与生成器
转载Python3 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素 ...
- python014 Python3 迭代器与生成器
Python3 迭代器与生成器迭代器迭代是Python最强大的功能之一,是访问集合元素的一种方式..迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结 ...
- python3 迭代器(Iterator)和生成器(generator)
一.迭代器定义: 迭代是访问集合元素的一种方式,迭代器是一个可以记住遍历位置的对象: 集合数据类型如list.dict.str等是Iterable但不是Iterator,不过可以通过iter()函数获 ...
- Python3迭代器与生成器
迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...
- python3 迭代器
''' 迭代:重复的过程,并且每次迭代的结果都是下次迭代的初始值 可迭代的 Iterable 迭代器 Iterator iter(数据) == 数据.__iter__() 将数据转换为迭代器 next ...
- python3: 迭代器与生成器(1)
1. 手动遍历迭代器 你想遍历一个可迭代对象中的所有元素,但是却不想使用for循环. >>> items = [1, 2, 3] >>> # Get the ite ...
- python3迭代器和生成器
1.手动访问迭代器中的元素 #要手动访问迭代器中的元素,可以使用next()函数 In [3]: with open('/etc/passwd') as f: ...: try: ...: while ...
- Python3 迭代器和生成器
想要搞明白什么是迭代器,首先要了解几个名词:容器(container).迭代(iteration).可迭代对象(iterable).迭代器(iterator).生成器(generator). 看图是不 ...
- Python3 迭代器,生成器,装饰器
1.迭代器 迭代器有两个基本方法,iter()和next(),next()完成后会引发StopIteration异常 a='abcdef' b=iter(a) #创建迭代器对象 print(type( ...
- python3 迭代器,生成器
一 .什么是迭代 1. 重复 2.下次重复一定是基于上一次的结果而来 while True: cmd=input(':') print(cmd) l=[1,2,3,4] count=0 while c ...
随机推荐
- node第一个参数必须是err
Node.js 约定回调函数第一个参数必须是错误对象err: 问题:Node.js约定回调函数第一个参数必须是错误对象err,如果没有错误该参数就是null 原因:异步执行分成两段,在两段之间抛出异常 ...
- linux 不用 ioctl 的设备控制
有时控制设备最好是通过写控制序列到设备自身来实现. 例如, 这个技术用在控制台驱动 中, 这里所谓的 escape 序列被用来移动光标, 改变缺省的颜色, 或者进行其他的配置任 务. 这样实现设备控制 ...
- 51nod 1307绳子和重物
1307 绳子与重物 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 有N条绳子编号 0 至 N - 1,每条绳子后 ...
- Github上的英文解释
1.AFAIK: As far as I know. 据我所知 2.SPOF: Single point of failure. 单节点崩溃 3.ASAP: As soon as possible. ...
- JS(JavaScript)的j进一步了解9(更新中···)
1.动画 (1) Css样式提供了运动 过渡的属性transition 从一种情况到另一种情况叫过渡 Transition:attr time linear delay: Attr 是变化的属 ...
- 微信小程序样式wxss各种问题总结(不断更新)
1)加入其它样式文件 @import '/css/dialog.wxss'; //注意:必须结尾用分号 2)隐藏滚动条 ::-webkit-scrollbar { width:; height:; c ...
- 保存会话数据的两种技术,Cookie,Session
CookieCookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器.当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去.这样,web资源处理的就是用 ...
- saltstack的配置使用
介绍 认证管理,使其可以用于编配, 远程执行, 配置管理等等.部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯. 号称世界上最快的消息队列ZeroMQ使得 ...
- SVN+Apache+IF.svnadmin支持https实现web管理SVN
一,软件准备 .安装apache [root@localhost ~]# yum install httpd -y .安装svn服务器(其中,mod_dav_svn是apache服务器访问svn的一个 ...
- beta 1/2 阶段中间产物提交入口
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9918 git地址:https://e.coding.net/Eustia ...