函數從1990年最初的發展,有著不可違抗的規定,開發者必需遵循少數的幾條法則撰寫。現今因為CPU效能的提高,把這些規則全交由CPU判斷及編譯,加速了程式的開發,同時也發展了更多的規則。這對初學者並非是個好現像,因為你要背及要理解的規則更多了,更不好學。
函數簡介
若某一段程式碼, 會用到一次以上, 就必需將程式獨立出來, 成為一個副程式, 這個副程式就叫作函數.
如下的程式碼中, 分別是
1~100的總合計算,以及 1~50的總合計算
fun main(args:Array<String>){ var sum=0; for(i in 1..100){ sum+=i; } println("1~100的總合為 : %d".format(sum)) sum=0; for(i in 1..50){ sum+=i; } println("1~50的總合為 : %d".format(sum)) }
上述程式碼可以改成如下
fun main(args:Array<String>) { println("%d~%d的總合 : %d".format(1, 100, sum(1, 100))); println("%d~%d的總合 : %d".format(1, 50, sum(1, 50))); } fun sum(s:Int, e:Int):Int{ var sum=0; for(i in s..e){ sum+=i; } return sum; }
副程式與函數
30幾年前, 因為basic出來亂了程式這湖春水. 所以必需特別說明副程式跟函數其實不一樣. 怎麼不一樣呢? basic的副程式是沒有傳回值的, 但函數有傳回值.
只是時過境遷, basic也絕跡江湖了, 所以也就不太介意這二者之間的不同處了.
程式進入點
main()也其實就是一個函數. 那麼, 那麼多的函數, 程式到底會從那一個函數開始執行呢? 此時kotlin就強制性的規定, 一定要從main開始執行, 而且沒有main就不會執行
fun main(args:Array<String>){}
系統函數
系統本身就有的函數, 叫作系統函數, 比如Math.pow(x, y)
fun main(args:Array<String>) {
var x=Math.pow(2.0,10.0);
println("2^10=%.2f".format(x))
}
日期處理函數
取得目前系統時間, 可以產生Date物件, 其顯示出的結果為
println(Date())
結果:
Tue Aug 25 11:51:19 CST 2020
所以必需再使用SimpleDateFormat物件轉成所需的字串格式
var d=SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(Date())
自訂函數
自訂函數使用 fun宣告, 然後定義函數名稱, 括弧內定義參數名稱及型態, 最後再定義傳回值型態
fun sum(a:Int, b: Int):Int{ return a+b }
函式表執式 – 單行返回
函數主体區若只有一行, 可以使用 “=” ,其返回值會自動判斷
fun main(args:Array<String>){
println("半徑 : %.2f, 圓面積 : %.2f".format(10.0f, area(10.0f)));
}
fun area(radius:Float)=Math.PI*radius*radius;
無返回值
若函數沒有返回值, 則可以不用寫返回型態, 或加上Unit型態
fun main(args:Array<String>){ test() } fun test():Unit{//Unit可加也可不加 println("test"); }
變數生命周期
調用端跟被調用端的參數名稱,可以不一樣。但函數的參數是常數,其值是不能被改變的。如此就沒有什麼Call By value, Call by Address, Call by Reference這些讓人心煩的東西了。
fun main(args:Array<String>){ var a=10 var b=20 var c=sum(a, b)//調用端 print(c) } fun sum(x:Int,y:Int):Int{//被調用端的 x, y是常數val, 所以無法變更 //x=100 <= x, y是常數,是無法改變的 return x+y }
全域變數
條件表示式
預設參數
Kotlin也能像Python一樣,有預設的參數值。這個功能可以移除方法重載(Override)的機制。但kotlin的機制又比Python更加的方便。
先看一下正常的使用法
fun main(args:Array<String>){ print(add(1, 1))//沒有傳入c值,所以c為預設的100 } fun add(a:Int, b:Int, c:Int=100):Int{ return a+b+c } 結果:102
為什麼kotlin的預設參數值機制比Python更方便呢,因為Python的預設參數值必需置於沒有預設參數值的右邊,而Kotlin則是可以任意放置。此時調用端就要指定參數名稱,如 a=2, b=1
fun main(args:Array<String>){ print(add(a=2, b=1, 100)) } fun add(a:Int=1, b:Int, c:Int=1):Int{ return a+b+c }
空值與null
匿名函數
方法可變長度參數
當方法的參數數量不確定時,可以使用vararg 陣列名: 型態。此時傳入方法的參數就會以陣列型態傳入。但請注意,一個函數僅能有一個vararg
fun main(args:Array<String>){ println(add(1,2,3)) println(add(1,2,3,4,5)) } fun add(vararg vs:Int):Int{ var sum=0 for (v in vs){ sum+=v } return sum }
區域函式
函數中可以還有函數,叫區域函式,這又從Python學來的。真的很煩人,函數的功能愈來愈強,學起來就讓人更心煩。
todo