Was sind die Verwendungszwecke von iter (aufrufbar, Sentinel)?

So, ich habe Raymond Hettingers Vortrag beobachtetTransforming Code in schöne, idiomatische Python und er bringt diese Form voniter was mir nie bewusst war. Sein Beispiel ist das folgende:

Anstatt von

blocks = []
while True:
    block = f.read(32)
    if block == '':
        break
    blocks.append(block)

Verwenden

blocks = []
read_block = partial(f.read, 32)
for block in iter(read_block, ''):
    blocks.append(block)

Nachdem Sie das @ überprüft habDokumentatio voniter, Ich habe ein ähnliches Beispiel gefunden:

with open('mydata.txt') as fp:
    for line in iter(fp.readline, ''):
        process_line(line)

Das sieht für mich ziemlich nützlich aus, aber ich habe mich gefragt, ob Pythonisten Beispiele für dieses Konstrukt kennen, die keine I / O-Leseschleifen beinhalten. Vielleicht in der Standardbibliothek?

Ich kann mir sehr ausgefallene Beispiele vorstellen, wie die folgenden:

>>> def f():
...     f.count += 1
...     return f.count
... 
>>> f.count = 0
>>> list(iter(f,20))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> 

Aber das ist natürlich nicht nützlicher als die eingebauten iterables. Außerdem scheint es mir, als würde es nach Code riechen, wenn Sie einer Funktion einen Status zuweisen. Zu diesem Zeitpunkt sollte ich wahrscheinlich mit einer Klasse arbeiten, aber wenn ich eine Klasse schreiben möchte, könnte ich das Iterator-Protokoll genauso gut für alles implementieren, was ich erreichen möchte.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage