victory的博客

长安一片月,万户捣衣声

0%

python | 迭代器与生成器的区别

迭代器与生成器的区别

  1. python迭代器

    Python中的迭代器是一个可以记住遍历位置的对象,用于访问集合元素的一种方式。迭代器是Python中处理数据集合的一种高效机制,它们允许开发者逐个访问集合中的元素,而不需要一次性将所有数据加载到内存中

    迭代器通过实现__iter__()__next__()方法来定义其行为。__iter__()方法返回迭代器对象本身,而__next__()方法负责返回容器中的下一个值。当没有更多元素可以返回时,__next__()方法会抛出StopIteration异常,通知调用者所有元素已经被遍历完毕。

    ​ 在Python中,可以使用iter()函数获取一个对象的迭代器,然后使用next()函数来访问迭代器中的下一个元素。此外,Python的for循环本质上就是在使用迭代器,它可以自动处理StopIteration异常,使得代码更加简洁易读。以下是使用for循环遍历可迭代对象中元素的示例。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    # 使用for循环遍历list、tuple、dict、str、set等可迭代对象
    # 遍历列表list
    for element in [1, 2, 3]:
    print(element)

    # 编译元组tuple
    for element in (1, 2, 3):
    print(element)

    # 遍历字典dict
    for key in {'one': 1, 'two': 2}:
    print(key)

    # 遍历字符串str
    for char in "123":
    print(char)

    # 遍历集合
    for element in {'1', 2, 3.0}:
    print(element)


    # 使用python内置方法iter()获取对象的迭代器iterator
    # 获取字符串迭代器
    s = 'abc'
    it_s = iter(s)
    print(it_s) # <str_iterator object at 0x10c90e650>
    print(next(it_s)) # 'a'
    print(next(it_s)) # 'b'
    print(next(it_s)) # 'c'
    # print(next(it)) # StopIteration

    # 获取列表迭代器
    list1 = [1, 2, 3]
    it_list1 = iter(list1)
    print(next(it_list1)) # 1
    print(next(it_list1)) # 2
    print(next(it_list1)) # 3

    # 获取集合迭代器
    set1 = {'a', 'b', 'c'}
    it_set1 = iter(set1)
    print(next(it_set1)) # 'a'
    print(next(it_set1)) # 'b'
    print(next(it_set1)) # 'c'

    # 获取字典迭代器
    dict1 = {'a': 1, 'b': 2, 'c': 3}
    it_dict1 = iter(dict1)
    print(next(it_dict1)) # ’a‘
    print(next(it_dict1)) # ’b‘
    print(next(it_dict1)) # ’c‘

    # 获取元组迭代器
    tuple1 = (1.0, 2.0, 3.0)
    it_tuple1 = iter(tuple1)
    print(next(it_tuple1)) # 1.0
    print(next(it_tuple1)) # 2.0
    print(next(it_tuple1)) # 3.0
  2. python生成器

    Python中的生成器是一种特殊类型的迭代器,它使用yield关键字来返回数据。

    生成器是一种特殊的函数,它可以在执行过程中暂停并保存其状态,以便稍后从上次停止的位置继续执行。当生成器被调用时,它不会立即执行,而是返回一个生成器对象。只有当开始迭代该对象时,生成器才会逐步执行,并在每次遇到yield语句时返回一个值。

    生成器的主要优点是它们可以按需生成数据,而不是一次性生成所有数据。这在处理大量数据或需要延迟计算结果的情况下非常有用。生成器还可以用于实现协程(coroutines),这是一种允许多个任务协作执行的编程模式。

    以下是一个简单的生成器示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    def count_up_to(max):
    count = 1
    while count <= max:
    yield count
    count += 1

    # 创建一个生成器对象
    counter = count_up_to(5)

    # 迭代生成器对象
    for number in counter:
    print(number)

    # 使用生成器表达式定义生成器,采用()
    num_iterator = (i for i in range(10))
    print(num_iterator)
    for num in num_iterator:
    print(num)

    num_iterator2 = (i*i for i in range(10))
    print(sum(num_iterator2)) # 求平方和

    xvec = [10, 20, 30]
    yvec = [7, 5, 3]
    print(sum(x*y for x, y in zip(xvec, yvec))) # 点积

    data = 'golf'
    print(list(data[i] for i in range(len(data)-1, -1, -1))) # 反转输出字符串