Python iter()使用哨兵值

  • Post category:Python

iter()是Python内置函数,用于生成迭代器。在使用iter()时,可以通过给其传递哨兵值来标识迭代器的结束条件,即当迭代到哨兵值时,迭代器停止迭代。下面是iter()使用哨兵值的完整攻略。

基本语法

iter(obj, sentinel)

其中,obj为可迭代对象,sentinel为哨兵值。

使用示例

示例1:自定义迭代器,以特定值作为哨兵值停止迭代

class CustomIterator:
    def __init__(self, sentinel):
        self.sentinel = sentinel
        self.current = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.current == self.sentinel:
            raise StopIteration
        value = self.current
        self.current += 1
        return value

iter_obj = iter(CustomIterator(5), 100)
for i in iter_obj:
    print(i)

输出结果为:

0
1
2
3
4

在上面的示例中,我们自定义了一个迭代器类CustomIterator,该类实现了__iter____next__两个方法。在使用iter()函数生成迭代器对象时,我们传递了一个哨兵值5,代表迭代到5时停止迭代。而传递给iter()函数的第二个参数100,则是表示当读取到值为100时,也停止迭代。由于我们的自定义迭代器不可能迭代到100,因此实际上使用哨兵值停止迭代。

示例2:读取文件中以某行开头的所有行

def read_lines(filename, start):
    with open(filename, 'r') as f:
        for line in f:
            if line.startswith(start):
                yield line
            else:
                raise StopIteration

iter_obj = iter(read_lines('test.txt', 'hello'), None)

for line in iter_obj:
    print(line.strip())

在上面的示例中,我们定义了一个读取文件的函数read_lines,读取文件test.txt中以start开头的所有行。使用iter()函数生成迭代器对象时,传递了一个哨兵值None,代表以None作为哨兵值,迭代器会一直迭代下去,直到读取到最后一行。

注意事项:

  • 哨兵值不能与迭代器中的值重复,否则迭代器会提前停止迭代。
  • 哨兵值只能用于终止循环,而不能用于迭代过程中的中断。