2013-07-30 24 views
15

tôi có thể làm đơn giản cho vòng trong python như:Đối với vòng lặp với các bước tùy chỉnh trong python

for i in range(10): 

Tuy nhiên, tôi không thể tìm ra cách để làm cho những người phức tạp hơn, đó là thực sự dễ dàng trong C++.

Làm thế nào bạn sẽ thực hiện một vòng lặp for như thế này trong python:

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

Gần nhất một tôi đã thực hiện cho đến nay là:

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

đảo ngược (phạm vi (len (danh sách)) sẽ không giảm một nửa giá trị w Bạn có thể sử dụng danh sách hiểu ở vị trí của phạm vi (10).Hoặc người nào khác, sử dụng một vòng lặp while! –

Trả lời

9

Đầu tiên và quan trọng nhất: Python for vòng là không thực sự giống như một vòng lặp C for. Thay vào đó, chúng là For Each loops. Bạn lặp qua các phần tử của một iterable. range() tạo ra một dãy số nguyên có thể lặp lại, cho phép bạn mô phỏng trường hợp sử dụng vòng lặp C for phổ biến nhất.

Tuy nhiên, hầu hết thời gian bạn làm không phải muốn sử dụng range(). Bạn sẽ vòng qua danh sách riêng của mình:

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

Nếu bạn cần phải có một chỉ mục, bạn thường sử dụng enumerate() để thêm nó vào vòng lặp:

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

Đối thực sự 'sôi nổi' vòng, sử dụng while hoặc tạo chức năng máy phát điện riêng bạn:

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

for i in halved_loop(10): 
    print i 

in 10, 5, 2. Bạn có thể mở rộng đến các chuỗi quá:

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 

mà in:

python 
monty 
spam 
foo 
+0

không phải là nó có thể trong nội tuyến? – gen

+0

@gen: với vòng lặp 'while'. Tôi đang minh họa cách bạn có thể ép buộc điều này thành một vòng lặp 'for' bằng cách xây dựng một trình tạo. –

+0

@gen: Tại sao lại có niềm đam mê với vòng lặp 'for'? Các vòng lặp 'for' của Python thực sự là [' cho mỗi vòng lặp]] (http://en.wikipedia.org/wiki/Foreach_loop); chúng là * không * giống như một vòng lặp '' 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

không chính xác những gì tôi đang tìm kiếm – gen

+0

vâng, đó là điều gì đó về Cách sử dụng 'dải ô'. – the5fire

+0

Ngoài ra, tôi nghĩ rằng chúng ta cần sử dụng python theo cách của python, không thích ứng với cách của C. ^.^ – the5fire

1

Something như for i in [n/(2**j) for j in range(int(math.log(n))+1)]

2

Ví dụ chính xác của bạn , bạn có thể sẽ không sử dụng vòng lặp for cả, nhưng vòng lặp while:

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

Bạn cần sử dụng trình tạo. Bạn có thể thực hiện điều này như sau:

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

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

Lưu ý rằng điều này dễ dàng khái quát với các mẫu phức tạp khác mà bạn có thể nghĩ đến.

0

Đối với trường hợp tổng quát hơn, bạn có thể tạo một hàm tạo tùy chỉnh, mà phải mất một start, stop, và một chức năng để tạo ra các bước tiếp theo từ cuối cùng:

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] 
Các vấn đề liên quan