2012-02-16 149 views
10

現在已經快到午夜了,我剛剛在頭腦中提出了一個問題,即「for循環」語句或函數。語句和函數之間的區別

我一直認爲這是一個聲明,但我做了一個谷歌搜索它是一個函數,並且確實有結果。那是什麼?在這種情況下,函數和聲明有什麼區別?

+0

這真的取決於你的語言。它是什麼,Ruby,Python或Javascript? – deceze 2012-02-16 07:42:07

+1

好問題 - 它表明你已經完成了你的研究,這是巨大的。 – Purag 2012-02-16 07:43:37

+0

@deceze是不是所有這三種語言的陳述? – 2012-02-16 07:52:12

回答

18

for循環通常不是一個函數,它是一種稱爲流控制結構的特殊聲明。

A statement是一個命令。它做了一些事情。在大多數語言中,語句不返回值。例如:

print "Hello World" 

function是一個,可以在程序的其它地方被調用的子例程。函數經常(但不一定)返回值。例如:

function(a) { return a * 2 } 

control structure,也稱爲複合語句,是用來直接執行的流程的聲明。實例:

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

另外值得注意的是,一個expression是一段代碼,其值是值。示例:

2 + 2 

所有示例均採用僞代碼,不受任何特定語言的限制。另請注意,這些不是獨佔類別,它們可以重疊。

+1

那麼,通過這個邏輯,'for'循環將是一個聲明*和*一個控制結構,是的?一個函數不需要*返回一些東西 - 它也可以用於簡單的執行,但某種東西是可變的,產品是基於特定的情況。 – Purag 2012-02-16 07:44:17

+0

說for循環既不是語句也不是函數(不是它不被用作控制結構)是不正確的。 for循環在大多數語言中都是複合語句,儘管它也可以是表達式或函數。在Javascript,Python和Ruby中,這是一個聲明。 – zeekay 2012-02-16 07:49:42

+0

@Purmou,我正在更新我的答案以解決問題,就像您發表評論一樣。 – 2012-02-16 07:51:40

1

此答案與Python 2.7.2相關。從python tutorial摘自:

4.深入流程控制

4.2 for語句: Python中的for語句和你可以在C或Pascal中的略有不同。 Python的for語句並不總是迭代數字的算術級數(比如在Pascal中),或者讓用戶能夠定義迭代步驟和停止條件(如C),Python迭代任何序列的項目(列表或一個字符串),按順序出現在序列中。「

6

在您選擇的三種語言標記中,我只是非常熟悉Python,但我相信很多其他語言對這些概念有類似的看法。這裏的所有示例代碼都是Python。

A 陳述是執行的東西;一種語言實現理解的「做某事的指令」。例如

print "Hello World" 

pass 

def foo(n): 
    return n + 1 

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

上面的塊包含一個print語句,一個通用語句,一個函數定義語句和一個if/else語句。請注意,函數定義和if/else語句是複合語句;它們包含其他語句(可能包括許多其他語句以及可能的其他複合語句)。

一個表達式是可以評估產生一個值的東西。例如

1 

"foo" 

2 * 6 

function(argument) 

None 

上面包含一個數字文字表達,字符串文字表達,涉及數值運算,函數調用表達式,以及無文字表達的表達。除了文字和變量,表達式由其他表達式組成。在function(argument),functionargument也都是表達式。

關鍵的區別是語句是指示語言實現「去做某事」的指令。表達式被評估爲一個值(這可能需要語言實現「在路上做某事」)。

這樣做的一個後果是,只要你看到一個值(包括一個表達式),就可以替換任何其他表達式,並且你仍然會得到某種有意義的東西。它可能無法編譯,或者在運行時拋出異常,或者至少在某個層次上,你可以理解發生了什麼。

語句可以從未出現的表達(我相信這不是紅寶石和Javascript真正在某種意義上,因爲它們允許文字代碼塊和功能然後將其用作值作爲一個整體,和函數中並且代碼塊包含語句;但這與我正在談論的有所不同)。表達式必須有一個值(即使它是一個像None一樣無趣的表達式)。聲明是一個命令;它作爲一個表達的一部分出現是沒有意義的,因爲它沒有價值。

許多語言還允許將表達式用作語句。通常的意思是「評估這個表達式來獲得一個值,然後把它扔掉」。在Python中,總是返回功能None通常這樣使用:

write_to_disk(result) 

它被用來作爲一個「命令」,所以它看起來像一個聲明,但在技術上它是一個表達式,我們根本就沒有使用的價值它評估任何事情。你可以爭辯說,一個「裸露的表達」是一種語言中可能的語句之一(並且他們經常被這樣解析)。

一些語言雖然區分必須使用像沒有返回值的語句(通常稱爲過程)和使用像表達式一樣的函數,並且爲使用像聲明這樣的函數提供錯誤或警告,給你一個使用過程作爲表達式的錯誤。

所以,如果foo是一個表達式,我可以寫1 + foo,雖然它可能導致類型錯誤,但它至少有很大意義。如果foo是一個語句,那麼1 + foo通常是一個分析錯誤;語言實現甚至無法理解你想說的話。


在另一方面,一個功能,是可以調用的事情。它本身不是一個表達或聲明。在Python中,您使用def語句來創建一個函數,而函數調用是一個表達式。創建後綁定到該函數的名稱也是一個表達式。但函數本身是的值,這在獲取技術時並不完全是表達式,但肯定不是聲明。


因此,for循環。這是Python中的for循環:

for thing in collection: 
    do_stuff(thing) 

看起來像一條語句(複合語句,如if語句)。爲了證明這一點,這是毫無意義的(和解析錯誤):

1 + for thing in collection: 
    do_stuff(thing) 

在某些語言雖然for循環等效爲的表達,並具有價值,你可以嘗試添加1.在一些甚至是一個函數,而不是語言的特殊語法。

+0

「語句永遠不會出現在表達式中(我相信這在Ruby [...]中並不是這樣)」 - Ruby沒有語句,只有表達式。 – 2012-02-16 13:25:42

+0

@JörgWMittagfor循環的價值是什麼?在Ruby語法的快速谷歌不*看起來像它有一個值,除了作爲代碼塊的意義。即使源代碼中的相同原始文本可能依賴於上下文,也可能表示代碼值和要執行的語句似乎是不同的東西;我正在用我玩笑的玩具語言來解決這個問題。 – Ben 2012-02-18 01:26:55

+0

@JörgWMittag我已經做了一些更多的閱讀,我發現那不是你所說的。 Ruby確實爲循環和條件等提供了值。整齊!然而,還有一些事情確實是*語義*語句,例如'break'(並且它有時候會出現Ruby給你一個解析錯誤,用它們作爲表達式,儘管並不總是這樣:http://carboni.ca/blog/p /語句合紅寶石) – Ben 2012-02-18 01:41:20

相關問題