Réponses:
Comme l'a souligné Johannes,
for c in "string":
#do something with c
Vous pouvez parcourir à peu près n'importe quoi en python en utilisant la for loop
construction,
par exemple, open("file.txt")
retourne un objet fichier (et ouvre le fichier), en itérant dessus itère sur les lignes de ce fichier
with open(filename) as f:
for line in f:
# do something with line
Si cela semble magique, eh bien c'est un peu, mais l'idée derrière c'est vraiment simple.
Il existe un protocole d'itérateur simple qui peut être appliqué à n'importe quel type d'objet pour faire fonctionner la for
boucle.
Implémentez simplement un itérateur qui définit une next()
méthode et implémentez une __iter__
méthode sur une classe pour la rendre itérable. (le __iter__
bien sûr, devrait retourner un objet itérateur, c'est-à-dire un objet qui définit next()
)
Si vous avez besoin d'accéder à l'index pendant que vous parcourez la chaîne, utilisez 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
utilisez le paramètre « start »:for i, c in enumerate('test', start=1)
Encore plus simple:
for c in "test":
print c
for c in "test": print (c)
pourquoi?
Juste pour faire une réponse plus complète, la manière C d'itérer sur une chaîne peut s'appliquer en Python, si vous voulez vraiment forcer une cheville carrée dans un trou rond.
i = 0
while i < len(str):
print str[i]
i += 1
Mais là encore, pourquoi faire cela quand les chaînes sont intrinsèquement itérables?
for i in str:
print i
for i in range(len(...))
est mauvais. En python 2.x, range()
crée une liste, donc pour une très longue durée, vous pouvez finir par allouer un très grand bloc de mémoire. À tout le moins utiliser xrange()
dans ces cas. En outre, l'indexation répétée de la même chaîne est beaucoup plus lente que l'itération directement sur la chaîne. Si vous avez besoin de l'index, utilisez enumerate()
.
Vous pouvez aussi faire quelque chose d'intéressant comme ça et faire votre travail en utilisant 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 réponse est
Monsieur . S uryaa
Cependant, puisque range () crée une liste des valeurs qui est une séquence, vous pouvez donc utiliser directement le nom
for e in name:
print(e)
Cela produit également le même résultat et a également une meilleure apparence et fonctionne avec n'importe quelle séquence comme la liste, le tuple et le dictionnaire.
Nous avons utilisé les fonctions intégrées de remorquage (BIF dans la communauté Python)
1) range () - range () BIF est utilisé pour créer des index Exemple
for i in range ( 5 ) :
can produce 0 , 1 , 2 , 3 , 4
2) len () - len () BIF est utilisé pour trouver la longueur d'une chaîne donnée
Si vous souhaitez utiliser une approche plus fonctionnelle pour itérer sur une chaîne (peut-être pour la transformer d'une manière ou d'une autre), vous pouvez diviser la chaîne en caractères, appliquer une fonction à chacun, puis rejoindre la liste résultante de caractères en une chaîne.
Une chaîne est intrinsèquement une liste de caractères, donc 'map' itérera sur la chaîne - comme deuxième argument - en appliquant la fonction - le premier argument - à chacun.
Par exemple, ici j'utilise une approche lambda simple car tout ce que je veux faire est une modification triviale du caractère: ici, pour incrémenter chaque valeur de caractère:
>>> ''.join(map(lambda x: chr(ord(x)+1), "HAL"))
'IBM'
ou plus généralement:
>>> ''.join(map(my_function, my_string))
où ma_fonction prend une valeur char et renvoie une valeur char.
Plusieurs réponses sont utilisées ici range
. xrange
est généralement meilleur car il renvoie un générateur, plutôt qu'une liste entièrement instanciée. Là où la mémoire et / ou les itérables de longueurs très variables peuvent être un problème, xrange
est supérieur.
Si vous courez dans une situation où vous en avez besoin get the next char of the word using __next__()
, n'oubliez pas de créer un string_iterator
et itérer dessus et nonoriginal string (it does not have the __next__() method)
Dans cet exemple, lorsque je trouve un char = [
je continue de chercher le mot suivant pendant que je ne le trouve pas ]
, donc je dois utiliser __next__
ici une boucle for sur la chaîne ne serait pas utile
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