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 ...
随机推荐
- vue通信、传值的方式
原文博主地址:https://blog.csdn.net/qq_35430000/article/details/79291287 看完还是受益匪浅,讲得很详细..感谢!
- linux 禁止单个中断
有时(但是很少!)一个驱动需要禁止一个特定中断线的中断递交. 内核提供了 3 个函数为 此目的, 所有都声明在 <asm/irq.h>. 这些函数是内核 API 的一部分, 因此我们描述它 ...
- 2018.11.16 浪在ACM 集训队第五次测试赛
2018.11.16 浪在ACM 集训队第五次测试赛 整理人:李继朋 Problem A : 参考博客:[1]朱远迪 Problem B : 参考博客: Problem C : 参考博客:[1]马鸿儒 ...
- Web中的通配符
/**的意思是所有文件夹及里面的子文件夹 /*是所有文件夹,不含子文件夹 /是web项目的根目录 http://www.coderanch.com/t/364782/Servlets/java ...
- Linux 设备模型
在 2.5 开发循环中一个声明的目标是为内核创建一个统一的设备模型. 之前的内核没有单一的数据结 构, 使它们可以来获取关于系统如何整合的信息. 尽管缺乏信息, 有时事情也进行的不错. 新系统, 带 ...
- codeforces 677D(分层图dp)
Codeforces 677D 传送门:https://codeforces.com/contest/677/problem/D 题意: 给你一个n*m的方格图,每个点有一个权值val,现在要求你从坐 ...
- 查看虚拟机里的Centos7的IP(设置centos网卡)
这里之所以是查看下IP ,是我们后面要建一个Centos远程工具Xshell 连接Centos的时候,需要IP地址,所以我们这里先 学会查看虚拟机里的Centos7的IP地址 首先我们登录操作系统 用 ...
- Spring Boot + Docker + K8S 简单示例
前言 最近看了看k8s,感觉用这个管理docker确实比自己写一坨脚本进步太多了,简直不是一个次原的东西. 看着k8s的官方文档随手写了个小Demo,一个基于k8s的spring boot服务. 代码 ...
- Spring JDBC操作数据库示例
1.所需jar包 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncodi ...
- 20191107-4 beta week 2/2 Scrum立会报告+燃尽图 03
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9956 小组名称:“组长”组 组长:杨天宇 组员:魏新,罗杨美慧,王歆瑶, ...