Tôi đang học Python, và tôi có một tình huống mà tôi muốn tiêu thụ các mục từ một trình lặp. Phần khó khăn là trong những điều kiện nhất định, tôi muốn "không lặp lại". Tức là, đặt một mục trở lại mặt trước của trình lặp trước khi tôi lặp lại.Pythonic tương đương với unshift hoặc redo?
Ví dụ: giả sử tôi chọn táo từ cây. Giỏ trái cây của tôi chỉ có thể chứa 10kg trước khi nó cần phải được làm trống. Nhưng tôi phải chọn từng quả táo trước khi tôi có thể cân nhắc và xác định xem quả táo này có vượt quá khả năng của giỏ hay không.
Trong một ngôn ngữ như Perl, tôi có thể unshift()
táo trở lại vào cây, và sau đó cho phép sự biểu hiện vòng lặp lại chọn táo:
while ($apple = shift(@tree)) {
$wt = weight($apple);
if ($wt + weight(@basket) > 10) {
send(@basket);
@basket =();
unshift(@tree, $apple);
} else {
push(@basket, $element);
}
}
Hoặc khác tôi cũng có thể sử dụng redo
, mà lại tiếp tục chế biến ở đầu khối, mà không đánh giá biểu thức vòng lặp. Vì vậy, cùng một quả táo có thể được tái chế, sau khi giỏ đã được làm trống.
while ($apple = shift(@tree)) {
$wt = weight($apple);
if ($wt + weight(@basket) > 10) {
send(@basket);
@basket =();
redo;
} else {
push(@basket, $apple);
}
}
Điều gì sẽ là nhất giải pháp pythonic cho loại vấn đề?
nếu $ wt> 10 thì có vòng lặp vô hạn (ví dụ đầu tiên ăn hết bộ nhớ, thẻ thứ hai không bao giờ dừng). – jfs
@ J.F .: Bạn nói đúng, nhưng trong trường hợp này, an toàn để giả sử không có quả táo nào vượt quá 10kg. –