迭代器

迭代:更新换代的过程,每次的迭代都必须基于上一次的结果

迭代器:迭代取值的工具

作用

迭代器提供了一种不依赖于索引取值的方式

根据以上对于迭代的描述,如果只是简单的重复,不算迭代,如下:

n = 0
while True:
print(n)
# 这只是简单重复,不算迭代

所以,迭代应该是“重复+每次迭代都是基于上一次的结果”

l = [1,2,3,4]
s = 'hello'
n = 0
while n < len(s):
print(s[n])
n += 1

可迭代对象

内置有__iter__()方法的都叫做可迭代对象

  # 对于这种 双下划线开头 双下划线结尾的方法

  # 我们读作“双下+方法名”

基本数据类型中,是可迭代对象的有:字符串(str)、列表(list)、元组(tuple)、字典(dict)、集合(set)

  另外 文件对象(file) 是可迭代对象,也是迭代器对象

str0 = 'bitten'
str0.__iter__()
print(type(str0)) # 字符串 list0=[1,2,3,]
list0.__iter__()
print(type(list0)) # 列表 tuple0 = (1,2,3)
tuple0.__iter__()
print(type(tuple0)) # 元组 dict0={'name':'bitten'}
dict0.__iter__()
print(type(dict0)) # 字典 set0={1,2,354,}
set0.__iter__()
print(type(set0)) # 集合
f1 = open('xxx.txt','w',encoding='utf-8')
res = f1.__iter__().__iter__().__iter__().__iter__()
print(f1 is res) # True
# 文件对象(执行内置的__iter__之后还是本身 没有任何变化):文件对象本身就是迭代器对象

迭代器对象

  可迭代对象执行内置的__iter__方法得到的就是该对象的迭代器对象

  迭代器对象需要满足的条件:

  1.内置有__iter__方法
  2.内置有__next__方法
  

    ps:迭代器一定是可迭代对象  
    而可迭代对象不一定是迭代器对象

  

  迭代器对象取值方法:

  必须调用__next__()方法

l = [1,2,3,4]
# 生成一个迭代器对象
iter_l = l.__iter__() # 迭代器取值 调用__next__
print(iter_l.__next__()) #
print(iter_l.__next__()) #
print(iter_l.__next__()) #
print(iter_l.__next__()) #
print(iter_l.__next__()) # 如果取完了 直接报错StopIteration
异常处理

#把上面这五行print改成下面的形式

# while True:
# try:
# print(iter_l.__next__())
# except StopIteration:
# # print('值已近取完啦')
# break

  迭代器对象无论执行多少次__iter__()方法得到的还是迭代器对象本身

  ps:文件对象作为迭代器对象,还内置了__iter__()

    因为for循环后面in(如果迭代器对象没有__iter__)

    是因为只有使用了__iter__()方法才能继续用__next__()取值

  迭代器取值的特点
  1. 只能往后依次取 不能返回取前面的值

for循环的本质

d = {'name':'bitten','password':'','hobby':'hiking'}
for i in d:
print(i)
# for循环后面的in关键 跟的是一个可迭代对象

  for循环内部的本质
    1.将in后面的对象调用__iter__转换成可迭代对象

        上面

最新文章

  1. 一个表缺失索引发的CPU资源瓶颈案例
  2. Install ArchLinux(draft)
  3. Fragment 代码怎么写
  4. 【PHP对XML文件的操作技术【完整版】】
  5. iOS开发系列通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开
  6. (六) 6.3 Neurons Networks Gradient Checking
  7. Winform XiaoCai.WinformUI 框架界面设计
  8. C++学习笔记(十七):RTTI
  9. iOS开发之监测网络状态
  10. 扩大或缩小undo表空间
  11. 物流包裹一站式查询(TrackingMore)
  12. Spring系列(零) Spring Framework 文档中文翻译
  13. springboot上传文件 &amp; 不配置虚拟路径访问服务器图片 &amp; springboot配置日期的格式化方式 &amp; Springboot配置日期转换器
  14. 流程控制:顺序结构: 代码默认从上到下依次执行 分支结构: 细分在分为如下 循环结构: while .. for ..
  15. Android Studio 管理所有程序退出
  16. 纯js上传文件 很好用
  17. Win10安装TensorFlow1.9-GPU版本
  18. python-类属性和对象属性(转)
  19. 1.Redis安装(Linux环境)
  20. hdoj1087 (DP--LIS)

热门文章

  1. Spring 注解编程之 AnnotationMetadata
  2. Excel催化剂开源第41波-网抓网络采集类库及工具分享
  3. 个人永久性免费-Excel催化剂功能第83波-遍历文件夹内文件信息特别是图像、音视频等特有信息
  4. TinycoreLinux的安装使用
  5. MyEclipse2014破解版
  6. 我对微服务、SpringCloud、k8s、Istio的一些杂想
  7. linux初学者-磁盘拉伸缩减篇
  8. burpsuit用法
  9. java连接mysql数据库jdbc
  10. git基础学习