2013-07-30 14 views
15

mogę zrobić prosty dla pętli w python jak:Dla pętli z niestandardowych kroków w python

for i in range(10): 

Jednak nie mógł dowiedzieć się, jak uczynić bardziej skomplikowanych, które są bardzo proste w C++.

Jak wdrożyć pętli for jak to w Pythonie:

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

Najbliższy zrobiłem do tej pory:

for w in reversed(range(len(list))) 
+0

odwrócony (zakres (len (LIST)) nie zmniejszy o połowę wartości w. Możesz użyć rozumienia listy zamiast zakresu (10).Albo użyj pętli while! –

Odpowiedz

9

Przede wszystkim: Python for pętle nie są naprawdę to samo co pętla C for. Zamiast tego są For Each loops. Powtarzasz elementy iteracji. range() generuje powtarzalną sekwencję liczb całkowitych, umożliwiając emulację najbardziej typowego przypadku użycia pętli C for.

Jednak przez większość czasuchcesz używać chcesz użyć range(). Byś pętli nad listą samego:

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

Jeśli trzeba mieć indeks, którego zwykle używasz enumerate(), aby dodać go do pętli:

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

Dla naprawdę „ostry” pętle, użyj while lub stworzyć własną funkcję generatora:

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

for i in halved_loop(10): 
    print i 

wydrukować 10, 5, 2. Można rozszerzyć że do sekwencji też:

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 

która drukuje:

python 
monty 
spam 
foo 
+0

nie jest możliwe w linii? – gen

+0

@gen: jest, z pętlą 'while'. Pokazuję, w jaki sposób można zmusić to do pętli 'for' i tak, budując generator. –

+0

@gen: Dlaczego fascynacja pętlami 'for'? Python 'for' pętle są naprawdę [" dla każdego "pętle] (http://en.wikipedia.org/wiki/Foreach_loop); są * nie * to samo co pętla C 'for'. –

22
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] 
+0

to nie jest dokładnie to, czego szukam – gen

+0

tak, to coś o tym, jak używać 'zasięgu'. – the5fire

+0

Ponadto, myślę, że potrzebujemy używać pythona w sposób Pythona, a nie dostosowywać się do sposobu C. ^.^ – the5fire

1

Coś for i in [n/(2**j) for j in range(int(math.log(n))+1)]

2

Dla dokładnej przykład prawdopodobnie nie używałbyś pętli for, ale pętla:

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

Musisz użyć generatora. Można to wdrożyć w następujący sposób:

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

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

Należy zauważyć, że łatwo to uogólnić na inne skomplikowane wzorce, które możesz mieć na myśli.

0

Dla bardziej ogólnym przypadku można utworzyć niestandardową funkcję generatora, który zajmuje start, stop oraz funkcję generowania następny krok od ostatniego:

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] 
Powiązane problemy