Neste post falo do if,while e for para controlo de fluxo de execução.
Sintaxe do if:
if : bloco
elif : bloco ( pode ter 0 ou + ocorrências)
else : bloco (opcional)
Exemplos:
if x==y:
print "yes"
else:
print "no"
Sintaxe do while:
while : bloco
else : bloco
O while pode levar um else opcional. O bloco dentro do else é executado apenas quando while termina normalmente, ie, sem break, excepção ou return. Como em C, pode-se usar as keywords continue, e break com o mesmo significado.
Sintaxe do for:
for name in iteravel:
else : bloco
Este for é mais parecido com o foreach do java do que com o for de C. Como o while, ele pode levar um else e a semântica é a mesma. deve ser uma expressão que quando avaliada produz um objecto iterável. Um iterável é algo que pode ser iterado. Regral geral, um iterable é do tipo Iterator. Um iterator i é um objecto com o método next tal que se pode chamar i.next() para obter o próximo valor do iterador, ou a excepção StopIteration quando não existem mais elementos.
Repare-se que a sintaxe para chamar uma função ou método é exactamente a mesma que em C/Java método(argumentos) e que chamar um método sobre uma instância é feito com o "." , i.e. objecto.método(argumentos)
Assim, este for começa por avaliar a expressão que deve produzir um objecto do tipo Iterator. De seguida, para cada objecto retornado pelo método next() do Iterator, ele atribui esse objecto a e executa o bloco de código.
Exemplo:
# Imprimir todos os valores de 0 até 99 inclusivé.
for value in range(100):
print value
range é uma função standard que devolve uma lista cujos elementos base
são os valores entre 0 e o argumento passado. Python chama implícitamente iter() sobre
a lista retornada para obter um Iterator sobre os elementos da lista.
Note-se que "range(100)" só é avaliado uma vez. Alterar os elementos da lista
de base do iterador pode ser feito mas tem uma semântica esquisita.
Quando o iterador é criado inicialmente, ele pede à lista o número de elementos
e de seguida itera vai buscar os valores da lista usando um índice incremental.
Assim, se se retirar o elemento da lista correspondente à posição actual
na lista, o próximo elemento não será considerado pelo iterador (ao eliminar o elemento
da lista, todos os indices dos elementos na lista são decrementados, i.e.
a lista é shiftada para a esquerda a partir daquele ponto mas o iterador
vai continuar a ir buscar o mesmo indice).
Exemplo:
def exemploIter():
y = [2,3,4]
for x in y:
print x
for x in y:
y.remove(x)
print x
print y
Copiando isto para um ficheiro exemplo.py e correndo
python -i exemplo.py
faz com que o ficheiro seja avaliado e de seguida se apresente uma shell
para o interpretador.
Chamando exemploIter, escrevendo exemploIter() obtemos o seguinte:
C:\Users\tiago>python -i py.py
>>> exemploIter()
2
3
4
2
4
[3]
>>>
as primeiros 3 linhas 2,3,4 corresponde ao primeiro for a imprimir os elementos
da lista.
De seguida note-se que apenas 2 e 4 são impressos. Isto ocorre, como expliquei,
porque quando o iterador retorna o primeiro elemento (2), este é associado
a x e depois removido da lista. Assim, o elemento 3 que estava no índice 1
passou a estar no índice 0, mas, o iterador vai de seguida buscar o mesmo
índice (1) que corresponde ao valor 4 e imprime-o e elimina-o da lista.
De facto, o último print imprime a lista y , o que faz com que seja impresso
[3], que é a representação textual de uma lista apenas com o elemento 3.
Blog em português onde relato a minha aprendizagem de Python. Sendo um blog, ele deve ser lido de baixo para cima e é escrito orientado a uma audiência com alguns conhecimentos de programação. Não tentando ser uma fonte exaustiva de conhecimento sobre Python, pode, no entanto, servir como crash course a esta linguagem.