2012-02-16 44 views
10

Đã gần nửa đêm và tôi chỉ có một câu hỏi trong đầu là "for loop" một câu lệnh hoặc một hàm.Sự khác biệt giữa tuyên bố và chức năng

Tôi luôn nghĩ đó là một tuyên bố, nhưng tôi đã thực hiện tìm kiếm trên google là một chức năng và thực sự có kết quả cho điều đó. Vậy đo la cai gi? Và trong trường hợp đó sự khác nhau giữa hàm và câu lệnh là gì?

+0

Điều đó thực sự phụ thuộc vào ngôn ngữ của bạn. Nó là gì, Ruby, Python hay Javascript? – deceze

+1

Câu hỏi hay - nó cho thấy bạn đã thực hiện nghiên cứu của bạn, đó là rất lớn. – Purag

+0

@ lừa dối không phải là tất cả các tuyên bố trong ba ngôn ngữ này? –

Trả lời

18

Vòng lặp for thường không phải là hàm, nó là một loại câu lệnh đặc biệt được gọi là cấu trúc điều khiển luồng.

A statement là một lệnh. Nó làm điều gì đó. Trong hầu hết các ngôn ngữ, các câu lệnh không trả về các giá trị. Ví dụ:

print "Hello World" 

Một chương trình con có thể được gọi ở nơi khác trong chương trình. Chức năng thường (nhưng không nhất thiết) trả về giá trị. Ví dụ:

function(a) { return a * 2 } 

Một control structure, còn được gọi là một tuyên bố hợp chất, là một tuyên bố được sử dụng để chỉ đạo các luồng thực hiện. Ví dụ:

if (condition) then { branch_1 } else { branch_2 } 
for (i = 0; i < 10; i += 1) { ... } 

Cũng đáng chú ý là một expression là một đoạn mã đánh giá về giá trị. Ví dụ:

2 + 2 

Tất cả các ví dụ đều có trong mã giả, không được gắn với bất kỳ ngôn ngữ cụ thể nào. Cũng lưu ý rằng đây không phải là các danh mục độc quyền, chúng có thể trùng lặp.

+1

Theo logic đó, một vòng lặp 'for' sẽ là cả một câu lệnh * và * một cấu trúc điều khiển, đúng không? Và một chức năng không * cần * để trả lại một cái gì đó - nó cũng có thể được sử dụng để thực hiện đơn giản, nhưng theo cách thức mà một số thứ nhất định và sản phẩm được dựa trên các trường hợp cụ thể. – Purag

+0

Không chính xác khi nói rằng vòng lặp for không phải là một câu lệnh cũng như một hàm (không phải là nó không được sử dụng như một cấu trúc điều khiển). Vòng lặp for là một câu lệnh ghép trong hầu hết các ngôn ngữ, mặc dù nó có thể là một biểu thức hoặc hàm. Trong Javascript, Python và Ruby nó là một câu lệnh. – zeekay

+0

@Purmou, tôi đang trong quá trình cập nhật câu trả lời của tôi để khắc phục điều đó giống như khi bạn đăng nhận xét. –

1

Câu trả lời này có liên quan đến Python 2.7.2. Lấy từ python tutorial:

"4. Nhiều Flow Control cụ

4,2 cho báo cáo:. Các câu lệnh for trong Python khác một chút so với những gì bạn có thể được sử dụng để trong C hoặc Pascal. Thay vì luôn lặp qua một số học số (như trong Pascal), hoặc cho người dùng khả năng xác định cả bước lặp và điều kiện dừng (như C), câu lệnh của Python lặp lại các mục của bất kỳ chuỗi nào (danh sách hoặc một chuỗi) theo thứ tự xuất hiện trong chuỗi. "

6

Trong số ba thẻ ngôn ngữ bạn đã chọn, tôi chỉ rất familliar với Python, nhưng tôi tin rằng nhiều ngôn ngữ khác có quan điểm tương tự về các khái niệm này. Tất cả các mã ví dụ ở đây là Python.

Tuyên bố là điều được thực hiện; một "hướng dẫn để làm điều gì đó" mà việc thực hiện ngôn ngữ hiểu được. ví dụ.

print "Hello World" 

pass 

def foo(n): 
    return n + 1 

if condition: 
    print 'yay' 
else: 
    print 'doh' 

Khối trên chứa tuyên bố in, câu lệnh chuyển, câu lệnh định nghĩa hàm và câu lệnh if/else. Lưu ý rằng định nghĩa hàm và câu lệnh if/else là các câu lệnh ghép; chúng chứa các câu lệnh khác (có thể là nhiều câu lệnh, và có thể là các câu lệnh phức hợp khác).

Biểu thức là thứ có thể được đánh giá để tạo ra giá trị. ví dụ.

1 

"foo" 

2 * 6 

function(argument) 

None 

Biểu thức ở trên chứa biểu thức số, biểu thức cuộc gọi hàm và biểu thức Không có chữ. Khác với chữ và biến, biểu thức được tạo thành từ các biểu thức khác. Trong các số function(argument), functionargument cũng là cả hai biểu thức.

