Là đại tràng trong khối trăn kỹ thuật thận?


19

Đây thực sự chỉ là một câu hỏi lý thuyết của một người mới chơi python muốn hiểu thêm.

Tôi tiếp tục quên dấu hai chấm sau khối lệnh ban đầu trong python. Đó là những gì tôi muốn nói:

  • for <variable> in <sequence>:
  • if <blah blah>:

Suy nghĩ của tôi là một lý do khiến tôi tiếp tục quên là, chúng là ẩn ý thực tế: dấu hai chấm hay không, câu lệnh kết thúc bằng dòng đó.

Câu hỏi của tôi - mà tôi hỏi để tìm hiểu cách hoạt động của cú pháp python - là, liệu dấu hai chấm có thực sự cần thiết không? Tôi đã thay đổi cú pháp python để dấu hai chấm không còn cần thiết nữa, liệu có gì phá vỡ không? Điều đó sẽ làm cho một số tuyên bố mơ hồ hoặc không thể?


4
Tôi nghĩ rằng bạn không hiểu câu hỏi, đó là liệu dấu hai chấm có cần thiết cho cú pháp hoạt động không. Ngoài ra, bất kể câu trả lời của bạn là gì, nó cũng nên có một lời giải thích.
Tomáš Zato - Phục hồi Monica

Có lẽ, bạn có thể viết lại các phần của câu hỏi, để tôi có thể hưởng lợi từ cái nhìn sâu sắc của bạn về vấn đề này, có thể là một ví dụ? Bạn sẽ là thẩm phán tốt nhất, tôi nghĩ tôi không biết gì về ý định hỏi của bạn. Bạn có nghĩa là nó ở cấp trình phân tích cú pháp trình biên dịch / trình biên dịch? Cảm ơn nhiều.
bhan sur

Tôi không biết làm thế nào để diễn đạt nó tốt hơn. Câu hỏi của tôi về cơ bản là, nếu bạn có thể thay đổi tất cả cú pháp python để nó không còn cần thư đại tràng sau if, else, whilevà vân vân. Nếu bạn đã làm điều đó, liệu python vẫn là ngôn ngữ có thể được sử dụng mà không mơ hồ?
Tomáš Zato - Phục hồi Monica

Hiểu rồi! Đó là một câu hỏi xung quanh các quyết định thiết kế cú pháp của python . Xin lỗi, hiểu lầm rồi. Cảm ơn bạn đã giải thích.
bhan sur

Đầu cơ. Như thể các ngắt dòng khó phát hiện hơn bởi các thông dịch viên / trình phân tích cú pháp trong thực tế hoặc có sẵn để đọc. Trong LUA bạn có thể viết if .. then .. endtrong một dòng duy nhất. Vì vậy, ở đây trong python thenđược thay thế bởi hai điều a :và một dòng mới bắt buộc. Một trong số này có vẻ dư thừa.
bhan sur

Câu trả lời:


9

Có, dấu hai chấm được yêu cầu để định hướng các cấu trúc nhất định. Hãy xem xét, ví dụ , if x - y < z: pass. Không có dấu hai chấm, chúng ta không thể quyết định làm thế nào để phân tích cái này mà không biết bối cảnh của x, y và z là gì. if x: -y < z...là hợp lệ nếu x là boolean, if x - y < z:là hợp lệ khác.

Vì đó là một ý tưởng rất tốt cho một ngôn ngữ lập trình để không yêu cầu bạn thực thi một ứng dụng cho đến khi bạn biên dịch để có thể phân tích cú pháp, nên dấu hai chấm là rất bắt buộc. Bạn có thể bỏ nó, nhưng bạn cần những cách khác để định hướng.


1
Đợi đã, bạn có thể có một tuyên bố sau dấu hai chấm trên cùng một dòng không? Tôi khá chắc chắn rằng nó không được phép.
Tomáš Zato - Tái lập Monica

