É impossível diminuir os loops em Python?


93

Posso estar errado (avise-me e excluirei a pergunta), mas parece que o python não responde a

for n in range(6,0):
    print n

Tentei usar o xrange e também não funcionou. Como posso implementar isso?


Por curiosidade, você está usando isso para alguma coisa? É bastante incomum precisar dessa funcionalidade!
Katriel

@katrielalex Eu o uso para iterar sobre uma matriz da direita para a esquerda. Existe uma maneira diferente que você sugere que eu deveria fazer?
Gal

você pode tentar, for i in reversed(mat):embora possa ser mais lento
Katriel

Por favor, dê uma olhada em Imprimir uma lista em ordem reversa com intervalo , ela oferece algumas outras informações úteis.
RF

1
Por favor, dê uma olhada Imprima uma lista em ordem reversa com intervalo , a resposta aceita explica isso muito claramente.
RF

Respostas:


214
for n in range(6,0,-1):
    print n
# prints [6, 5, 4, 3, 2, 1]

20
Aposto que OP realmente queria range(5,-1,-1). Embora ele provavelmente pudesse descobrir isso por tentativa e erro.
kojiro

42

Já é muito tarde, mas eu só queria acrescentar que há uma maneira mais elegante: usando reversed

for i in reversed(range(10)):
    print i

dá:

4
3
2
1
0

1
O que há de elegante nisso? Você gasta tempo revertendo uma lista em vez de gerá-la da maneira que deseja.
alexis

5
@alexis não custa nada. Você obtém reversed(range)de graça por causa da ótima range_reverseotimização integrada ao CPython. Fiz alguns benchmarks rápidos e não consegui encontrar uma diferença significativa de custo entre step=-1e reversed()no Python 2.7 e 3.3. Observe também que este idioma é usado em heapq .
kojiro

Obrigado, @kojiro, isso é interessante. Mas, a menos que você o tenha usado xrangeem seus testes do Python 2.7, reverseestará operando em uma lista comum já gerada, não em um objeto de intervalo; então você está dizendo que qualquer lista pode ser revertida com eficiência, ou apenas range/xrangeobjetos? (o código heapq ao qual você vincula envolve um objeto de intervalo do Python 3).
alexis

@alexis Eu não teria a ousadia de sugerir que qualquer lista pode ser revertida com eficiência - essa é uma afirmação muito desqualificada para eu responder de qualquer maneira. É revelador, porém, que o código heapify mudou de step=-1para reversed()entre Python 2.3 e 2.4
kojiro

1
reversed(range(10))não pode, possivelmente, saída 4através 0. Talvez você quis dizer range(5)?
Abhijit Sarkar

12
for n in range(6,0,-1)

Isso daria a você 6,5,4,3,2,1

Quanto a

for n in reversed(range(0,6))

daria a você 5,4,3,2,1,0




2

0 é o valor condicional quando esta condição é verdadeira, o loop continuará em execução. 10 é o valor inicial. 1 é o modificador onde pode ser um decremento simples.

for number in reversed(range(0,10,1)):
print number;

1

Atrasado para a festa, mas para qualquer pessoa encarregada de criar seus próprios ou quiser ver como isso funcionaria, aqui está a função com um bônus adicional de reorganizar os valores start-stop com base no incremento desejado:

def RANGE(start, stop=None, increment=1):
    if stop is None:
        stop = start
        start = 1

    value_list = sorted([start, stop])

    if increment == 0:
        print('Error! Please enter nonzero increment value!')
    else:
        value_list = sorted([start, stop])
        if increment < 0:
            start = value_list[1]
            stop = value_list[0]
            while start >= stop:
                worker = start
                start += increment
                yield worker
        else:
            start = value_list[0]
            stop = value_list[1]
            while start < stop:
                worker = start
                start += increment
                yield worker

Incremento negativo:

for i in RANGE(1, 10, -1):
    print(i)

Ou, com start-stop invertido:

for i in RANGE(10, 1, -1):
    print(i)

Resultado:

10
9
8
7
6
5
4
3
2
1

Incremento regular:

for i in RANGE(1, 10):
    print(i)

Resultado:

1
2
3
4
5
6
7
8
9

Incremento zero:

for i in RANGE(1, 10, 0):
    print(i)

Resultado:

'Error! Please enter nonzero increment value!'

0

Para python3 onde -1indica o valor que deve ser decrementado em cada etapa for n in range(6,0,-1): print(n)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.