2012-11-12 29 views
6

Vì Python sử dụng khoảng cách tab để biểu thị phạm vi (và như vậy, không có các biểu tượng end của }), điều đó có giới hạn ngôn ngữ theo bất kỳ cách nào không có chức năng cụ thể không?Là một ngôn ngữ, Python có bị giới hạn do không có câu lệnh kết thúc?

Lưu ý: Tôi không nói về các sở thích cá nhân theo kiểu mã hóa, tôi đang nói về giới hạn ngôn ngữ thực sự vì kết quả trực tiếp không có tuyên bố end?

Ví dụ: it appears by a post directly from Guido rằng thiếu lamba nhiều dòng do Python không có ký hiệu chấm dứt end/}?

Nếu có, các hạn chế về Python khác là gì do quyết định thiết kế ngôn ngữ này sử dụng thụt đầu dòng?


Cập nhật:

Xin lưu ý câu hỏi này không phải là về Lambda và về mặt kỹ thuật, thậm chí không Python cho mỗi gia nhập. Đó là về thiết kế ngôn ngữ lập trình ... và những hạn chế nào một ngôn ngữ lập trình có khi nó được thiết kế để có thụt đầu dòng (trái ngược với câu lệnh kết thúc) đại diện cho phạm vi khối.

+0

http://stackoverflow.com/questions/1233448/no-multiline-lambda-in-python-why-not – dm03514

+1

Về nguyên tắc, một lambda có thể có một danh sách biểu thức dài tùy ý, vì vậy tôi không thấy lý do tại sao nó đang hạn chế .... –

+0

Câu hỏi này không phải về Lamba, đó là về "những hạn chế của python là gì vì quyết định thiết kế ngôn ngữ sử dụng thụt lề" – nickb

Trả lời

12

Không thiếu end/}: kết thúc được biểu thị bằng cách "khấu trừ" cho độ sâu trước đó. Vì vậy, không có giới hạn trong bất kỳ cách nào.

Ví dụ:

x = 123 
while x > 10: 
    if x % 21: 
     print("x") 
    print("y") 
print("z") 

A "bắt đầu" tương ứng với tăng mức độ thụt đầu dòng (sau while, sau if).

Một "kết thúc" tương ứng với việc giảm mức thụt đầu dòng (sau print() s tương ứng).

Nếu bạn bỏ qua số print("y"), bạn có "sự khấu trừ" ở cấp cao nhất, tương ứng với hai "kết thúc" liên tiếp.

+0

Đánh tôi với nó. : p – Omnikrys

+0

Bản thân Guido không đồng ý với cách tiếp cận này. http://www.artima.com/weblogs/viewpost.jsp?thread=147358 – nickb

+0

Có một số hạn chế, ví dụ: nó phải là một biểu thức duy nhất và nó không thể chứa bất kỳ từ khóa nào. –

0

Một trong những hạn chế lớn nhất (nếu bạn gọi nó là) là bạn không thể sử dụng các tab và dấu cách trong cùng một chương trình.

Và bạn không nên. Không bao giờ.

Không có giới hạn về cấu trúc rõ ràng, ngoại trừ có lẽ khi phân tích một tập tin nguồn python (phân tích cú pháp, không giải thích):

def foo(bar): 
     # If bar contains multiple elements 
    if len(bar) > 1: 
      return bar 

này được mã python hoàn toàn hợp pháp, tuy nhiên, khi phân tích các tập tin, bạn có thể chạy gặp rắc rối khi cố gắng tìm ra mức thụt đầu dòng mà nhận xét thuộc về.

2

Câu trả lời cho câu hỏi này nằm ở đâu đó giữa đường cú pháp và kiểu ngôn ngữ, tức là cách cụm từ một vấn đề thanh lịch và tuân thủ triết lý ngôn ngữ. Bất kỳ ngôn ngữ turing-hoàn chỉnh, ngay cả ngôn ngữ lắp ráp và C - chắc chắn thiếu bất kỳ hỗ trợ lambda - có thể giải quyết bất kỳ vấn đề. Lambda cho phép chỉ khác nhau (cho là thanh lịch hơn nếu nhìn từ quan điểm ngôn ngữ chức năng) các công cụ cũng có thể đánh giá bằng cách sử dụng định nghĩa hàm chuẩn. Vì vậy, tôi không thể nhận ra một giới hạn ở đây ngoài việc phải viết mã khác nhau.

0

Bạn có ý gì khi "giới hạn"? Bạn có nghĩa là có tính toán Python không thể thực hiện các ngôn ngữ khác có thể? Trong trường hợp đó, câu trả lời chắc chắn là không. Python là turing complete.

Bạn có nghĩa là việc thiếu các câu lệnh kết thúc thay đổi cách tính toán được thể hiện bằng Python? Trong trường hợp đó, câu trả lời là "chủ yếu là không". Bạn phải hiểu rằng việc khấu trừ của Python một tuyên bố kết thúc; đó là một chuỗi byte mà trình thông dịch nhận ra là kết thúc của một khối.

Tuy nhiên, như những người khác đã đề cập, việc sử dụng thụt đầu dòng để biểu thị các khối là khó xử khi nói đến các hàm nội tuyến (lambda của Python). Điều này có nghĩa là phong cách của các chương trình Python có thể hơi khác so với JavaScript, ví dụ (nơi nó phổ biến để viết các hàm nội dòng lớn).

Điều đó đang được nói, nhiều ngôn ngữ thậm chí không có chức năng nội tuyến để bắt đầu, vì vậy tôi sẽ không gọi đây là giới hạn.

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