1
Nó được cho phép, nhưng chỉ với một ngắt dòng sau nó.
Phoshi

Vẫn còn một chút bối rối. Điều này có được phép không: if condition: print("Condition passed")\nđược phép? Ký hiệu \ndòng mới sau câu lệnh in.
Tomáš Zato - Phục hồi Monica

Chắc chắn, chỉ cần thử nó.
RemcoGerlich

1
@TomasZato: có, bạn có thể có bất kỳ tuyên bố nào sau dấu hai chấm. Nó ngay lập tức chấm dứt khối, vì vậy nó chủ yếu hữu ích khi khối là một lớp nhỏ.
Lie Ryan

14

Dấu hai chấm không thực sự cần thiết về mặt ngữ pháp, nếu Python được thiết kế ở một thế giới khác, có thể hình dung rằng nhà thiết kế ngôn ngữ có thể không quyết định yêu cầu dấu hai chấm. Và thực sự các ngôn ngữ như Cobra làm điều này.

Lý do chính tại sao đại tràng được yêu cầu trong python là khả năng đọc của con người. Để trích dẫn từ Python FAQ :

Tại sao dấu hai chấm cần thiết cho câu lệnh if / while / def / class?

Dấu hai chấm được yêu cầu chủ yếu để tăng cường khả năng đọc (một trong những kết quả của ngôn ngữ ABC thử nghiệm). Xem xét điều này:

if a == b
    print(a)

đấu với

if a == b:
    print(a)

Chú ý cách thứ hai dễ đọc hơn một chút. Lưu ý thêm về cách dấu hai chấm đặt ví dụ trong câu trả lời Câu hỏi thường gặp này; đó là cách sử dụng tiêu chuẩn trong tiếng Anh.

Một lý do nhỏ khác là dấu hai chấm giúp người chỉnh sửa dễ dàng hơn với việc tô sáng cú pháp; họ có thể tìm kiếm dấu hai chấm để quyết định khi nào cần thụt đầu dòng thay vì phải phân tích cú pháp phức tạp hơn của văn bản chương trình.

Như đã đề cập trong FAQ, dấu hai chấm cũng giúp xử lý mã python dễ dàng hơn mà không cần phân tích cú pháp hoàn toàn ngôn ngữ. Bất kỳ bộ xử lý văn bản nào có trình phân tích cú pháp đầy đủ, bao gồm trình biên dịch python, có thể làm mà không cần dấu hai chấm nếu không có yêu cầu hoặc nếu nó được tùy chọn khi không rõ ràng.


3
Cẩn chú ý cách thứ hai dễ đọc hơn một chút. Tôi thấy cái thứ nhất dễ đọc hơn. Ít tiếng ồn.
user76284

10

Nó không cần thiết cho máy tính, nhưng cho con người.

Guido van Rossum (người tạo ra Python) đã có một blog lịch sử Python trong một thời gian. Dấu hai chấm được giới thiệu trong ABC , nguồn gốc của nhiều tính năng của Python.

Trong bài đăng trên blog này về "Karin Dewar, thụt và đại tràng" , Guido viết:

Và ở đây tôi sẽ diễn giải, theo yêu cầu của Lambert.

Năm 1978, trong một phiên thiết kế tại một biệt thự ở Jabłonna (Ba Lan), Robert Dewar, Peter King, Jack Schwartz và Lambert đã so sánh các cú pháp đề xuất thay thế khác nhau cho B, bằng cách so sánh các cách triển khai bong bóng (lỗi) được viết trong mỗi phương án. Vì họ không thể đồng ý, vợ của Robert Dewar được gọi từ phòng của cô và hỏi ý kiến ​​của cô, giống như một Paris thời hiện đại được yêu cầu so sánh vẻ đẹp của Hera, Athena và Aphrodite. Nhưng sau khi phiên bản đầu tiên được giải thích với cô ấy, cô ấy nhận xét: "Ý bạn là, trong dòng có ghi: 'CHO TÔI ...', rằng nó phải được thực hiện cho các dòng tiếp theo, không chỉ cho dòng đó? ! " Và ở đây, các nhà khoa học nhận ra rằng sự hiểu lầm sẽ tránh được nếu có một dấu hai chấm ở cuối dòng đó.

