13 高階函式

2021-08-30 19:50:03 字數 4483 閱讀 1613

高階函式主要有兩種:一種是將乙個函式當做另外乙個函式的引數(即:函式引數);另外一種是返回值是函式的函式。

演示示例:

object high 

println(str)

//2.呼叫返回值為函式的函式

//val result = multiby(10)(5)

val x = multiby(10)

val result = x(5)

println(result)

} def int2str(f:(int)=>string) = f(10)

def multiby(factor:double) = (x:double) => x * factor

}

//1. map函式(map函式中引數為函式)

//scala中,字串*n表示字串重複n遍

array

val arr = array("spark","hive","hadoop").map(x=>x*2)

//可以簡寫為:array("spark","hive","hadoop").map(_*2)

println(arr.mkstring(","))

//結果:sparkspark,hivehive,hadoophadoop

list

val list = list("spark","hive","hadoop")

val list1 = list.map(_*2)

println(list1.mkstring(","))

//結果:sparkspark,hivehive,hadoophadoop

val list2 = list("spark" -> 1,"hive" -> 2,"hadoop" -> 3)

val list21 = list2.map(_._1) // x=x._1

println(list21.mkstring(","))

//結果:spark,hive,hadoop

val list22 = list2.map(_._2) // x=x._2

println(list22.mkstring(","))

//結果:1,2,3

map

val map = map("spark" -> 1,"hive" -> 2,"hadoop" -> 3)

val map1 = map.map(_._1) // x=x._1

println(map1.mkstring(","))

函式val result = list(list(1,2,3),list(2,3,4)).flatmap(x => x)

println(result)

//結果:list(1, 2, 3, 2, 3, 4)

val result1 = list(list(1,2,3),list(2,3,4)).flatmap(x => x.map(_+100))

println(result1)

//結果:list(101, 102, 103, 102, 103, 104)

函式// 過濾條件

val arr1 = array(1,2,3,4,5).filter(_ > 3)

println(arr1.mkstring(","))

//結果:4,5

val list3 = list("tom","lily","ketty").filter(_.length() == 4)

println(list3.mkstring(","))

//結果:lily

函式val sum = array(1,2,3,4).reduce(_+_)

println(sum)

//結果:10

val multi = array(1,2,3,4).reduce(_*_)

println(multi)

//結果:24

val sum1 = array(1,2,3,4).reduce((x:int,y:int) => )

println(sum1)

//結果:(1,2)

// (3,3)

// (6,4)

// 10

val sum2 = array(1,2,3,4).reduceleft((x:int,y:int) => )

println(sum2)

//結果:(1,2)

// (3,3)

// (6,4)

// 10

val sum3 = array(1,2,3,4).reduceright((x:int,y:int) => )

println(sum3)

//結果:(3,4)

// (2,7)

// (1,9)

// 10

函式val sum4 = array(1,2,3,4).foldleft(0)((x:int,y:int) => )

//可以簡寫為:(0 /: array(1,2,3,4))(_+_)

println(sum4)

//結果:(0,1)

// (1,2)

// (3,3)

// (6,4)

// 10

val sum5 = array(1,2,3,4).foldright(10)((x:int,y:int) => )

println(sum5)

//結果:(4,10)

// (3,14)

// (2,17)

// (1,19)

// 20

函式//從左掃瞄,每步結果都儲存起來,執行完成後生成陣列

val sum6 = array(1,2,3,4).scanleft(0)((x:int,y:int)=>)

println(sum6.mkstring(","))

//結果:(0,1)

// (1,2)

// (3,3)

// (6,4)

// 0,1,3,6,10

val sum7 = array(1,2,3,4).scanright(10)((x:int,y:int)=>)

println(sum7.mkstring(","))

//結果:(4,10)

// (3,14)

// (2,17)

// (1,19)

// 20,19,17,14,10

def multiplyby1(factor:double) = (x:double) => x * factor

//柯里化

def multiplyby2(factor:double)(x:double) = x * factor

//注意:柯里化之後,就不能像multiplyby1那樣輸入乙個引數進行呼叫了

部分應用函式:當函式有多個引數,而在我們使用該函式時我們不想提供所有引數(假設函式有3個函式),只提供0~2個引數,此時得到的函式便是部分應用函式。

array("hadoop","hive","spark") foreach(x => println(x))

//等價於

def print(x:string) = println(x)

array("hadoop","hive","spark").foreach(print)

//下劃線_並不是佔位符的作用,而是作為部分應用函式的定義符

//1.乙個引數的部分應用函式

val p = print _

array("hadoop","hive","spark").foreach(p)

//2.多個引數的部分應用函式

//定義乙個求和函式

def sum(x:int,y:int,z:int) = x + y + z

//不指定任何引數

val s1 = sum _

println(s1(1,2,3))

//指定兩個引數的部分應用函式

val s2 = sum(1,_:int,3)

println(s2(2))

//指定乙個引數的部分應用函式

val s3 = sum(1,_:int,_:int)

println(s3(2,3))

//3.柯里化函式和部分應用函式

def multiby1(factor:int)=(x:int)=>factor*x

def multiby2(factor:int)(x:int) = factor*x

val x = multiby1(5)

val y = x(10)

//val z = multiby2(5) 報錯,它不能像沒柯里化的函式一樣返回乙個函式

val z = multiby2(5)_ //但是它可以它的部分應用函式

val z1 = z(10)

參考自:

學習筆記13 Python 函式高階

函式根據 有沒有引數 以及 有沒有返回值,可以 相互組合,一共有 4 種 組合形式 如果函式 內部處理的資料不確定,就可以將外界的資料以引數傳遞到函式內部 如果希望乙個函式 執行完成後,向外界匯報執行結果,就可以增加函式的返回值 def measure print 測試開始!height 1.8 w...

python 函式高階 python 函式高階

形參角度 萬能引數 動態接收位置引數 args 動態接收關鍵字引數 kwargs 的魔性用法 函式定義時 代表聚合。他將所有的位置引數 聚合成乙個元組,賦值給了args 函式定義時 將所有的關鍵字引數聚合成乙個字典中,將這個字典賦給了 kwargs 和 在函式的呼叫時 代表打散 僅限關鍵字引數 de...

Python高階 函式高階

閉包 closure 常規函式中可以在函式的引數中新增引數的預設值來簡化函式的操作,偏函式也可以做到這一點,而且會更加的方便管理函式的操作。通過內建模組functools的partial進行定義和處理 語法結構 新函式名稱 functools.partial 函式名稱,預設賦值引數 例如 全域性函式...