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作为哨兵值,迭代器会一直迭代下去,直到读取到最后一行。
注意事项:
- 哨兵值不能与迭代器中的值重复,否则迭代器会提前停止迭代。
- 哨兵值只能用于终止循环,而不能用于迭代过程中的中断。