2009-11-02 14 views
95

thể trùng lặp:
Emulate a do-while loop in Python?Có một "do ... cho đến" trong Python không?

do until x: 
    ... 

bằng Python, hoặc một cách tốt đẹp để thực hiện một vòng lặp như xây dựng?

+8

Khi bạn nhìn vào sách hướng dẫn tham khảo ngôn ngữ, bạn thấy gì? http://docs.python.org/reference/compound_stmts.html –

+0

Bản sao: http://stackoverflow.com/questions/743164/do-while-loop-in-python – ChristopheD

+3

Thời gian thực hiện (mặc dù nó phải được gọi là 'until') là điều ước lớn nhất của tôi đối với Python. –

Trả lời

181

There is no do-while loop in Python.

Đây là cấu trúc tương tự, được lấy từ liên kết ở trên.

while True: 
    do_something() 
    if condition(): 
     break 
+25

BTW, điều này được gọi là "loop-and-a-half".Python tiếp tục hỗ trợ cấu trúc này vì nó là một trong những mẫu vòng lặp dễ nhất để viết và hiểu chính xác. Xem http://www.cs.duke.edu/~ola/patterns/plopd/loops.html#loop-and-a-half – Brandon

+1

@Brandon Điều này có khác biệt không: 'while! Condition do_something()'? – Bort

+6

@Bort Cấu trúc vòng lặp-và-nửa đảm bảo rằng 'do_something()' sẽ được thực hiện ít nhất một lần, ngay cả khi 'điều kiện()' là đúng ở đầu vòng lặp. Cấu trúc 'while not condition(): do_something()' của bạn sẽ không bao giờ thực thi 'do_something()' nếu 'condition()' đánh giá là true ngay từ đầu. – Brandon

22

không có đóng gói sẵn "do-while", nhưng cách Python chung để thực hiện các cấu trúc vòng lặp đặc biệt là thông qua máy phát điện và lặp khác, ví dụ:

import itertools 

def dowhile(predicate): 
    it = itertools.repeat(None) 
    for _ in it: 
    yield 
    if not predicate(): break 

như vậy, ví dụ:

i=7; j=3 
for _ in dowhile(lambda: i<j): 
    print i, j 
    i+=1; j-=1 

thực thi một chân, như mong muốn, mặc dù vị từ đã sai khi bắt đầu. Nó thường tốt hơn để đóng gói nhiều logic lặp vào máy phát điện của bạn (hoặc bộ lặp khác) - ví dụ, nếu bạn thường có trường hợp một biến tăng lên, một biến giảm và bạn cần vòng lặp do/while so sánh chúng. , bạn có thể mã:

def incandec(i, j, delta=1): 
    while True: 
    yield i, j 
    if j <= i: break 
    i+=delta; j-=delta 

mà bạn có thể sử dụng như:

for i, j in incandec(i=7, j=3): 
    print i, j 

đó là tùy thuộc vào bạn có bao nhiêu vòng lặp liên quan đến logic bạn muốn đặt bên trong máy phát điện của bạn (hoặc iterator khác) và bao nhiêu bạn muốn có bên ngoài nó (giống như đối với bất kỳ người nào khác se của một hàm, lớp hoặc cơ chế khác mà bạn có thể sử dụng để cấu trúc lại mã của luồng thực thi chính), nhưng nói chung, tôi muốn thấy trình tạo được sử dụng trong vòng lặp for có vòng lặp nhỏ (lý tưởng) logic điều khiển "(mã liên quan đến việc cập nhật các biến trạng thái cho vòng lặp tiếp theo và/hoặc kiểm tra xem bạn có nên lặp lại hay không).

+2

Bạn có thể sử dụng [itertools.takewhile] (https://docs.python.org/2/library/itertools.html#itertools.takewhile). –

6

Không có. Thay vì sử dụng một while vòng lặp như:

while 1: 
...statements... 
    if cond: 
    break 
+6

Tại sao 'trong khi 1'? Có gì sai với 'trong khi True'? Tại sao buộc chuyển đổi từ int sang bool? –

+6

@ S.Lott, trên thực tế, trong Python 2.X, True/False không phải là từ khóa, chúng chỉ được xây dựng trong các hằng số toàn cục (có thể gán lại giống như bất kỳ biến nào khác), vì vậy trình thông dịch phải kiểm tra xem chúng trỏ đến cái gì. Xem http://stackoverflow.com/a/3815387/311220 – Acorn

+5

"thông dịch viên phải kiểm tra xem họ nói gì"? Gì? Bạn có tuyên bố đây là một loại tối ưu hóa hữu ích nào đó không? Nếu vậy, bạn có điểm chuẩn 'timeit' để chứng minh yêu cầu đó không? –

17

Tôi thích sử dụng một biến lặp, vì nó có xu hướng đọc một chút đẹp hơn hơn là chỉ "trong khi 1:", và không có xấu xí trông break tuyên bố:

finished = False 
while not finished: 
    ... do something... 
    finished = evaluate_end_condition() 
Các vấn đề liên quan