Neste post vou falar um pouco sobre os mecanismos de baixo nível presentes na iteração da linguagem de programação Python.

Existem dois tipos de objectos envolvidos na iteração. Até agora tenho falado nos iteráveis que são objectos que contêm um conjunto de valores. Os iteráveis não podem contudo ser percorridos directamente, para fazer isso é necessário solicitar ao iterável o iterador.

iterador = iter(iteravel)    #iteravel.__iter__()
value = next(iterador)       #iterador.next() ou iterador.__next__()
value = next(iterador)
...


- Os iteráveis produzem um iterador.
- Os iteradores produzem um stream de valores.


A operação mais importante num iterável é o iter() que devolve um iterador. E a única operação disponível num iterador é next(), que devolve o próximo valor ou entra na excepção StopIteration, que significa que a iteração terminou.

Tudo o que é possível fazer é solicitar o próximo valor, e obtemos um valor ou a excepção StopIteration. Alguns iteradores têm mais operações, mas a única que é garantida é o next().

with open("ficheiro.txt") as f:
    #lê a primeira linha
    primeira_linha = next(f)

    #lê o resto do ficheiro
    for linha in f:
        #...


Com a operação de baixo nível next() podemos usar os iteráveis de outras formas além de os percorrer em ciclos. Por exemplo num ficheiro podemos ler a primeira linha com next() e depois usar um ciclo for para ler o resto do ficheiro.

De reparar que o ciclo for não volta a ler a primeira linha do ficheiro. Um ficheiro aberto é um iterador e ele sabe qual é a sua posição actual no ficheiro e ao pedir-lhe novos valores ele devolve o próximo valor (linha do ficheiro) a partir da posição actual.



Os posts sobre ciclos em Python está mesmo mesmo perto do fim. Só mais um pouco de paciência :)


Este post faz parte da série de posts sobre Ciclos e Interáveis em Python:
  1. Ciclos em Python, o básico
  2. Ciclos em Python e os Iteráveis
  3. Ciclos em Python, mais exemplos de Iteráveis
  4. Ciclos em Python, uso de Iteráveis fora dos ciclos
  5. Ciclos em Python, problemas comuns e os índices
  6. Ciclos em Python, iterar sobre duas listas
  7. Ciclos em Python, iteração personalizada
  8. Ciclos em Python, Generators - parte 1
  9. Ciclos em Python, Generators - parte 2
  10. Ciclos em Python, Generators - parte 3
  11. Ciclos em Python, operações de baixo nível (post actual)
  12. Ciclos em Python, como tornar os nossos objectos em Iteráveis
  13. Ciclos em Python, conclusão


A inspiração para este post veio daqui.