Risposte:
Come ha sottolineato Johannes,
for c in "string":
#do something with c
Puoi iterare praticamente qualsiasi cosa in Python usando il for loop
costrutto,
ad esempio, open("file.txt")
restituisce un oggetto file (e apre il file), iterando su di esso scorre su righe in quel file
with open(filename) as f:
for line in f:
# do something with line
Se sembra magia, beh lo è, ma l'idea alla base è davvero semplice.
Esiste un semplice protocollo iteratore che può essere applicato a qualsiasi tipo di oggetto per far funzionare il for
loop su di esso.
È sufficiente implementare un iteratore che definisce un next()
metodo e implementare un __iter__
metodo su una classe per renderlo iterabile. ( __iter__
ovviamente, dovrebbe restituire un oggetto iteratore, ovvero un oggetto che definisce next()
)
Se è necessario accedere all'indice mentre si scorre la stringa, utilizzare 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
utilizzare il parametro "start":for i, c in enumerate('test', start=1)
Ancora più semplice:
for c in "test":
print c
for c in "test": print (c)
Perché?
Solo per dare una risposta più completa, il modo C di iterare su una stringa può essere applicato in Python, se vuoi davvero forzare un piolo quadrato in un foro rotondo.
i = 0
while i < len(str):
print str[i]
i += 1
Ma ancora una volta, perché farlo quando le stringhe sono intrinsecamente ripetibili?
for i in str:
print i
for i in range(len(...))
è malvagio. In python 2.x, range()
crea un elenco, quindi per un periodo molto lungo potresti finire con l'allocare un blocco di memoria molto grande. Almeno usare xrange()
in quei casi. Inoltre, l'indicizzazione ripetuta della stessa stringa è molto più lenta rispetto all'iterazione diretta sulla stringa. Se è necessario l'indice, utilizzare enumerate()
.
Bene, puoi anche fare qualcosa di interessante come questo e fare il tuo lavoro usando for loop
#suppose you have variable name
name = "Mr.Suryaa"
for index in range ( len ( name ) ):
print ( name[index] ) #just like c and c++
La risposta è
Sig . Suryaa
Tuttavia poiché range () crea un elenco di valori che è sequenza, quindi è possibile utilizzare direttamente il nome
for e in name:
print(e)
Questo produce anche lo stesso risultato e anche un aspetto migliore e funziona con qualsiasi sequenza come elenco, tupla e dizionario.
Abbiamo usato le funzioni integrate di rimorchio (BIF nella comunità Python)
1) range () - range () BIF è usato per creare indici Esempio
for i in range ( 5 ) :
can produce 0 , 1 , 2 , 3 , 4
2) len () - len () BIF viene utilizzato per scoprire la lunghezza di una determinata stringa
Se desideri utilizzare un approccio più funzionale all'iterazione su una stringa (forse per trasformarla in qualche modo), puoi dividere la stringa in caratteri, applicare una funzione a ciascuna, quindi unire nuovamente l'elenco di caratteri risultante in una stringa.
Una stringa è intrinsecamente un elenco di caratteri, quindi 'map' ripeterà la stringa - come secondo argomento - applicando la funzione - il primo argomento - a ciascuno.
Ad esempio, qui uso un semplice approccio lambda poiché tutto ciò che voglio fare è una banale modifica al personaggio: qui, per aumentare il valore di ogni carattere:
>>> ''.join(map(lambda x: chr(ord(x)+1), "HAL"))
'IBM'
o più in generale:
>>> ''.join(map(my_function, my_string))
dove my_function accetta un valore char e restituisce un valore char.
Diverse risposte qui usano range
. xrange
è generalmente migliore in quanto restituisce un generatore, piuttosto che un elenco completamente istanziato. Laddove la memoria e / o iterabili di lunghezze variabili possono essere un problema, xrange
è superiore.
Se ti capita di correre in una situazione in cui è necessario get the next char of the word using __next__()
, ricordati di creare un string_iterator
e iterare su di esso e non suoriginal string (it does not have the __next__() method)
In questo esempio, quando trovo un carattere = [
continuo a cercare la parola successiva mentre non trovo ]
, quindi devo usare __next__
qui un ciclo for sulla stringa non sarebbe d'aiuto
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