30 迭代器

167次阅读
没有评论

共计 2147 个字符,预计需要花费 6 分钟才能阅读完成。

一. 什么是迭代器

  • 器 : 工具

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

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

⛅迭代
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____init__ 方法的对象, 就是迭代器对象
  • 可迭代对象执行 __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) 
正文完
 
shawn
版权声明:本站原创文章,由 shawn 2023-06-16发表,共计2147字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)