Antworten:
Wie Johannes betonte,
for c in "string":
#do something with c
Mit dem for loop
Konstrukt können Sie so ziemlich alles in Python iterieren.
Gibt beispielsweise open("file.txt")
ein Dateiobjekt zurück (und öffnet die Datei), wobei das Iterieren über die Zeilen in dieser Datei iteriert
with open(filename) as f:
for line in f:
# do something with line
Wenn das wie Magie erscheint, ist es das auch, aber die Idee dahinter ist wirklich einfach.
Es gibt ein einfaches Iteratorprotokoll, das auf jede Art von Objekt angewendet werden kann, um das zu erstellen for
Schleife daran arbeitet.
Implementieren Sie einfach einen Iterator, der eine next()
Methode definiert , und implementieren Sie eine __iter__
Methode für eine Klasse, um sie iterierbar zu machen. (das sollte __iter__
natürlich ein Iteratorobjekt zurückgeben, dh ein Objekt, das definiert next()
)
Wenn Sie beim Durchlaufen der Zeichenfolge Zugriff auf den Index benötigen, verwenden Sie enumerate()
:
>>> for i, c in enumerate('test'):
... print i, c
...
0 t
1 e
2 s
3 t
1 t
, 2 e
, 3 s
, 4 t
verwenden Sie den Parameter „Start“:for i, c in enumerate('test', start=1)
Sogar einfacher:
for c in "test":
print c
for c in "test": print (c)
Warum?
Um eine umfassendere Antwort zu erhalten, kann die C-Methode zum Iterieren über einen String in Python angewendet werden, wenn Sie wirklich einen quadratischen Stift in ein rundes Loch zwingen möchten.
i = 0
while i < len(str):
print str[i]
i += 1
Aber warum tun Sie das, wenn Zeichenfolgen von Natur aus iterierbar sind?
for i in str:
print i
for i in range(len(...))
ist böse Erstellt in Python 2.x range()
eine Liste, sodass Sie für eine sehr lange Länge möglicherweise einen sehr großen Speicherblock zuweisen. Zumindest xrange()
in diesen Fällen verwenden. Außerdem ist die wiederholte Indizierung derselben Zeichenfolge viel langsamer als die direkte Iteration über die Zeichenfolge. Wenn Sie den Index benötigen, verwenden Sie enumerate()
.
Nun, Sie können auch so etwas Interessantes machen und Ihre Arbeit mit der for-Schleife erledigen
#suppose you have variable name
name = "Mr.Suryaa"
for index in range ( len ( name ) ):
print ( name[index] ) #just like c and c++
Antwort ist
Herr . S uryaa
Da range () jedoch eine Liste der Werte erstellt, bei der es sich um eine Sequenz handelt, können Sie den Namen direkt verwenden
for e in name:
print(e)
Dies führt auch zu demselben Ergebnis und sieht auch besser aus und funktioniert mit jeder Sequenz wie Liste, Tupel und Wörterbuch.
Wir haben zwei integrierte Funktionen (BIFs in Python Community) verwendet.
1) range () - range () BIF wird zum Erstellen von Indizes verwendet. Beispiel
for i in range ( 5 ) :
can produce 0 , 1 , 2 , 3 , 4
2) len () - len () BIF wird verwendet, um die Länge einer bestimmten Zeichenfolge zu ermitteln
Wenn Sie einen funktionaleren Ansatz zum Durchlaufen einer Zeichenfolge verwenden möchten (möglicherweise, um sie irgendwie zu transformieren), können Sie die Zeichenfolge in Zeichen aufteilen, eine Funktion auf jede Zeichenfolge anwenden und die resultierende Liste der Zeichen wieder zu einer Zeichenfolge zusammenfügen.
Eine Zeichenfolge ist von Natur aus eine Liste von Zeichen. Daher durchläuft 'map' die Zeichenfolge - als zweites Argument - und wendet die Funktion - das erste Argument - auf jedes einzelne an.
Zum Beispiel verwende ich hier einen einfachen Lambda-Ansatz, da ich nur eine geringfügige Änderung des Zeichens vornehmen möchte: Hier, um jeden Zeichenwert zu erhöhen:
>>> ''.join(map(lambda x: chr(ord(x)+1), "HAL"))
'IBM'
oder allgemeiner:
>>> ''.join(map(my_function, my_string))
Dabei nimmt my_function einen Zeichenwert und gibt einen Zeichenwert zurück.
Hier werden mehrere Antworten verwendet range
. xrange
ist im Allgemeinen besser, da ein Generator zurückgegeben wird, als eine vollständig instanziierte Liste. Wo Speicher und / oder Iterables unterschiedlichster Länge ein Problem sein können, xrange
ist überlegen.
Wenn Sie jemals in einer Situation laufen, in der Sie es brauchen get the next char of the word using __next__()
, denken Sie daran, ein zu erstellen string_iterator
und darüber zu iterieren und nicht dasoriginal string (it does not have the __next__() method)
Wenn ich in diesem Beispiel ein Zeichen [
finde ]
, schaue ich weiter nach dem nächsten Wort, während ich es nicht finde. Daher muss ich __next__ verwenden
Hier würde eine for-Schleife über den String nicht helfen
myString = "'string' 4 '['RP0', 'LC0']' '[3, 4]' '[3, '4']'"
processedInput = ""
word_iterator = myString.__iter__()
for idx, char in enumerate(word_iterator):
if char == "'":
continue
processedInput+=char
if char == '[':
next_char=word_iterator.__next__()
while(next_char != "]"):
processedInput+=next_char
next_char=word_iterator.__next__()
else:
processedInput+=next_char