Was ist das 2. Argument für die Iter-Funktion in Python?

Betrachten wir eine Datei:

$ 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 .

Und wenn ich die Datei zeichenweise lesen möchte, kann ichhttps: //stackoverflow.com/a/25071590/61056:

>>> 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   .

Aber mit while-Schleife könnte ein wenig unpythonisch aussehen esp. wenn ich @ benutfin.read(1), um nach EOF zu suchen und dann zurückzuverfolgen, um das aktuelle Byte zu lesen. Und so kann ich so etwas tunWie lese ich ein einzelnes Zeichen aus einer Datei in 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   .

Aber als ich es ohne das zweite Argument versuchte, wirft es einTypeError:

>>> 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

Was ist das 2. Argument initer? Die Dokumentation sagt auch nicht viel:https: //docs.python.org/2/library/functions.html#ite undhttps: //docs.python.org/3.6/library/functions.html#ite

Wie im Dokument angegeben:

Return ein Iterator-Objekt. Das erste Argument wird je nach Vorhandensein des zweiten Arguments sehr unterschiedlich interpretiert. Ohne ein zweites Argument muss object ein Collection-Objekt sein, das das Iterationsprotokoll unterstützt (das iter () -Methode), oder es muss das Sequenzprotokoll unterstützen (das getitem () Methode mit ganzzahligen Argumenten beginnend bei 0). Wenn keines dieser Protokolle unterstützt wird, wird TypeError ausgelöst. Wenn das zweite Argument, Sentinel, angegeben wird, muss object ein aufrufbares Objekt sein. Der in diesem Fall erstellte Iterator ruft das Objekt ohne Argumente für jeden Aufruf seines @ auNächste() Methode; Wenn der zurückgegebene Wert Sentinel entspricht, wird StopIteration ausgelöst, andernfalls wird der Wert zurückgegeben.

Ich denke, die Dokumente erfordern etwas "Entschlüsseln":

Ohne ein zweites Argument muss object ein Collection-Objekt sein, das das Iterationsprotokoll unterstützt (das iter() Methode

Bedeutet das, dass es von @ kommen mucollections? Oder ist das so lange das Objekt ein @ h__iter__(), das ist okay

, oder es muss das Sequenzprotokoll unterstützen (das getitem () Methode mit ganzzahligen Argumenten beginnend bei 0)

Das ist eher kryptisch. Heißt das, es wird versucht zu sehen, ob die Sequenz indiziert und daher abfragbar ist und ob der Index bei 0 beginnen muss? Bedeutet dies auch, dass die Indizes sequentiell sein müssen, d. H. 0, 1, 2, 3, ... und nicht so etwas wie 0, 2, 8, 13, ...?

Wenn keines dieser Protokolle unterstützt wird, wird TypeError ausgelöst.

Ja, diesen Teil verstehe ich =)

Wenn das zweite Argument, Sentinel, angegeben wird, muss object ein aufrufbares Objekt sein.

Okay, das wird jetzt ein bisschen Science-Fiction. Ist es in Python nur eine Terminologie, etwas als @ zu bezeichnesentinel? Was machtsentinel meine Pythonisch? Und "aufrufbares Objekt", als wäre es eine Funktion und nicht Typ Objekt?

Der in diesem Fall erstellte Iterator ruft das Objekt ohne Argumente für jeden Aufruf der next () -Methode auf.

Dieser Teil verstehe ich nicht wirklich, vielleicht würde ein Beispiel helfen.

wenn der zurückgegebene Wert gleich sentinel ist, wird StopIteration ausgelöst, andernfalls wird der Wert zurückgegeben.

Okay, alsosentinel bezieht sich hier auf einige Bruchkriterien?

Kann jemand helfen, die Bedeutung der obigen Punkte über @ zu entziffern / zu kläriter?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage