函數

      在〈函數〉中尚無留言

函數從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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *