¿Cuál es el segundo argumento para la función iter en Python?

Consideremos un archivo:

$ echo -e """This is a foo bar sentence .\nAnd this is the first txtfile in the corpus .""" > test.txt
$ cat test.txt 
This is a foo bar sentence .
And this is the first txtfile in the corpus .

Y cuando quiero leer el archivo por carácter, puedo hacerhttps://stackoverflow.com/a/25071590/610569:

>>> fin = open('test.txt')
>>> while fin.read(1):
...     fin.seek(-1,1)
...     print fin.read(1),
... 
T h i s   i s   a   f o o   b a r   s e n t e n c e   . 
A n d   t h i s   i s   t h e   f i r s t   t x t f i l e   i n   t h e   c o r p u s   .

Pero usar el bucle while puede parecer un poco esp poco espónico. cuando usofin.read(1) para verificar si hay EOF y luego retroceder para leer el byte actual. Y así puedo hacer algo como esto¿Cómo leer un solo carácter a la vez desde un archivo en Python?:

>>> import functools
>>> fin = open('test.txt')
>>> fin_1byte = iter(functools.partial(fin.read, 1), '')
>>> for c in fin_1byte:
...     print c,
... 
T h i s   i s   a   f o o   b a r   s e n t e n c e   . 
A n d   t h i s   i s   t h e   f i r s t   t x t f i l e   i n   t h e   c o r p u s   .

Pero cuando lo intenté sin el segundo argumento, arroja unTypeError:

>>> fin = open('test.txt')
>>> fin_1byte = functools.partial(fin.read, 1)
>>> for c in iter(fin_1byte):
...     print c,
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'functools.partial' object is not iterable

¿Cuál es el segundo argumento eniter? Los documentos tampoco dicen mucho:https://docs.python.org/2/library/functions.html#iter yhttps://docs.python.org/3.6/library/functions.html#iter

Según el documento:

Devuelve un objeto iterador. El primer argumento se interpreta de manera muy diferente dependiendo de la presencia del segundo argumento. Sin un segundo argumento, el objeto debe ser un objeto de colección que admita el protocolo de iteración (eliter() método), o debe admitir el protocolo de secuencia (elobtiene el objeto() método con argumentos enteros que comienzan en 0). Si no admite ninguno de esos protocolos, se genera TypeError. Si se da el segundo argumento, centinela, el objeto debe ser un objeto invocable. El iterador creado en este caso llamará al objeto sin argumentos para cada llamada a supróximo() método; si el valor devuelto es igual a centinela, se elevará StopIteration; de lo contrario, se devolverá el valor.

Supongo que los documentos requieren algo de "descifrado":

Sin un segundo argumento, el objeto debe ser un objeto de colección que admita el protocolo de iteración (eliter() método)

¿Eso significa que tiene que venir decollections? ¿O es que mientras el objeto tenga un__iter__(), ¿esta bien?

, o debe admitir el protocolo de secuencia (elobtiene el objeto() método con argumentos enteros que comienzan en 0)

Eso es bastante críptico. Entonces, ¿eso significa que intenta ver si la secuencia está indexada y, por lo tanto, puede consultarse y que el índice debe comenzar desde 0? ¿Significa también que los índices deben ser secuenciales, es decir, 0, 1, 2, 3, ... y no algo como 0, 2, 8, 13, ...?

Si no admite ninguno de esos protocolos, se genera TypeError.

Sí, esta parte, entiendo =)

Si se da el segundo argumento, centinela, el objeto debe ser un objeto invocable.

Bien, ahora esto se pone un poco de ciencia ficción. ¿Es solo una terminología en Python para llamar a algo unsentinel? Que hacesentinel significa pitón? ¿Y "objeto invocable" como si fuera una función y no un objeto de tipo?

El iterador creado en este caso llamará a un objeto sin argumentos para cada llamada a su método next ();

Esta parte realmente no la entiendo, tal vez un ejemplo ayudaría.

si el valor devuelto es igual a centinela, se elevará StopIteration; de lo contrario, se devolverá el valor.

Bueno entoncessentinel aquí se refiere a algunos criterios de ruptura?

¿Alguien puede ayudar a descifrar / aclarar el significado de los puntos anteriores sobreiter?

Respuestas a la pregunta(1)

Su respuesta a la pregunta