( B ở đây là một loạt các ngôn ngữ nguyên mẫu B0, B1, ... dẫn đến ABC. Đây không phải là ngôn ngữ B là tiền thân của C).

Tôi cũng nhớ Guido đã chỉ ra vào những năm 90 rằng đó là vì lợi ích của các biên tập viên , có thể tự động chèn một vết lõm sau khi một dòng kết thúc bằng dấu hai chấm. Nhưng tôi chưa tìm thấy một nguồn cho điều đó.


4

Các Cobra Lập trình Ngôn ngữ của cú pháp được lấy cảm hứng từ Python, và nó không đi với đại tràng, vì vậy nó có vẻ như nó không phải là thực sự cần thiết. Tuy nhiên, chỉ cần loại bỏ dấu hai chấm là không đủ , có những thay đổi khác đối với cú pháp cần thiết. Xem, ví dụ đoạn mã này từ một trong những dự án đồ chơi của tôi :

kons  = lambda hd, tl: lambda x: hd if x else tl
virst = lambda l: l(True )
rrest = lambda l: l(False)

Nếu không có dấu hai chấm để tách phần thân khỏi danh sách tham số, tôi sẽ phải sử dụng thụt lề:

kons  = lambda hd, tl
    lambda x
        hd if x else tl

virst = lambda l
    l(True )

rrest = lambda l
    l(False)

Tôi tin rằng các phiên bản trước của Cobra đã tạo dấu hai chấm tùy chọn, bạn có thể sử dụng thụt đầu dòng hoặc dấu hai chấm hoặc cả hai. Tương tự như cách nó hoạt động trong Ruby, nơi có các từ khóa để phân tách các phần khác nhau của biểu thức kiểm soát, nhưng bạn cũng có thể sử dụng dấu tách biểu thức (dấu chấm phẩy hoặc dòng mới):

# idiomatic
while true do puts "I am awesome" end
#          ↑↑

# non-idiomatic, but legal
while true; puts "I am awesome" end
#         ↑

# non-idiomatic, but legal
while true
puts "I am awesome" end

# idiomatic
while true
  puts "I am awesome"
end

Trong các phiên bản hiện tại của Cobra, bạn có thể sử dụng dấu phẩy:

if x
    y

có thể được viết như

if x, y

Bạn cần một số cách để tách các phần khác nhau của biểu thức hoặc định nghĩa điều khiển. Trong Python, đó là dấu hai chấm. Nếu bạn loại bỏ dấu hai chấm, bạn cần thay thế nó bằng một cái gì đó khác, ví dụ như thụt bắt buộc . Chỉ loại bỏ ruột kết sẽ không hoạt động.

Cách duy nhất để hoàn toàn chắc chắn là chính thức hóa cú pháp có và không có dấu hai chấm và chứng minh tính không mơ hồ của nó.

Tuy nhiên, lưu ý rằng một trong những câu cách ngôn của Zen of Python là "Rõ ràng là tốt hơn Ngụ ý", do đó, việc phân định rõ ràng các khối với dấu hai chấm dường như phù hợp với triết lý chung của Python. Các thiết kế và Lịch sử FAQ cũng đề cập rằng quyết định này được dựa trên bằng chứng thực nghiệm từ người tiền nhiệm của Python, ABC.


3
Vâng, với triết lý được mô tả trong đoạn cuối, bạn có thể yêu cầu dấu hai chấm ở cuối mỗi dòng. Rõ ràng so với ẩn chỉ có ý nghĩa nếu rõ ràng thực sự thêm thông tin (ví dụ: biến thể ẩn là mơ hồ). Đó là điểm của câu hỏi của tôi.
Tomáš Zato - Phục hồi Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.