python迭代器

迭代器

一、可迭代对象

  • 可迭代对象

    • 字面意思:对象?python中一切皆对象。一个实在存在的值,对象
    • 可迭代?:更新迭代,重复的,循环的一个国产,每一次都不太一样!(比如你爷爷生你爸爸,你爸爸生你,你生你儿子)
    • 可迭代对象:可以循环更新的,一个实实在在的值!!!
    • 专业角度:内部含有‘——iter——’方法的对象,就叫可迭代对象
    • 学过的可迭代对象:str、list、dict、tuple、set、range、文件句柄
  • 优点:

    • 存储的数据能直接显示,比较直观
    • 拥有的方法比较多,操作方便
  • 缺点:

    • 占内存大
    • 不能直接通过for循环,不能直接取值(索引、key)
#实际上是解释器做了封装,要不然不能直接循环遍历
li = [1,2,3,4]
for i in li:
    print(i)
  • 代码判断是否是可迭代对象
# dir(),作用获取一个对象的所以方法,有__iter__就是可迭代对象
s = "tzh"
print('__iter__' in dir(s))
#返回true

二、迭代器

  • 定义:

    • 字面意思:可更新迭代的工具
    • 专业角度:内部含有‘——iter——’或者‘——next——’方法的对象就是迭代器
  • 判断方法:

    # dir(),作用获取一个对象的所以方法,有__iter__就是可迭代对象
    li = ["tzh"]
    print('__iter__' in dir(li) and '__next__' in dir(li))
    
2.1、可迭代对象转换成迭代器
  • 优点:
    • 节省内存
    • 惰性机制,取值一次取一个!
  • 缺点:
    • 速度慢
    • 不走回头路,只能next,不能回去
s = 'tzhqwe'
obj = iter(s)   #等价于s.__iter__()
print(obj)      #是不可以直接看到数据的

#那怎么看呢?
#这样只打印第一个字母,也就是t
#next一次打印一次,多了会报错哦
print(next(obj)) #等价于obj.__next__()
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))

------
li = [1,2,3,4,5]
obj = iter(li)
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))

三、可迭代对象与迭代器对比

  • 可迭代器对象是一个操作方法比较多,输出比较直观,存储数据相对少的数据集
    • 应用:测重于对数据可以灵活处理,并且内存空间足够,将数据集设置为可迭代对象是明确的选择。(说白了,丢到字典、列表里面)

  • 是一个非常节省内存,可以记录取值位置,可以直接通过循环+next方法取值,但是不直观,操作方法比较单一的数据集。
    • 应用:当你的数据量过大,大到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择。(可参考为什么python把文件句柄设置成迭代器)。
原文地址:https://www.cnblogs.com/hsyw/p/13611456.html