英文文档:
iter(object[, sentinel])
반복자 객체를 반환합니다. 첫 번째 인수는 두 번째 인수의 존재 여부에 따라 매우 다르게 해석됩니다. 두 번째 인수가 없으면 개체는 반복 프로토콜(__iter__() 메서드)을 지원하는 컬렉션 개체이거나 시퀀스 프로토콜(0에서 시작하는 정수 인수가 있는 __getitem__() 메서드)을 지원해야 합니다. 해당 프로토콜 중 하나를 지원하지 않으면 TypeError가 발생합니다. 두 번째 인수인 sentinel이 제공되면 객체는 호출 가능한 객체여야 합니다. 이 경우 생성된 반복자는 __next__() 메소드를 호출할 때마다 인수 없이 객체를 호출합니다. 반환된 값이 sentinel과 같으면 StopIteration이 발생하고, 그렇지 않으면 값이 반환됩니다.
iter()의 두 번째 형식을 유용하게 적용한 한 가지는 특정 줄이 나올 때까지 파일의 줄을 읽는 것입니다. 도달했다. 다음 예에서는 readline() 메소드가 빈 문자열을 반환할 때까지 파일을 읽습니다.
with open('mydata.txt') as fp: for line in iter(fp.readline, ''):
process_line(line)
说明:
1. 函数功能返回一个可迭代对象。
2.二个参数不提供时,第一个参数必须是一个支持可迭代协议(即实现了__iter__()방법) 的集合(字典、集合、不可变集合),或者支持序列协议(即实现了__getitem__()방법, 방법법接收一个从0开始的整数参数)的序列(元组、列表、字符串),否则将报错。
>>> a = iter({'A':1,'B':2}) #字典集合 >>> a <dict_keyiterator object at 0x03FB8A50> >>> next(a) 'A' >>> next(a) 'B' >>> next(a) Traceback (most recent call last): File "<pyshell#36>", line 1, in <module> next(a) StopIteration >>> a = iter('abcd') #字符串序列 >>> a <str_iterator object at 0x03FB4FB0> >>> next(a) 'a' >>> next(a) 'b' >>> next(a) 'c' >>> next(a) 'd' >>> next(a) Traceback (most recent call last): File "<pyshell#29>", line 1, in <module> next(a) StopIteration
3. 当第二个参数sentinel提供时,第一个参数必须是一个可被调用对象。可被调用对象,当返回值와 sentinel值上等时,将抛出StopIteration异常, 终止迭代。
# 定义类 >>> class IterTest: def __init__(self): self.start = 0 self.end = 10 def get_next_value(self): current = self.start if current < self.end: self.start += 1 else: raise StopIteration return current >>> iterTest = IterTest() #实例化类 >>> a = iter(iterTest.get_next_value,4) # iterTest.get_next_value为可调用对象,sentinel值为4 >>> a <callable_iterator object at 0x03078D30> >>> next(a) >>> next(a) >>> next(a) >>> next(a) >>> next(a) #迭代到4终止 Traceback (most recent call last): File "<pyshell#22>", line 1, in <module> next(a) StopIteration