Considerar:
>>> lst = iter([1,2,3])
>>> next(lst)
1
>>> next(lst)
2
Portanto, o avanço do iterador é, como esperado, tratado pela mutação desse mesmo objeto.
Sendo esse o caso, eu esperaria:
a = iter(list(range(10)))
for i in a:
print(i)
next(a)
para pular cada segundo elemento: a chamada para next
deve avançar o iterador uma vez; a chamada implícita feita pelo loop deve avançar uma segunda vez - e o resultado dessa segunda chamada seria atribuído a i
.
Não faz. O loop imprime todos os itens da lista, sem pular nenhum.
Meu primeiro pensamento foi que isso poderia acontecer porque o loop solicita iter
o que é passado e isso pode fornecer um iterador independente - esse não é o caso, como temos iter(a) is a
.
Então, por que next
não parece avançar o iterador nesse caso?
i
já foi atribuído.next(a)
significa que a próxima iteração2
está atribuídai
e você avançaa
, imprimei
etc.StopIteration
excreçãonext(a)
é aumentada quando é chamada após o esgotamento da lista.O que está acontecendo é que
next(a)
retorna o próximo valor de a, que é impresso no console porque não é afetado.O que você pode fazer é afetar uma variável com este valor:
fonte
I encontrar as respostas existentes um pouco confuso, porque apenas indiretamente indicam a coisa mistificadora essencial no exemplo de código: ambos * o "print i" eo "próximo (a)" estão fazendo com que os seus resultados a ser impresso.
Como eles estão imprimindo elementos alternativos da sequência original e é inesperado que a instrução "next (a)" esteja sendo impressa, parece que a instrução "print i" está imprimindo todos os valores.
Nessa perspectiva, fica mais claro que atribuir o resultado de "next (a)" a uma variável inibe a impressão do resultado ', de modo que apenas os valores alternativos que a variável de loop "i" são impressos. Da mesma forma, fazer a declaração "print" emitir algo mais distinto também a desambigua.
(Uma das respostas existentes refuta as outras porque essa resposta está tendo o código de exemplo avaliado como um bloco, para que o intérprete não esteja relatando os valores intermediários para "next (a)".)
A coisa sedutora em responder perguntas, em geral, está sendo explícita sobre o que é óbvio quando você conhece a resposta. Pode ser ilusório. Da mesma forma, criticar as respostas quando você as entender. É interessante...
fonte
Algo está errado com o seu Python / Computador.
Funciona como esperado.
Testado em Python 2.7 e em Python 3+. Funciona corretamente em ambos
fonte
Para quem ainda não entende.
Como outros já disseram,
next
aumenta o iterador em 1 conforme o esperado. Atribuir seu valor retornado a uma variável não altera magicamente seu comportamento.fonte
Ele se comporta da maneira que você deseja se chamado como uma função:
fonte