Python——第四章:迭代器(Iterators)

迭代器iterator

提到迭代器,最典型的就是for循环

for 变量 in 可迭代:
    pass

可迭代对象iterable

是指可以使用 for 循环进行遍历的对象。除了字符串 (str)、列表 (list)、元组 (tuple)、字典 (dict)、集合 (set) 和文件对象 (open()) 之外,还有其他一些常见的可迭代对象,例如生成器对象、range 对象等。

通常,容器类型的对象都是可迭代的(如字符串、列表、元组、字典、集合等),不是容器类型的对象都不是可迭代的。

it = iter("你好啊朋友")
print(it)

#运行结果:
<str_iterator object at 0x000001A9B79F9390>

不可迭代的对象not iterable

通常是指那些不支持使用 for 循环进行遍历的对象(不是容器类型的对象)。例如:

  1. 整数 (int) 和浮点数 (float): 直接的数字类型是不可迭代的。
    for c in 123456:
        print(c)
        
    #运行结果
    Traceback (most recent call last):
      File "D:\装饰器.py", line 1, in <module>
        for c in 123456:
    TypeError: 'int' object is not iterable

    iterable: 可迭代的

  2. 布尔值 (bool): 布尔值也是不可迭代的。
    # 不可迭代的例子
    bool_value = True
    for b in bool_value:
        print(b)
  3. NoneType (None): None 也不可迭代。
    # 不可迭代的例子
    none_value = None
    for n in none_value:
        print(n)

迭代器(Iterator)的概念

它允许你按需逐个访问集合中的元素,而不需要提前获取整个集合。迭代器协议是指实现了 __iter__()__next__() 方法的对象,其中 __iter__() 返回迭代器对象本身,而 __next__() 返回集合中的下一个元素。

获取迭代器的两种方案:
    1. iter() 内置函数可以直接拿到迭代器
    2. __iter__() 特殊方法

从迭代器中拿到数据:
    1. next() 内置函数
    2. __next__() 特殊方法

it = iter("你好啊")    # 或者 it = "你好啊".__iter__()

print(1,it.__next__())
print(2,next(it))
print(3,it.__next__())

#运行结果
123

for里面一定是要拿迭代器的. 所以所有不可迭代的东西不能用for循环
for循环里面一定有__next__出现

模拟for循环工作原理:

s = "我是数据"
it = s.__iter__()  # 拿到迭代器
while 1:
    try:
        data = it.__next__()
        print(data)  # for循环的循环体
    except StopIteration:
        break
print(123456)

总结: 迭代器统一了不同数据类型的遍历工作

迭代器本身的特性:

  1. 只能向前不能向后,也不能反复
  2. 迭代器是一次性的,全部执行过后变成StopIteration,再次使用需要再次iter()
  3. 特别节省内存(可以用很少的内存,去循环遍历很庞大数据体)
  4. 惰性机制(迭代器一旦创建出来,不主动去访问__next__,就不会自动向前遍历。什么时候调用一次,指针才会挪动一次。)(类似于医院的叫号机制)
it = iter("你好啊")    # 或者 it = "你好啊".__iter__()

print(1,it.__next__())
print(2,next(it))
print(3,it.__next__())
print(4,next(it))    # StopIteration: 迭代已经停止了. 不可以再次从迭代器中继续拿数据了
print(5,it.__next__())

#运行结果
Traceback (most recent call last):
  File "D:\生成器.py", line 6, in <module>
    print(4,next(it))   # StopIteration: 迭代已经停止了. 不可以再次从迭代器中拿数据了
            ^^^^^^^^
StopIteration
123

迭代器本身也是可迭代的:

s = "你好啊, 我叫赛利亚"
it = s.__iter__()    #拿字符串s的迭代器

for mm in it:
    print(mm)

循环就是迭代的代表,循环it就能证明迭代器本身it可以被迭代

posted @   Magiclala  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示