Respostas:
Como Johannes apontou,
for c in "string":
#do something with c
Você pode iterar praticamente qualquer coisa em python usando a for loop
construção,
por exemplo, open("file.txt")
retorna um objeto de arquivo (e abre o arquivo), iterando sobre ele itera sobre linhas nesse arquivo
with open(filename) as f:
for line in f:
# do something with line
Se isso parece mágica, bem, é meio, mas a idéia por trás disso é realmente simples.
Existe um protocolo iterador simples que pode ser aplicado a qualquer tipo de objeto para fazer o for
loop funcionar nele.
Simplesmente implemente um iterador que define um next()
método e implemente um __iter__
método em uma classe para torná-lo iterável. (é __iter__
claro, deve retornar um objeto iterador, ou seja, um objeto que define next()
)
Se você precisar acessar o índice enquanto itera pela string, use 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
use o parâmetro "start":for i, c in enumerate('test', start=1)
Ainda mais fácil:
for c in "test":
print c
for c in "test": print (c)
Por quê?
Apenas para obter uma resposta mais abrangente, a maneira C de iterar sobre uma string pode ser aplicada no Python, se você realmente deseja forçar um pino quadrado em um buraco redondo.
i = 0
while i < len(str):
print str[i]
i += 1
Mas, novamente, por que fazer isso quando as strings são inerentemente iteráveis?
for i in str:
print i
for i in range(len(...))
é mau. No python 2.x, range()
cria uma lista; portanto, por um período muito longo, você pode acabar alocando um bloco muito grande de memória. No mínimo, uso xrange()
nesses casos. Além disso, a indexação repetida da mesma sequência é muito mais lenta que a iteração diretamente sobre a sequência. Se você precisar do índice, use enumerate()
.
Bem, você também pode fazer algo interessante como este e fazer seu trabalho usando o loop for
#suppose you have variable name
name = "Mr.Suryaa"
for index in range ( len ( name ) ):
print ( name[index] ) #just like c and c++
A resposta é
Senhor . S uryaa
No entanto, como range () cria uma lista dos valores que são sequência, portanto, você pode usar diretamente o nome
for e in name:
print(e)
Isso também produz o mesmo resultado e também parece melhor e funciona com qualquer sequência, como lista, tupla e dicionário.
Usamos tow Built in Functions (BIFs na Comunidade Python)
1) range () - range () O BIF é usado para criar índices Exemplo
for i in range ( 5 ) :
can produce 0 , 1 , 2 , 3 , 4
2) len () - len () O BIF é usado para descobrir o comprimento de uma determinada string
Se você quiser usar uma abordagem mais funcional para iterar sobre uma sequência (talvez para transformá-la de alguma forma), poderá dividir a sequência em caracteres, aplicar uma função a cada uma delas e, em seguida, ingressar na lista resultante de caracteres novamente em uma sequência.
Uma string é inerentemente uma lista de caracteres; portanto, 'map' iterará sobre a string - como segundo argumento - aplicando a função - o primeiro argumento - a cada um.
Por exemplo, aqui eu uso uma abordagem lambda simples, pois tudo o que eu quero fazer é uma modificação trivial no caractere: aqui, para incrementar o valor de cada caractere:
>>> ''.join(map(lambda x: chr(ord(x)+1), "HAL"))
'IBM'
ou mais geralmente:
>>> ''.join(map(my_function, my_string))
onde my_function pega um valor de char e retorna um valor de char.
Várias respostas aqui são usadas range
. xrange
geralmente é melhor, pois retorna um gerador, em vez de uma lista totalmente instanciada. Onde a memória e / ou iteráveis de comprimentos muito variados podem ser um problema, xrange
é superior.
Se você já se deparou com uma situação em que precisa get the next char of the word using __next__()
, lembre-se de criar string_iterator
e iterar sobre ela, e não ooriginal string (it does not have the __next__() method)
Neste exemplo, quando encontro um char = [
, continuo pesquisando a próxima palavra enquanto não o encontro ]
, por isso preciso usar __next__
aqui um loop for sobre a corda não ajudaria
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