🍖迭代器

一.什么是迭代器

  • 器 : 工具

  • 迭代 : 是一个重复的过程, 但不是单纯的重复, 每次重复都是基于上一次的结果而进行的

  • 迭代器 : 迭代取值的工具

⛅迭代
l={'x':1,'y':2}
n=0
while n < len(l):
    print(l[n])
    n+=1

二.为何要使用迭代器

  • 为了找到一种通用的迭代取值方案
  • 为了节省内存

三.可迭代对象 (iterable)

  • 在python中,但凡内置有 __iter__ 方法的对象,都是可迭代的对象

  • 但凡调用了 __iter__方法, 就会将该类型转换成迭代器对象

⛅以下这些类型都内置"__iter__"方法
str1='hello'
list1=[1,2,3]
tup1=(1,2,3)
dic={'x':1}
s1={'a','b','c'}
f=open('a.txt','w',encoding='utf-8')

四.迭代器对象 (iterator)

  • 内置有__next____iter__ 方法的对象, 就是迭代器对象
  • 可迭代对象执行__iter__得到的返回值就是迭代器对象
dic={'x':1,'y':2,'z':3}
iter_dic=dic.__iter__()       # 获取迭代器版本
print(next(iter_dic))         # 每次取出一个值 x
print(next(iter_dic))         # y
print(next(iter_dic))         # z
print(next(iter_dic))         #只有三个值,第四次报错

s1={'a','b','c'}
iter_s1=s1.__iter__()         # 获取迭代器版本
print(next(iter_s1))          # 每次取出一个值 a
print(next(iter_s1))          # b
print(next(iter_s1))          # c
print(next(iter_s1))          #只有三个值,第四次报错

list1=[1,2,3]
iter_list1=list1.__iter__()   # 获取迭代器版本
print(next(iter_list1))       # 每次取出一个值 1
print(next(iter_list1))       # 2
print(next(iter_list1))       # 3
print(next(iter_list1))       #只有三个值,第四次报错
.......
....

五.可迭代对象 迭代器对象

1.可迭代对象

str,list,tuple,dict,set,file
  • 获取可迭代对象的方式
无需获取, Python内置的 (str,list,tuple,dict,set,file) 都是可迭代对象
  • 特点
内置有"__iter__"方法的都叫可迭代的对象,执行该方法会拿到一个迭代器对象

2.迭代器对象

ps : 文件本身就是迭代器对象
  • 获取迭代器的方式
执行可迭代对象"__iter__"方法, 拿到的返回值就是迭代器对象
  • 特点
内置有"__next__"方法, 执行该方法会拿到迭代器对象中的一个值
内置有"__iter__"方法, 执行该方法会拿到迭代器本身---->为了让 "for" 循环的设计更简单

3.文件本身就是迭代器对象

 f=open('a.txt','w',encoding='utf-8') 
 print(f.__next__())  # 直接可以调用 "__next__" 方法

六.迭代器的优缺点分析

1.优点

  • 提供了一种不依赖于索引的通用迭代取值方案
  • 惰性计算, 节省内存 (需要值, next 一下)
l=[1,2,3,4,4,5,5,6,6,6,6,6,6,6,6,6]
iter_l=l.__iter__()
print(iter_l)
print(iter_l.__next__())         # 1

l=open('a.txt','r',encoding='utf-8')
iter_l=l.__iter__()
while True:
    try:                          # 捕捉异常
        print(iter_l.__next__())  # 循环取值, 每次内存中只有一行
    except StopIteration:         # 遇到此异常(没值了)
        break                     # 结束循环

2.缺点

  • 取值麻烦, 只能一个一个取, 只能往后取
  • 无法预测值的长度
  • 并且是一次性的
x=[1,2,3]
iter_x=x.__iter__()               # 获得迭代器对象
while True:
    try:
        print(iter_x.__next__())  # 循环取值
    except StopIteration:
        break 
        
print('第二次取值尝试======》')     # 这里无法第二次取值,迭代器的值已经被取完
iter_x=x.__iter__()                # 需要重新获取迭代器
while True:
    try:
        print(iter_x.__next__())
    except StopIteration:
        break

七. For 循环原理分析

  • For 循环被称为迭代器循环,in后跟的必须是可迭代对象

  • For 循环会执行 in 后面可迭代对象的 __iter__ 方法, 拿到迭代器对象

  • 然后调用迭代器对象的 __next__ 方法,拿到一个返回值赋值给 line,执行一次循环体

  • 周而复始, 直到取值完毕, For 循环会检测异常自动结束循环

l=open('a.txt','r',encoding='utf-8')
for line in l:  #iter_l=l.__iter__()
    print(line)
l.close()

for item in {'x':1,'y':2}:
    print(item) 

事实并非理所当然 世界总是欲盖弥彰

原文地址:https://www.cnblogs.com/songhaixing/p/14103029.html