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 ...
随机推荐
- Date日期时间相关
最近在封装一个关于时间函数的功能时,竟发现这些最基本的函数都有些生疏,于是进来来总结复习下,巩固自己记忆的同时,希望能帮助到需要的人 首先了解下日期对象相关的方法 var date = new Dat ...
- 中文javadoc
大量的中文注释,其实最大的目的是想生成中文的Javadoc.但是中文注释实在太不高级了,在各种编码下还会变成乱码.本着高端大气国际化的思路,还是想把它换成英文,但是又不想放弃中文的Javadoc,怎么 ...
- Destoon系统目录树SEO属性目录开发实例
如何在destoon里设置树形目录结构的SEO优化方式官方给的SEO伪静态实例是没有这个方式的 楼主后来想了一下,就干脆自己做一个吧,已经测试完全无误通过,特意分享给大家 目前比如sell模块下类别[ ...
- Google老师亲授 TensorFlow2.0实战: 入门到进阶
Google老师亲授 TensorFlow2.0 入门到进阶 课程以Tensorflow2.0框架为主体,以图像分类.房价预测.文本分类等项目为依托,讲解Tensorflow框架的使用方法,同时学习到 ...
- 浅析 Nginx 网络事件
Nginx 是一个事件驱动的框架,所谓事件主要指的是网络事件,Nginx 每个网络连接会对应两个网络事件,一个读事件一个写事件.在深入了解 Nginx 各种原理及在极端场景下的一些错误场景处理时,需要 ...
- 基于python的分治法和例题
分治法 分治法的核心 分:将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题 治:最后的子问题,可以很容易的直接求解 合:所有子问题的解合并起来就是原问题的解 分治法的特征 ...
- 一次面试题,将 字符串 保存在 Byte 数组中
最近在面试,遇到一个面试题 字符串 String str = "AD428C93DE" 编程实现把 str 的内容放到 Byte[6] b 的数组中,存入后并能恢复原来的字符串. ...
- 常见的java异常——java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path
此异常是由于你的controller中有两个名字与内容相同的方法: 出现此异常时去检查你的controller中是否有重复的名字的方法:
- 019 Ceph整合openstack
一.整合 glance ceph 1.1 查看servverb关于openstack的用户 [root@serverb ~]# vi ./keystonerc_admin unset OS_SERVI ...
- node多进程的创建与守护
node是单线程运行,我们的node项目如何利用多核CPU的资源,同时提高node服务的稳定性呢? 1. node的单线程 进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系 ...