概述

容器是可迭代对象,迭代器通常是可迭代对象,生成器是特殊的迭代器。

relationships.png
https://nvie.com/posts/iterators-vs-generators/

可迭代对象 Iterable

可以遍历获取数据的对象

要素: 实现了 __iter__() 方法

特性: 可以作用于 for 语句

list、set、tuple、dict 等容器对象都是可迭代对象


迭代器 Iterator

实现了迭代器协议的对象

迭代器接口协议
Python 中迭代器的接口协议规定实现以下两个方法, 则可以称作迭代器
__next__() 返回下一个元素。当没有元素时抛出 StopIteration 异常
__iter__() 返回 self,即迭代器本身

要素: 实现 __iter__()__next__() 方法

特性:

1. 可以被 next() 函数调用并不断返回下一个值 

2. 延迟计算,按需使用 (惰性加载)

3. 不能直接使用下标获取数据

示例:

class UpperStringIterator:
    def __init__(self, text):
        self.text = text
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        try:
            upper_char = self.text[self.index].upper()
        except IndexError:
            raise StopIteration()
        self.index += 1
        return upper_char
        

s = UpperStringIterator("abc")     

for i in s:
    print(i)

# Result:
# A
# B
# C

生成器 Generator

特殊的迭代器

特性:

1. 相比一般迭代器,它会自动创建了__iter__()和 __next__() 方法

2. 可以用于协程的编写

1. generator function

函数中使用 yield 关键字返回值

示例:

def get_combination(a, b):
    for left in a:
        for right in b:
            yield (left, right)
        
        
combination = get_combination([1, 2], ['A', 'B'])

for item in combination:
    print(item)

# Result:
# (1, 'A')
# (1, 'B')
# (2, 'A')
# (2, 'B')

2. generator expression

列表生成式的生成器版本 (x for x in range(5))

示例:

g = (item for item in range(10))
print(isinstance(g, Generator))

# Result:
# True

参考

https://nvie.com/posts/iterators-vs-generators/


jiyang
12 声望8 粉丝

Everything will be happy endding : )