Sự khác biệt chính là các câu lệnh là các chỉ dẫn cho phép thực hiện ngôn ngữ "đi làm điều gì đó". Các biểu thức được đánh giá thành một giá trị (có thể yêu cầu thực hiện ngôn ngữ để "đi làm một cái gì đó" trên đường). Một hệ quả của việc này là ở bất cứ nơi nào bạn nhìn thấy một giá trị (bao gồm một biểu thức), bạn có thể thay thế bất kỳ biểu thức nào khác và bạn vẫn sẽ nhận được một cái gì đó mà làm cho một số loại ý nghĩa. Nó có thể không biên dịch, hoặc ném ngoại lệ trong thời gian chạy, hoặc bất cứ điều gì, nhưng trên ít nhất một số cấp độ bạn có thể hiểu những gì đang xảy ra.

Tuyên bố có thể không bao giờ xuất hiện bên trong biểu thức (tôi cho rằng điều này không đúng trong Ruby và Javascript theo nghĩa nào đó). và các khối mã chứa các câu lệnh, nhưng đó là loại khác với những gì tôi đang nói). Biểu thức phải có giá trị (ngay cả khi nó là một giá trị không quan tâm như None). Một câu lệnh là một lệnh; nó không có ý nghĩa để nó xuất hiện như là một phần của một biểu thức, bởi vì nó không có giá trị.

Nhiều ngôn ngữ cũng cho phép sử dụng các biểu thức làm câu lệnh. Ý nghĩa thông thường của điều này là "đánh giá biểu thức này để có được một giá trị, sau đó vứt nó đi". Trong Python, chức năng mà luôn luôn trả None thường được sử dụng theo cách này:

write_to_disk(result) 

Nó được sử dụng như một "lệnh", vì vậy nó trông giống như một tuyên bố, nhưng về mặt kỹ thuật nó là một biểu hiện, chúng ta không thể sử dụng giá trị nó đánh giá cho bất cứ điều gì. Bạn có thể lập luận rằng một "biểu thức trần" là một trong những câu lệnh có thể có trong một ngôn ngữ (và chúng thường được phân tích cú pháp theo cách đó).

Một số ngôn ngữ mặc dù phân biệt giữa các hàm phải được sử dụng như câu lệnh không có giá trị trả về (thường được gọi là thủ tục) và chức năng được sử dụng như biểu thức và cung cấp cho bạn lỗi hoặc cảnh báo về cách sử dụng chức năng như câu lệnh và cung cấp cho bạn một lỗi khi sử dụng quy trình làm biểu thức.

Vì vậy, nếu foo là một biểu thức, tôi có thể viết 1 + foo và mặc dù nó có thể dẫn đến lỗi loại, ít nhất cũng có ý nghĩa nhiều. Nếu foo là một tuyên bố, thì 1 + foo thường là lỗi phân tích cú pháp; việc thực hiện ngôn ngữ thậm chí sẽ không thể hiểu được những gì bạn đang cố gắng nói.


Một chức năng mặt khác, là một điều bạn có thể gọi. Nó không thực sự là một biểu thức hoặc một tuyên bố trong chính nó. Trong Python, bạn sử dụng câu lệnh def để tạo hàm và hàm gọi là biểu thức. Tên liên kết với hàm sau khi bạn tạo nó cũng là một biểu thức. Nhưng bản thân hàm này là một giá trị , không chính xác là một biểu thức khi bạn nhận được kỹ thuật, nhưng chắc chắn không phải là một tuyên bố.


Vì vậy, đối với vòng lặp. Đây là vòng lặp for trong Python:

for thing in collection: 
    do_stuff(thing) 

Trông giống như một câu lệnh (một câu lệnh if). Và để chứng minh điều đó, điều này là hoàn toàn vô nghĩa (và một lỗi phân tích cú pháp):

1 + for thing in collection: 
    do_stuff(thing) 

Trong một số ngôn ngữ mặc dù, tương đương với một vòng lặp for một biểu thức, và có một giá trị, mà bạn có thể thử để thêm 1. Trong một số nó thậm chí là một hàm, không cú pháp đặc biệt được đưa vào ngôn ngữ.

+0

"Một tuyên bố không bao giờ có thể xuất hiện bên trong một biểu thức (tôi tin rằng điều này không đúng trong Ruby [...])" - Ruby không có câu lệnh, chỉ có các biểu thức. –

+0

@ JörgWMittag Giá trị của vòng lặp for là gì? Sau cú pháp google nhanh của Ruby không * trông * giống như nó có giá trị, ngoại trừ ý nghĩa là một khối mã. Một biểu thức đánh giá là "giá trị mã" và một câu lệnh được thực hiện dường như là những thứ khác nhau, ngay cả khi cùng một văn bản thô trong mã nguồn có thể đại diện hoặc tùy thuộc vào ngữ cảnh; Tôi đang vật lộn với vấn đề này ngay bây giờ trong một ngôn ngữ đồ chơi tôi đang phát triển một cách nhàn rỗi. – Ben

+0

@ JörgWMittag Tôi đã thực hiện một số đọc nhiều hơn, và tôi thấy rằng đó không phải là những gì bạn đang nói về cả. Ruby đưa ra giá trị cho các vòng lặp và điều kiện và như vậy. Khéo léo! Tuy nhiên vẫn có một số điều thực sự là * các câu lệnh * ngữ nghĩa, chẳng hạn như 'break' (và đôi khi Ruby cho bạn một lỗi phân tích cú pháp để sử dụng chúng như là các biểu thức, mặc dù không phải lúc nào: http://carboni.ca/blog/p/Báo cáo-in-Ruby) – Ben

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