4.5 迭代器

4.5.1 可迭代对象

	**字面意思分析**:可以重复的迭代的实实在在的东西。
list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定)
**专业角度**: **内部含有`__iter__`方法的对象,就是可迭代对象。**
**内置函数**:dir() print(dir(str))

判断一个对象是否是可迭代对象有以下两种方式:

#方法一
print('__iter__' in dir(list)) #输出True #方法二
from collections import Iterable
l = [1,2,3,4]
s = 'asdf'
print(isinstance(l,Iterable))
print(isinstance(s,Iterable)) #输出True

优点:直观;操作方法多;

缺点:占用内存;除去索引和字典的key,不能迭代取值

4.5.2 迭代器iterator

字面意思:可重复迭代的工具

专业角度:含有__int____next__方法的对象就是迭代器

使用.__iter__()iter()可以将可迭代对象转换成迭代器

#方法一:
s = 'asasasa'
a = iter(s)
s = 'asasasa'
a = iter(s)
item = a.__next__()
print(item)
item = a.__next__()
print(item)
item = a.__next__()
print(item)
item = a.__next__()
print(item)
#方法二:
l = [1,2,3,4]
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)

迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法。

for循环,能遍历一个可迭代对象,他的内部到底进行了什么?

  • 将可迭代对象转化成迭代器。(可迭代对象.iter())
  • 内部使用__next__方法,一个一个取值。
  • 加了异常处理功能,取值到底后自动停止。

利用while循环,模拟for循环内部循环可迭代对象的机制。

  1. 先要将可迭代对象转化成迭代器。
  2. 利用next对迭代器进行取值。
  3. 利用异常处理try一下防止报错。
l = [1,2,3,4,5,6]
count = 0
ite = iter(l)
while 1:
try : #try是一个问题处理机制,配合except返回的错误来终止循环
print(next(ite))
except StopIteration:
break

​ for循环就是基于迭代器协议提供了一个统一的可以遍历所有对象的方法,即在遍历之前,先调用对象的__iter__方

法将其转换成一个迭代器,然后使用迭代器协议去实现循环访问,最重要的一点,转化成迭代器,在循环时,同一时

刻在内存中只出现一条数据,极大限度的节省了内存。

迭代器的优点:

​ ·非常节省内存

​ ·惰性机制

迭代器的缺点:

​ ·不直观

​ ·操作不灵活

​ ·效率相对低

python学习之迭代器的更多相关文章

  1. python学习10—迭代器、三元表达式与生成器

    python学习10—迭代器.三元表达式与生成器 1. 迭代器协议 定义:对象必须提供一个next方法,执行该方法或者返回迭代中的下一项,或者返回一个StopIteration异常,以终止迭代(只能往 ...

  2. Python学习--07迭代器、生成器

    迭代 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration). Python里使用for...in来迭代. 常用可迭代对象有 ...

  3. Python学习笔记 - 迭代器Iterator

    我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的genera ...

  4. python学习日记(迭代器、生成器)-乱七八糟

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...

  5. python学习 day13 迭代器,生成器,枚举对象

    一.复习 1.闭包:定义在函数内部的函数(被函数嵌套的函数) 2.装饰器:闭包的一个应用场景 -- 为一个函数添加新功能的工具 3.开放封闭原则:不能修改源代码,不能修改调用方式,但可以对外提供增加新 ...

  6. Python学习之迭代器和生成器

    那么首先什么是迭代器和生成器呢? 迭代器即迭代的工具,那么什么又是迭代呢?所谓迭代:迭代是一个重复的过程,每次重读即一次迭代,并且每次迭代的结果都是下一次迭代的初始值.例: l=[1,2,3] cou ...

  7. Python学习笔记——迭代器和生成器

    1.手动遍历迭代器 使用next函数,并捕获StopIteration异常. def manual_iter(): with open('./test.py') as f: try: while Tr ...

  8. Python学习 :迭代器&生成器

    列表生成式 列表生成式的操作顺序: 1.先依次来读取元素 for x 2.对元素进行操作 x*x 3.赋予变量 Eg.列表生成式方式一 a = [x*x for x in range(10)] pri ...

  9. python 学习分享-迭代器与生成器篇

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式.. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后 ...

  10. python学习-38迭代器和生成器

    迭代器和生成器 ---- 迭代器协议和for循环工作机制 1.迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么引起一个Stoplteration异常,以终止迭代(只能往 ...

随机推荐

  1. HDU6736 2019CCPC秦皇岛赛区 F. Forest Program

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=6736思路:dfs+栈 判环           设图中环的大小分别为 c1, c2, ..., ck,不属 ...

  2. django之路由层(反向解析)总结

    表关系的建立方式 表与表之间的关系就三种 一对一 OneToOne(to='') # to后面可以跟字符串的表名 也可以直接跟变量名表名(该表名必须在上面提前定义出来) 一对多 ForeignKey( ...

  3. node 的path

    1.文档:http://nodejs.cn/api/path.html 2.path.normalize()   规范化给定的 path,解析 '..' 和 '.' 片段. 当路径不规范时,用来返回一 ...

  4. SpringBoot2.0集成Shiro

    1.shiro的三个核心概念: 1)Subject:代表当前正在执行操作的用户,但Subject代表的可以是人,也可以是任何第三方系统帐号.当然每个subject实例都会被绑定到SercurityMa ...

  5. 计算机网络(十),HTTP的关键问题

    目录 1.在浏览器地址栏键入URL,按下回车之后经历的流程 2.HTTP状态码 3.GET请求和POST请求的区别 4.Cookie和Session的区别 5.IPV4和IPV6 十.HTTP的关键问 ...

  6. TTTTTTTTTTTTTT poj 1127 Jack Straws 线段相交+并查集

    题意: 有n个木棍,给出木棍的两个端点的x,y坐标,判断其中某两个线段是否连通(可通过其他线段连通) #include <iostream> #include <cstdio> ...

  7. linux环境下C++写TCP通信(一)

    #include<stdio.h> #include<string.h> //tcp #include<unistd.h> #include<sys/type ...

  8. ar9331修改flash大小和df、cat /proc/mtd的区别

    首先感谢黄工的指导. 在openwrt固件目录下target/linux/ar71xx/image/Makefile,找到对应的机型,修改为4M,8M,16M,32M. 以oolite机型为例,如图所 ...

  9. POJ 3613 [ Cow Relays ] DP,矩阵乘法

    解题思路 首先考虑最暴力的做法.对于每一步,我们都可以枚举每一条边,然后更新每两点之间经过\(k\)条边的最短路径.但是这样复杂度无法接受,我们考虑优化. 由于点数较少(其实最多只有\(200\)个点 ...

  10. python dict字典添加元素

    已存在的字典进行赋值操作 可为该字典添加新元素例子:a = {‘age’: 23, ‘name’: ‘lala}a[school] = ‘nanhaizhongxue’print a>>& ...