函數(shù)
函數(shù)亚享,本質(zhì)上是一種可復(fù)用的代碼〔t稼,F(xiàn)實(shí)生活中忽洛,有大量的工作都是重復(fù)的,變化的只是其中一小部分弛姜。
舉個例子脐瑰,假如要你計算 “ 1+2+3+4+5+6+7+8+9+10 ”妖枚,最簡單的方法當(dāng)然是直接在Matlab命令行中敲出這個式子廷臼。
這樣的方法沒有復(fù)用性,下次計算還需要重新輸入一遍這個式子绝页。如果荠商,需要計算100個,1000個或更多的數(shù)字之和续誉,就沒有辦法這樣輸入了莱没。
顯然,這是一個重復(fù)的工作酷鸦,變化的只是終點(diǎn)(如累加到100)饰躲。一個可以復(fù)用的程序代碼是只要告訴計算機(jī)終點(diǎn),它就自動完成這樣的累加運(yùn)算臼隔。函數(shù)就能實(shí)現(xiàn)這樣的一個功能嘹裂。
還用剛才的例子:用術(shù)語 “ 參數(shù) ” 來指代 “ 終點(diǎn) ”,術(shù)語 “ 返回值 ” 指代最終的結(jié)果摔握。生活經(jīng)驗(yàn)告訴我們寄狼,參數(shù)與返回值都可以有多個。
現(xiàn)在氨淌,我們看看在Matlab中怎樣實(shí)現(xiàn)函數(shù)(也叫聲明一個函數(shù))泊愧。還用這個例子伊磺,先把這個函數(shù)的代碼寫出來,然后逐條解釋删咱。
1 function result = sum ( n )
2 result = 0;
3 for i = 1:n
4 result = result + i;
5 end
6 return;
第一行中屑埋,有一個關(guān)鍵字 function, 它的作用是聲明這之后一直到 return 這部分的代碼都是屬于這個函數(shù)的代碼塊。
result 是這個函數(shù)要返回的值腋腮,這個函數(shù)里面雀彼,累加所得到的結(jié)果由 result 這個變量保存。
sum 是這個函數(shù)的名字即寡,n 是函數(shù)的參數(shù)徊哑。參數(shù)的細(xì)解釋起來也比較復(fù)雜,我們實(shí)用至上聪富,把它理解成一個可復(fù)用的代碼中需要變化的內(nèi)容就可以了莺丑。
例如,每次都要求從1到某個數(shù)的累加和墩蔓,變化的就是這個數(shù)梢莽,每次只需要告訴程序從1累加到幾就可以了。這個值通過參數(shù)傳遞給函數(shù)奸披。
在調(diào)用函數(shù)的時候昏名,只需要在命令行中原樣輸入函數(shù)名和參數(shù)就可以(需要函數(shù)腳本在 Matlab 的工作目錄下)。
當(dāng)然阵面,一個函數(shù)的返回值可以有多個轻局,參數(shù)也可以有多個。如果一個函數(shù)的返回值有多個样刷,則需要用中括號將返回值括起來仑扑。多個不同參數(shù),用逗號隔開即可置鼻。
例如镇饮,將上面的函數(shù)改個功能,既能得到累加的值箕母,也能得到累乘的結(jié)果储藐,還可以設(shè)定從 1 到 n 的步長。顯然嘶是,這里函數(shù)返回兩個值钙勃,分別為累加值和累乘積。參數(shù)也有兩個俊啼,分別為 n 和步長肺缕。因此,第一行就可以改寫成:
function [ result_sum, result_multi ] = sum_multi ( n,step )
請注意同木,調(diào)用函數(shù)的時候需要原樣調(diào)用浮梢。顧名思義,這是要求在調(diào)用函數(shù)的時候要按函數(shù)定義的形式調(diào)用彤路。雖然是原樣調(diào)用秕硝,但是返回值變量,我們可以自己定義洲尊。例如調(diào)用 sum_multi 函數(shù)應(yīng)該在命令行中輸入:
[ result1, result2 ] = sum_multi ( 10, 2 )
上一條命令的意思是远豺,調(diào)用sum_multi函數(shù),其中坞嘀,n = 10, step = 2. 意思就是從1到10躯护,每隔兩個數(shù)字取值。得到的累加結(jié)果保存到變量 result1中丽涩,而累乘得到的結(jié)果保存到 result2 中棺滞。
那如果調(diào)用這個函數(shù),但是不想要累加的結(jié)果矢渊,我只想要這個函數(shù)返回的累乘結(jié)果继准。應(yīng)該怎么辦?可以用~
代替你不想要的返回值矮男。這樣調(diào)用方式就變成了:
[ ~, result ] = sum_multi ( 10, 2 )
可以把最后一行的 return 理解成一個標(biāo)記符移必,它標(biāo)志著函數(shù)的代碼塊結(jié)束。它也定義了一些變量的作用范圍(也稱作用域)毡鉴。
在這里順便提一下變量的作用域崔泵。
一般說來,在一個程序的腳本文件中眨补,不允許有重復(fù)的變量名管削。但如果一個變量的作用范圍是有限的倒脓,那么在超出這個限制的范圍內(nèi)撑螺,變量名就可以重復(fù)了。
這個變量的作用范圍就是一個變量的作用域崎弃。它的規(guī)則也有比較復(fù)雜的情形甘晤。仍然實(shí)用至上,到目前為止饲做,我們只需要知道线婚,在函數(shù)中,變量的作用范圍是從 function 到 return 中間盆均。
大家可以自己嘗試著將函數(shù) sum_multi
寫出來并試著用不同的方式調(diào)用它塞弊。
代碼風(fēng)格
有時候,自己寫了一段代碼,回過頭再來看游沿,發(fā)現(xiàn)居然看不懂了饰抒。為了交流方便,也為了方便代碼維護(hù)诀黍,就要求大家遵循一定的規(guī)范袋坑,使得大家都能讀懂代碼。這些規(guī)則眯勾,有很多版本枣宫。這里只介紹幾條核心要求:
- 勤用注釋
注釋包括程序功能、函數(shù)功能吃环、用法的說明也颤,也包括對變量名、關(guān)鍵代碼行的注釋郁轻。
基本的原則是為了維護(hù)方便歇拆,也為了讓別人能看明白你寫的代碼。
使用%
符號在代碼中添加注釋范咨,可以在程序的任何位置中出現(xiàn)注釋故觅。
% 求矩陣元素中的和
function y = sum ( x ) % y是函數(shù)的返回值,返回一個整數(shù)
上例中渠啊,第一個注釋是解釋這個函數(shù)是干什么的输吏。第二行里面的注釋是簡單說明了返回值 y 的數(shù)據(jù)類型。
盡可能地將程序?qū)懙渺`活替蛉,方便改動贯溅。
這意味著寫一個程序要盡可能地考慮到不同的應(yīng)用場景,或者是不同的設(shè)備環(huán)境躲查。當(dāng)然它浅,這個要求相對較高,可以在慢慢熟練以后逐漸熟悉镣煮。縮進(jìn)
雖然 matlab 沒有像 python 一樣強(qiáng)制要求縮進(jìn)姐霍。但是為了讀起來方便,要善用縮進(jìn)讓代碼可讀性更強(qiáng)典唇。