英文文档:
iter(object[, sentinel])
Gibt ein Iteratorobjekt zurück. Das erste Argument wird je nach Vorhandensein des zweiten Arguments sehr unterschiedlich interpretiert. Ohne ein zweites Argument muss das Objekt ein Sammlungsobjekt sein, das das Iterationsprotokoll unterstützt (die Methode __iter__()), oder es muss das Sequenzprotokoll unterstützen (die Methode __getitem__() mit ganzzahligen Argumenten, die bei 0 beginnen). Wenn keines dieser Protokolle unterstützt wird, wird „TypeError“ ausgelöst. Wenn das zweite Argument, Sentinel, angegeben ist, muss das Objekt ein aufrufbares Objekt sein. Der in diesem Fall erstellte Iterator ruft bei jedem Aufruf der Methode its__next__() das Objekt ohne Argumente auf. Wenn der zurückgegebene Wert gleich „sentinel“ ist, wird „StopIteration“ ausgelöst, andernfalls wird der Wert zurückgegeben.
Eine nützliche Anwendung der zweiten Form von „iter()“ besteht darin, Zeilen einer Datei zu lesen, bis eine bestimmte Zeile erreicht ist erreicht. Das folgende Beispiel liest eine Datei, bis die Methode „readline()“ eine leere Zeichenfolge zurückgibt:
with open('mydata.txt') as fp: for line in iter(fp.readline, ''):
process_line(line)
说明:
1第二个参数不提供时,第一个参数必须是一个支持可迭代协议(即实现了__iter__()方法)的集合(字典、集合、不可变集合),或者支持序列协议(即实现了__getitem__()方法,方法接收一个从0开始的整数参数)的序列(元组、列表、字符串),否则将报错.
3. 当第二个参数sentinel提供时,第一个参数必须是一个可被调用对象.创建的迭代对象,在调用__next__方法的时候会调用这个可被调用对象, 当返回值和sentinel值相等时Sie können StopIteration verwenden, um die Funktion zu verwenden.>>> 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
# 定义类 >>> 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