web-dev-qa-db-fra.com

Boucle For avec des étapes personnalisées en python

Je peux faire des boucles simples pour python comme:

for i in range(10):

Cependant, je ne savais pas comment en faire des plus complexes, ce qui est vraiment facile en c ++.

Comment implémenteriez-vous une boucle for comme celle-ci en python:

for(w = n; w > 1; w = w / 2)

Le plus proche que j'ai fait jusqu'à présent est:

for w in reversed(range(len(list)))
16
gen

D'abord et avant tout: les boucles Python for ne sont pas vraiment la même chose qu'une boucle C for. Ils sont pour chaque boucles à la place. Vous parcourez les éléments d'un itérable. range() génère une séquence itérable de nombres entiers, vous permettant d'émuler le cas d'utilisation le plus courant de la boucle C for.

Cependant, la plupart du temps non veut utiliser range(). Vous feriez une boucle sur la liste elle-même:

for elem in reversed(some_list):
    # elem is a list value

Si vous devez avoir un index, vous utilisez généralement enumerate() pour l'ajouter à la boucle:

for i, elem in reversed(enumerate(some_list)):
    # elem is a list value, i is it's index in the list

Pour des boucles vraiment "funky", utilisez while ou créez votre propre fonction de générateur:

def halved_loop(n):
    while n > 1:
        yield n
        n //= 2

for i in halved_loop(10):
    print i

pour imprimer 10, 5, 2. Vous pouvez également l'étendre aux séquences:

def halved_loop(sequence):
    n = -1
    while True:
        try:
            yield sequence[n]
        except IndexError:
            return
        n *= 2

for elem in halved_loop(['foo', 'bar', 'baz', 'quu', 'spam', 'ham', 'monty', 'python']):
    print elem

qui imprime:

python
monty
spam
foo
10
Martijn Pieters
for i in range(0, 10, 2):
    print(i)

>>> 0
>>> 2
>>> 4
>>> 6
>>> 8

http://docs.python.org/2/library/functions.html

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1, 11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> range(0, 30, 5)
[0, 5, 10, 15, 20, 25]
>>> range(0, 10, 3)
[0, 3, 6, 9]
30
the5fire

Pour votre exemple, vous n’utiliseriez probablement pas de boucle for, mais une boucle while:

w = n
while w > 1:
    do stuff
    w = w / 2
2
Daniel Roseman

Vous devez utiliser un générateur. Vous pouvez implémenter ceci comme suit:

def stepDown(n):
    while n>1:
        yield n
        n = n/2

for i in stepDown(n):
    print i # or do whatever else you wish.

Notez que ceci se généralise facilement à d’autres schémas compliqués que vous pourriez avoir à l’esprit.

2
Shree Kumar

Quelque chose comme for i in [n/(2**j) for j in range(int(math.log(n))+1)]

1
Atmaram Shetye

Pour le cas plus général, vous pouvez créer une fonction génératrice personnalisée, qui prend start, stop et une fonction permettant de générer la prochaine étape à partir de la dernière:

def my_range(start, stop, f):
    x = start
    while x < stop if stop > start else x > stop:
        yield x
        x = f(x)

>>> list(my_range(1, 1024, lambda x: x*2))
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]

>>> list(my_range(1000, 1, lambda x: x/2))
[1000, 500.0, 250.0, 125.0, 62.5, 31.25, 15.625, 7.8125, 3.90625, 1.953125]
0
tobias_k