python高级-迭代器(18)
一、什么是迭代器
- 迭代是访问集合元素的⼀种⽅式。
- 迭代器是⼀个可以记住遍历的位置的对象。
- 迭代器对象从集合的第⼀个元素开始访问,直到所有的元素被访问完结束。
- 迭代器只能往前不会后退
二、可迭代对象
直接作⽤于 for 循环的数据类型有以下⼏种:
- ⼀类是集合数据类型:如 list 、 tuple 、 dict 、 set 、 str 等;
- ⼀类是generator ,包括⽣成器和带 yield 的generator function。
这些可以直接作⽤于 for 循环的对象统称为可迭代对象: Iterable
三、判断是否可以迭代
可以使⽤ isinstance() 判断⼀个对象是否是 Iterable 对象:
#从collections.abc模块导入Iterable工具
from collections.abc import Iterable
#判断列表是否可以迭代
print(isinstance([],Iterable))
#判断字典是否可以迭代
print(isinstance({},Iterable))
#判断生成器是否可以迭代
print(isinstance((x for x in range(1,10)),Iterable))
#判断字符串是否可以迭代
print(isinstance("abc",Iterable))
#判断整形是否可以迭代
print(isinstance(100,Iterable))
运行结果为:
True
True
True
True
False
可以看出,列表、字典、生成器、字符串都是可以被迭代的,而整形常量不可以被迭代
四、迭代器
可以被next()函数调⽤并不断返回下⼀个值的对象称为迭代器:Iterator。
可以使⽤ isinstance() 判断⼀个对象是否是 Iterator 对象:
#从collections.abc模块导入Iterator工具
from collections.abc import Iterator
#判断列表是否可以迭代
print(isinstance([],Iterator))
#判断字典是否可以迭代
print(isinstance({},Iterator))
#判断生成器是否可以迭代
print(isinstance((x for x in range(1,10)),Iterator))
#判断字符串是否可以迭代
print(isinstance("abc",Iterator))
#判断整形是否可以迭代
print(isinstance(100,Iterator))
运行结果为:
False
False
True
False
False
注意:
- 判断是否可以被迭代使用的是 Iterable,而判断是否是迭代器使用的是 Iterator,不一样的 。
- 生成器也是迭代器
- 列表、字典、字符串虽然可以被迭代,但是不是迭代器,这就说明了,迭代器一定可以迭代,但是可以迭代的不一定是迭代器。这个道理就和鱼会游泳,但是会游泳的不一定是鱼,一个道理。
五、iter()函数
⽣成器是迭代器对象,但列表、字典 、字符串虽然是可迭代的,却不是迭代器。把列表、字典、字符串等可迭代对象变成迭代器可以使⽤ iter() 函数:
#从collections.abc模块导入Iterator工具
from collections.abc import Iterator
#没有使用iter()函数
print(isinstance([],Iterator))
print(isinstance("abc",Iterator)) #使用iter()函数
print(isinstance(iter([]),Iterator))
print(isinstance(iter("abc"),Iterator))
运行结果为:
False
False
True
True
六、使用迭代器完成for循环的底层实现
for x in [1,2,3,4,5]:
print(x) #完全等价于 # 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
try:
# 获得下一个值:
x = next(it)
print(x)
except StopIteration:
# 遇到StopIteration就退出循环
break
总结
- 凡是可作⽤于 for 循环的对象都是 Iterable 类型;
- 凡是可作⽤于 next() 函数的对象都是 Iterator 类型
- 集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得⼀个 Iterator 对象。
- 迭代器对象就是实现了iter() 和 next()方法的对象.其中iter()返回迭代器本身,而next()返回容器的下一个元素,在结尾处引发StopInteration异常.
- 迭代器的优点:省内存.它是一种通过延时创建的方式生成一个序列,只有在需要的时候才被创建.
- 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问结束,只能往前不能后退
python高级-迭代器(18)的更多相关文章
- 第三篇:python高级之生成器&迭代器
python高级之生成器&迭代器 python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container ...
- python高级之生成器&迭代器
python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...
- python高级特征:列表生成式;generator, 迭代器。
Python高级特性 列表生成式:不过一种语法糖 生成器:不过一个方法 迭代器: 列表生成式 Python内置的函数,来创建list. 简单的生成: >>> list(range(1 ...
- python高级之函数
python高级之函数 本节内容 函数的介绍 函数的创建 函数参数及返回值 LEGB作用域 特殊函数 函数式编程 1.函数的介绍 为什么要有函数?因为在平时写代码时,如果没有函数的话,那么将会出现很多 ...
- python高级之面向对象高级
python高级之面向对象高级 本节内容 成员修饰符 特殊成员 类与对象 异常处理 反射/自省 单例模式 1.成员修饰符 python的类中只有私有成员和公有成员两种,不像c++中的类有公有成员(pu ...
- 第五篇:python高级之面向对象高级
python高级之面向对象高级 python高级之面向对象高级 本节内容 成员修饰符 特殊成员 类与对象 异常处理 反射/自省 单例模式 1.成员修饰符 python的类中只有私有成员和公有成员两 ...
- 第一篇:python高级之函数
python高级之函数 python高级之函数 本节内容 函数的介绍 函数的创建 函数参数及返回值 LEGB作用域 特殊函数 函数式编程 1.函数的介绍 为什么要有函数?因为在平时写代码时,如果没 ...
- Python高级特性(1):Iterators、Generators和itertools(转)
译文:Python高级特性(1):Iterators.Generators和itertools [译注]:作为一门动态脚本语言,Python 对编程初学者而言很友好,丰富的第三方库能够给使用者带来很大 ...
- python高级(二)—— python内置序列类型
本文主要内容 序列类型分类: (1)容器序列.扁平序列 (2)可变序列.不可变序列 列表推导式 生成器表达式 元组拆包 切片 排序(list.sort方法和sorted函数) bisect pytho ...
随机推荐
- Docker使用Dockerfile构建Asp.Net Core镜像
FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 FROM microsoft/dotnet:2. ...
- xcode升级10
ld: library not found for -lstdc++.6 删除 libstdc++ stackoverflow Building with libstdc++ was deprecat ...
- Jmeter中基本操作
Jmeter中基本操作包括 1:线程组 2:HTTP信息头管理器 3:HTTP请求默认值 4:HTTP请求 5:查看结果树 操作步骤如下: 1.创建一个线程组 通俗的讲一个线程组,,可以看做一个虚拟用 ...
- 2018-2019-2 20165319 《网络对抗技术》 Exp5:MSF基础应用
实验内容 metasploit中有六个模块分别是 渗透攻击模块(Exploit Modules) 辅助模块(Auxiliary Modules 攻击载荷(Payload Modules) 空字段模块( ...
- angular 数据双向绑定的终极奥义
1.ng-app: 是ng的入口,表示当前元素的所有指令都会被angular管理,让anguar认识这段代码,告诉angular要去管理下面的代码:同时angular执行这段代码的时候会在内部开辟一块 ...
- C++ Json解析CJsonObject的详细使用
引用头文件: #include <string> #include <iostream> #include <fstream> #include <casse ...
- MySQL系列
目录: 一.初识数据库 二.库相关操作 三.表相关操作 四.记录相关操作 五.数据备份.pymysql模块 六.视图.触发器.事务.存储过程.函数 七.ORM框架SQLAlchemy 八.索引原理与慢 ...
- Ubuntu下编译SqlCipher以及解密微信数据库EnMicroMsg.db过程和坑
wget https://codeload.github.com/sqlcipher/sqlcipher/zip/v3.4.2 ./configure --enable-tempstore=yes C ...
- CommonsChunkPlugin
CommonsChunk 插件的作用就是提取代码中的公共代码,然后将公共模块打包到一个独立的文件中,以便在其它的入口和模块中使用,原理就是把多个入口共同的依赖都给定义成一个新入口 多种打包情况: 单一 ...
- C# datatable 重新排序
DataTable table = distributionManageService.Tb_fund_withdrawaGetPageList(pagination, queryJson);//设置 ...