当前位置: 首页 > news >正文

迭代器 /生成器 yield

iter 迭代
iterable 可迭代的
iterator迭代器
dir函数查看一个数据类型内部含有哪些方法
两边带着双下划线的方法叫做"魔术方法","双下方法","内置方法"
这些方法都有一个特点:你可以调但是不需要你直接调用
可迭代协议 只要是含有'__iter__'方法的数据类型都是可迭代
是python规定的 : 可迭代类型 和 python语言之间的协议

检测某个变量/值 是不是可迭代的呢?
法一
print('__iter__' in dir([]))
print('__iter__' in dir(123))
法二
from collections import Iterable
print(isinstance([],Iterable)) # 内置函数,判断一个具体的值是不是某个数据类型的
print(isinstance(123,Iterable)) # 内置函数,判断一个具体的值是不是某个数据类型的

可以迭代的都可以使用for循环
for循环一个列表的时候必须用的
__next__取下一个值

迭代器协议 : 含有__next__和__iter__方法的变量/值都是迭代器
迭代器的特点:
具有next和iter方法
通过一个next多次执行就可以获得所有这个容器中的值
迭代器中的值只能取一次
不取的时候值不出现

for循环取值
for循环内部的机制就是迭代器取值的机制
在for循环执行的过程中 : 先把可迭代的变成一个迭代器,然后再从中一个一个的取值

range生成的就是一个迭代器,创建这个迭代器并不会真的把迭代器中的所有数据一次性生成
什么时候生成呢? 只有通过next取值的时候才会生成
记住你要多少个值 ,当前该给你什么,并且记住我下一个该给你什么,下一个和当前这个数的关系
迭代器的作用就是节省内存,for循环就是利用了迭代器节省内存的特点来对python当中的变量来进行操作的
本质上for循环替我们做了上面程序的一系列操作:
生成迭代器
循环每一次对这个迭代器执行next
并且到迭代器的最后就停止

判断一个变量/值是否是迭代器的方法
lst_iterator = [].__iter__()
print('__iter__' in dir(lst_iterator))
print('__next__' in dir(lst_iterator))
print('__iter__' in dir(lst_iterator) and '__next__' in dir(lst_iterator))

f是一个迭代器还是一个可迭代的
range是一个迭代器还是一个可迭代的
f = open('file')
print('__iter__' in dir(f) and '__next__' in dir(f))

a = range(10)
print('__iter__' in dir(a))
print('__iter__' in dir(a) and '__next__' in dir(a))

第二种方法
from collections import Iterator
f = open('file')
print(isinstance(f,Iterator))
print(isinstance(range(10),Iterator))
a = range(10)
for i in a:
print(i)
for i in a:
print(i)




  

转载于:https://www.cnblogs.com/zhangchen-sx/p/9910589.html

相关文章:

  • mysql表与表之间的关系
  • 对标汽车之家,新势力杉车网的另类崛起
  • RabbitMq集群搭建
  • vue-cli2使用cdn方式引入cytoscape
  • VS2015 提示 无法启动 IIS Express Web 服务器
  • P5003 跳舞的线 - 乱拐弯
  • 阿里数据库十年变迁,那些你不知道的二三事
  • RTSP(Real Time Streaming Protocol)实时流传输协议详解
  • 《三块广告牌》
  • 【重磅】Spring Boot 2.1.0 权威发布
  • Laravel Telescope:优雅的应用调试工具
  • iOS 传感器集锦
  • 2018-2019-1 20165323 《信息安全系统设计基础》第七周学习总结
  • elasticsearch Query DSL(三)
  • 在 centos 上安装 Jenkins
  • 4. 路由到控制器 - Laravel从零开始教程
  • Angular 2 DI - IoC DI - 1
  • IDEA 插件开发入门教程
  • Iterator 和 for...of 循环
  • Python利用正则抓取网页内容保存到本地
  • Python实现BT种子转化为磁力链接【实战】
  • Spark RDD学习: aggregate函数
  • Vue 动态创建 component
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 将 Measurements 和 Units 应用到物理学
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 算法---两个栈实现一个队列
  •  一套莫尔斯电报听写、翻译系统
  • ​ArcGIS Pro 如何批量删除字段
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​用户画像从0到100的构建思路
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (AngularJS)Angular 控制器之间通信初探
  • (LeetCode C++)盛最多水的容器
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (六)激光线扫描-三维重建
  • (数据结构)顺序表的定义
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)jdk与jre的区别
  • .cn根服务器被攻击之后
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Core 成都线下面基会拉开序幕
  • .net core控制台应用程序初识
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .net网站发布-允许更新此预编译站点
  • @TableLogic注解说明,以及对增删改查的影响
  • []error LNK2001: unresolved external symbol _m
  • [100天算法】-二叉树剪枝(day 48)
  • [2544]最短路 (两种算法)(HDU)
  • [ACTF2020 新生赛]Include
  • [Bugku]密码???[writeup]
  • [bzoj1901]: Zju2112 Dynamic Rankings