2010-05-31 20 views
11

Vì vậy, trong Python (mặc dù tôi nghĩ rằng nó có thể được áp dụng cho nhiều ngôn ngữ), tôi thấy mình với một cái gì đó như thế này khá thường xuyên:dư thừa nhỏ mã trong khi-vòng (không cảm thấy sạch)

the_input = raw_input("what to print?\n") 
while the_input != "quit": 
    print the_input 
    the_input = raw_input("what to print?\n") 

Có lẽ tôi quá cầu kỳ, nhưng tôi không thích cách đường dây the_input = raw_input("what to print?\n") phải lặp lại. Nó làm giảm khả năng bảo trì và tổ chức. Nhưng tôi không thấy bất kỳ giải pháp nào để tránh mã trùng lặp mà không làm xấu đi vấn đề. Trong một số ngôn ngữ, tôi có thể viết một cái gì đó như thế này:

while ((the_input=raw_input("what to print?\n")) != "quit") { 
    print the_input 
} 

này chắc chắn là không Pythonic, và Python thậm chí không cho phép chuyển nhượng trong điều kiện vòng lặp AFAIK.

mã hợp lệ này sửa chữa các dư thừa,

while 1: 
    the_input = raw_input("what to print?\n") 
    if the_input == "quit": 
     break 
    print the_input 

Nhưng không cảm thấy hoàn toàn đúng một trong hai. while 1 ngụ ý rằng vòng lặp này sẽ chạy mãi mãi; Tôi đang sử dụng một vòng lặp, nhưng cho nó một điều kiện giả mạo và đặt một thực tế bên trong nó.

Tôi có quá cầu kỳ không? Có cách nào tốt hơn để làm điều này? Có lẽ có một số ngôn ngữ xây dựng được thiết kế cho điều này mà tôi không biết?

+1

Tôi nghĩ rằng biểu mẫu đầu tiên hoàn toàn có thể chấp nhận được. –

+5

Đây là một mẫu phổ biến được gọi là [vòng lặp và một nửa] (http://www.cs.duke.edu/~ola/patterns/plopd/loops.html#loop-and-a-half). –

Trả lời

30

Nghĩ lặp - ví dụ, trong trường hợp cụ thể này:

for the_input in iter(lambda: raw_input('what to print?\n'), 'quit'): 
    print the_input 

Hầu hết các vòng trong Python, ngoại trừ theo mức rất thấp nhất của trừu tượng, được thực hiện tốt nhất như for vòng với sự giúp đỡ của một số thuộc hạ iterator mà nắm bắt "looping logic" - các iter được xây dựng trong có thể giúp (như ở đây), đôi khi genexps (biểu thức máy phát điện) có thể, đôi khi các mô-đun thư viện tiêu chuẩn itertools đến để giải cứu.

Thông thường bạn sẽ chọn để mã hóa các chức năng tùy chỉnh phát (những người sử dụng yield), hoặc thỉnh thoảng hơn (khi bạn cần quản lý nhà nước thực sự tinh vi) một tùy chỉnh iterator lớp (một định phương pháp __iter__ đặc biệt như return self, và next [[hoặc __next__ trong các phiên bản mới nhất của Python]] để trở về "giá trị kế tiếp từ lặp đi lặp lại).

Chụp logic lặp ngoài bất cứ điều gì nó là bạn làm vào các mục khác nhau liên tục được tạo ra bởi vòng lặp itse lf là trợ giúp trừu tượng chính ở đây!

+4

Điều đó cảm thấy hơi thông minh một chút ... –

+0

+1: Ưu tiên 'vòng lặp for' cho lặp lại. Trong bất kỳ ngôn ngữ nào cung cấp cho họ. – Johnsyweb

+0

Đây là một giải pháp tuyệt vời. SO sẽ không cho phép tôi chấp nhận câu trả lời trong 4 phút nữa ;-) – Ponkadoodle

Các vấn đề liên quan