Python迭代器

【一】什么是迭代器      

         在Python中,迭代器(iterator)是一种用于遍历集合的对象,它提供一种访问集合元素的方式,而无需暴露其底层表示。迭代器可以被用于遍历列表、元组、字典、集合等可迭代对象。 

【二】实现方法

        迭代器对象必须实现两个方法:

  1. __iter__():返回迭代器对象自身。
  2. __next__():返回迭代器中的下一个元素。如果没有下一个元素了,则触发 StopIteration 异常。

在使用迭代器时,通常会通过 iter() 函数获取迭代器对象,然后通过调用 next() 函数来逐个访问元素,直到抛出 StopIteration 异常为止。

 示例,展示了如何通过迭代器访问列表中的元素:

 

# 创建一个列表
my_list = [1, 2, 3, 4, 5]

# 获取迭代器对象
iter_obj = iter(my_list)

# 通过迭代器遍历列表元素
try:
    while True:
        element = next(iter_obj)
        print(element)
except StopIteration:
    pass

 【三】可迭代的对象

        迭代器里的元素其实是数据流,只有当你使用next()调用它的时候,它才会出来。

        这里和第二种投篮方式方式思路接近,只有你发生了投篮行为next(),才会开始下一次投篮。

        说到这里,可能你开始有些懂了,但还比较抽象,下面我们看下具体的代码。

【1】列表 

# 用列表装5个篮球
this_is_basketball = [1,2,3,4,5]
# 投球
for player in this_is_basketball:
    print('投球:',player)


# 投球: 1
# 投球: 2
# 投球: 3
# 投球: 4
# 投球: 5

可以看出来迭代器并不真正的把所有篮球都放出来,而是存储了生成元素的逻辑,你每次取的时候,篮球就会挨个被取出来。而列表是把篮球都装进来,for循环挨个投。

用迭代器的好处是你可以投1万次、10万次甚至无数次球,而列表能装的容量总是局限的。

所以说迭代器是一个惰性的数据流。

from collections.abc import Iterable
isinstance([], Iterable)
# 返回 True,说明列表是可迭代对象

元组、字典、字符串等也都是可迭代对象。

注意,可迭代对象不可以用next()函数挨个去访问元素

【2】字符串(String)迭代器

my_string = "Hello, World!"
iter_obj = iter(my_string)

# 使用迭代器遍历字符串字符
try:
    while True:
        char = next(iter_obj)
        print(char)
except StopIteration:
    pass

【3】元组(Tuple)迭代器

my_tuple = (1, 2, 3, 4, 5)
iter_obj = iter(my_tuple)

# 使用迭代器遍历元组元素
try:
    while True:
        element = next(iter_obj)
        print(element)
except StopIteration:
    pass

【4】字典(Dictionary)迭代器:字典是可迭代对象,但直接使用 iter() 函数返回的是字典的键的迭代器对象。如果需要遍历字典的值或键值对,可以使用 items()values() 或 keys() 方法。

my_dict = {'a': 1, 'b': 2, 'c': 3}
iter_obj = iter(my_dict)

# 使用迭代器遍历字典键
try:
    while True:
        key = next(iter_obj)
        print(key)
except StopIteration:
    pass

# 遍历字典的值
for value in my_dict.values():
    print(value)

# 遍历字典的键值对
for key, value in my_dict.items():
    print(key, value)

【四】for的原理

        在Python中,for 循环实际上是使用迭代器来进行遍历的。当你对一个可迭代对象(比如列表、元组、集合)进行 for 循环时,Python 解释器会在后台自动创建一个迭代器,并使用该迭代器来遍历元素。

下面是一个示例,演示了 for 循环如何与迭代器一起使用:

my_list = [1, 2, 3, 4, 5]

# 使用 for 循环遍历列表元素
for element in my_list:
    print(element)

        在上述示例中,my_list 是一个可迭代对象,for 循环会自动创建一个迭代器并使用它来遍历列表中的元素。在每次迭代中,迭代器会从列表中获取下一个元素,然后将其赋值给 element 变量,直到遍历完所有元素为止。

        通过 for 循环使用迭代器遍历元素的好处是,它隐藏了迭代器的具体实现细节,让代码更加简洁和易读。此外,for 循环还能够处理迭代过程中的异常情况,如自动处理 StopIteration 异常,无需手动捕获和处理。

总结来说,for 循环与迭代器是紧密相关的,for 循环使用迭代器来遍历可迭代对象的元素,提供了一种简洁、易用的方式来处理集合类型的数据结构。

 

 【五】迭代器的优缺点

 

优点:

  1. 惰性计算:迭代器是一种惰性计算(lazy evaluation)的机制,它只在需要时才计算下一个值,这样可以节省内存并提高效率,特别是当处理大型数据集合时。

  2. 适用于大型数据集合:由于惰性计算的特性,迭代器非常适合处理大型数据集合,因为它可以一次处理数据的一部分而不是全部数据,从而减少内存消耗。

  3. 通用性:迭代器可以应用于各种不同类型的数据结构,包括列表、元组、字典、集合等,以及自定义的数据类型,使得代码更具通用性和可复用性。

  4. 支持无限序列:迭代器可以表示无限大的序列,因为它只在需要时才计算下一个值,不需要提前生成整个序列。

缺点:

  1. 单向性:迭代器通常是单向的,即一旦遍历过元素,就不能再回到之前的位置重新遍历,这在某些情况下可能带来不便。

  2. 难以理解:对于初学者来说,迭代器的概念可能比较抽象,有时候会增加代码的复杂度和理解难度。

  3. 不易调试:由于迭代器的惰性计算特性,当出现错误时很难进行调试,因为很难准确定位到程序出错的位置。

 

 

 

你可能感兴趣的:(python)