2010-05-27 37 views
11

Câu lệnh vòng lặp Python có thể có mệnh đề else được thực hiện nếu và chỉ khi vòng lặp là không phải bị chấm dứt bởi break. Nói cách khác, khi điều kiện trở thành False (với while) hoặc khi trình vòng lặp bị cạn (với for).Cảm hứng và ảnh hưởng của mệnh đề khác của câu lệnh vòng lặp?

Vòng lặp này có khác bắt nguồn từ ngôn ngữ khác (lý thuyết hoặc thực sự được triển khai) không? Nó có được đưa lên bằng bất kỳ ngôn ngữ mới nào không?

Có lẽ tôi nên hỏi cựu Guido, nhưng chắc chắn anh ấy quá bận rộn cho một cuộc điều tra vô ích như vậy. ;-)

ví dụ

thảo luận liên quan và: Pythonic ways to use ‘else’ in a for loop

+1

Vòng lặp - cấu trúc khác đã có từ ít nhất python 0.9.1 (nó có trong tệp ngữ pháp). – Seth

+0

Cảm ơn rất nhiều. Chỉ cần kiểm tra nó được đề cập trong hướng dẫn quá. Python 0.9.0 là bản phát hành đầu tiên (tháng 2 năm 1991) và Python 0.9.1 (tháng 2 năm 1991) theo sát với "những thay đổi nhỏ chỉ" (xem http://svn.python.org/view/*checkout*/python/trunk/Misc/HISTORY). – Aristide

+0

Sử dụng * else * sau * try * có liên quan và hữu ích tương tự. (Xem [ví dụ đơn giản] này (http://stackoverflow.com/questions/1744070/why-should-exceptions-be-used-conservatively/1744176#1744176).) –

Trả lời

4

Tính năng tương tự được tìm thấy trong vĩ mô LOOP Common Lisp của, described here by Peter Seibel:

... LOOP cung cấp hai từ khóa, ban đầu và cuối cùng , giới thiệu mã được chạy bên ngoài cơ thể chính của vòng lặp.

Sau khi ban đầu hoặc cuối cùng, các mệnh đề này bao gồm tất cả các biểu mẫu Lisp cho đến khi bắt đầu điều khoản vòng lặp tiếp theo hoặc kết thúc vòng lặp. Tất cả các hình thức ban đầu được kết hợp thành một phần mở đầu duy nhất, chạy một lần, ngay lập tức sau khi tất cả các biến vòng lặp cục bộ được khởi tạo và trước phần thân của vòng lặp. Các hình thức cuối cùng được kết hợp tương tự thành một phần kết thúc được chạy sau lần lặp cuối cùng của thân vòng lặp. Cả phần mở đầu và mã kết xuất đều có thể tham chiếu đến các biến vòng lặp cục bộ.

Đoạn mở đầu luôn chạy, ngay cả khi thân vòng lặp lặp lại 0 lần. Vòng lặp có thể trở lại mà không chạy phần kết thúc nếu bất kỳ điều nào sau đây xảy ra:

  • Điều khoản trả lại sẽ thực thi.
  • RETURN, HÃY TRẢ-TỪ, hay cách khác chuyển giao kiểm soát cấu trúc được gọi là từ bên trong một hình thức Lisp trong cơ thể ...

Ví dụ, một phần của một mẫu Python tìm thấy trong các câu hỏi liên quan:

for v in known_variables: 
    if self.bindings[v] is cell: 
     return v 
else: 
    raise CannotSimplify 

có thể trông như thế này:

(loop for v in known-variables 
    when (eq (gethash v (slot-value self bindings)) cell) 
    do (return v) 
    finally (signal cannot-simplify)) 

quan sát khác:

Hệ thống điều kiện chung của Lisp cũng là duy nhất. Ai đó, một lần, hỏi nó đến từ đâu và được chỉ vào Kent Pitman's paper, nơi anh ta nói đã nhận nó từ Maclisp. Tương tự, chức năng FORMAT lạ thường của Lisp dường như đến từ Multics qua Dan Weinreb.

Chủ đề chung là các tính năng ngôn ngữ không có xu hướng theo ngôn ngữ tổ tiên truyền cảm hứng nhất cho ngôn ngữ này, nhưng được thực hiện bởi các cá nhân yêu thích bất kỳ ngôn ngữ mới nào mà họ đang làm. Vì vậy, nếu bạn muốn tìm hiểu nguồn thực tế của Python for - else, tôi sẽ tìm người đã thêm nó và xem ngôn ngữ họ đã làm trước đó.

2

Tôi vừa mới gặp một dẫn khá tốt được chôn trong các ý kiến ​​của this far more general question. Tài ΤΖΩΤΖΙΟΥ đã viết:

Bất cứ ai cũng nhớ CHO var ... TIẾP THEO var ... END CHO var của Sinclair QL của SuperBasic? Mọi thứ giữa NEXT và END FOR sẽ thực hiện ở cuối vòng lặp, trừ khi EXIT FOR là được cấp. Cú pháp đó sạch hơn :)

An OCR rendition of Sinclair QL User Guide xảy ra trôi nổi trên internet. Nó đọc:

Tuyên bố TIẾP THEO có thể được đặt trong một vòng lặp . Điều này gây ra quyền kiểm soát để chuyển đến tuyên bố chỉ sau sau từ khóa mở FOR hoặc REPeat. Nó nên được coi là một loại đối diện với tuyên bố EXIT. Bằng một sự trùng hợp ngẫu nhiên của một số , hai từ TIẾP THEO và EXIT đều chứa EXT. Nghĩ của một phần mở rộng cho các vòng lặp và:

  • N có nghĩa là "Bây giờ bắt đầu lại"
  • tôi có nghĩa là "Nó đã kết thúc"

Một ví dụ thú vị sau:

Cảnh sát trưởng có một khẩu súng được nạp sáu viên đạn và anh ta sẽ bắn vào tên cướp nhưng thêm hai điều kiện nữa y:

  1. Nếu anh ấy chạm vào tên cướp, anh ta dừng lại và quay trở lại Dodge City.

  2. Nếu anh hết đạn trước khi anh chạm tên cướp, ông nói với đối tác của mình để xem tên cướp trong khi ông (cảnh sát) trả để Dodge City.

100 REMark Western FOR with Epilogue 
110 FOR bullets = 1 TO 6 
120 PRINT "Take aim" 
130 PRINT "FIRE A SHOT" 
140 LET hit= RND(0 TO 1) 
150 IF hit = 1 THEN EXIT bullets 
160 NEXT bullets 
170 PRINT "Watch Bandit" 
180 END FOR bullets 
190 PRINT "Return to Dodge City" 

Vì vậy, theo một cú pháp khác nhau (và có lẽ ít đáng lo ngại), đó là chính xác cùng một ngữ nghĩa.

Wikipedia cho chúng ta biết rằng Sinclair QL ra mắt vào tháng 2 năm 1984 là người kế thừa cho Sinclair ZX Spectrum, nhưng không đạt được thành công thương mại.

+0

+1 đá quý của bài đăng –

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