寒假学习记录第三天

Scala方法与函数

  1. Scala方法的定义
  • 有参方法
  • 无参方法

 


def fun (a: Int , b: Int ) : Unit = {

println(a+b)

}

fun(1,1)

def fun1 (a : Int , b : Int)= a+b

println(fun1(1,2))

注意点:

l 方法定义语法 用def来定义

l 可以定义传入的参数,要指定传入参数的类型

l 方法可以写返回值的类型也可以不写,会自动推断,有时候不能省略,必须写,比如在递归方法中或者方法的返回值是函数类型的时候。

l scala中方法有返回值时,可以写return,也可以不写return,会把方法中最后一行当做结果返回。当写return时,必须要写方法的返回值。

l 如果返回值可以一行搞定,可以将{}省略不写

l 传递给方法的参数可以在方法中使用,并且scala规定方法的传过来的参数为val的,不是var的。

l 如果去掉方法体前面的等号,那么这个方法返回类型必定是Unit的。这种说法无论方法体里面什么逻辑都成立,scala可以把任意类型转换为Unit.假设,里面的逻辑最后返回了一个string,那么这个返回值会被转换成Unit,并且值会被丢弃。

  1. 递归方法

/**

* 递归方法

* 5的阶乘

*/

def fun2(num :Int) :Int= {

if(num ==1)

num

else

num * fun2(num-1)

}

print(fun2(5))

  1. 参数有默认值的方法

l 默认值的函数中,如果传入的参数个数与函数定义相同,则传入的数值会覆盖默认值。

l 如果不想覆盖默认值,传入的参数个数小于定义的函数的参数,则需要指定参数名称。


/**

* 包含默认参数值的函数

* 注意:

* 1.默认值的函数中,如果传入的参数个数与函数定义相同,则传入的数值会覆盖默认值

* 2.如果不想覆盖默认值,传入的参数个数小于定义的函数的参数,则需要指定参数名称

*/

def fun3(a :Int = 10,b:Int) = {

println(a+b)

}

fun3(b=2)

  1. 可变参数的方法

l 多个参数用逗号分开


/**

* 可变参数个数的函数

* 注意:多个参数逗号分开

*/

def fun4(elements :Int*)={

var sum = 0;

for(elem <- elements){

sum += elem

}

sum

}

println(fun4(1,2,3,4))

  1. 匿名函数

    1. 有参匿名函数
    2. 无参匿名函数
    3. 有返回值的匿名函数

l 可以将匿名函数返回给val定义的值

l 匿名函数不能显式声明函数的返回类型


/**

* 匿名函数

* 1.有参数匿名函数

* 2.无参数匿名函数

* 3.有返回值的匿名函数

* 注意:

* 可以将匿名函数返回给定义的一个变量

*/

//有参数匿名函数

val value1 = (a : Int) => {

println(a)

}

value1(1)

//无参数匿名函数

val value2 = ()=>{

println("我爱尚学堂")

}

value2()

//有返回值的匿名函数

val value3 = (a:Int,b:Int) =>{

a+b

}

println(value3(4,4))

  1. 嵌套方法

/**

* 嵌套方法

* 例如:嵌套方法求5的阶乘

*/

def fun5(num:Int)={

def fun6(a:Int,b:Int):Int={

if(a == 1){

b

}else{

fun6(a-1,a*b)

}

}

fun6(num,1)

}

println(fun5(5))

  1. 偏应用函数

偏应用函数是一种表达式,不需要提供函数需要的所有参数,只需要提供部分,或不提供所需参数。


/**

* 偏应用函数

*/

def log(date :Date, s :String)= {

println("date is "+ date +",log is "+ s)

}

val date = new Date()

log(date ,"log1")

log(date ,"log2")

log(date ,"log3")

//想要调用log,以上变化的是第二个参数,可以用偏应用函数处理

val logWithDate = log(date,_:String)

logWithDate("log11")

logWithDate("log22")

logWithDate("log33")

  1. 高阶函数

函数的参数是函数,或者函数的返回类型是函数,或者函数的参数和函数的返回类型是函数的函数。

l 函数的参数是函数

l 函数的返回是函数

l 函数的参数和函数的返回是函数


/**

* 高阶函数

* 函数的参数是函数 或者函数的返回是函数 或者函数的参数和返回都是函数

*/

//函数的参数是函数

def hightFun(f : (Int,Int) =>Int, a:Int ) : Int = {

f(a,100)

}

def f(v1 :Int,v2: Int):Int  = {

v1+v2

}

println(hightFun(f, 1))

//函数的返回是函数

//1,2,3,4相加

def hightFun2(a : Int,b:Int) : (Int,Int)=>Int = {

def f2 (v1: Int,v2:Int) :Int = {

v1+v2+a+b

}

f2

}

println(hightFun2(1,2)(3,4))

//函数的参数是函数,函数的返回是函数

def hightFun3(f : (Int ,Int) => Int) : (Int,Int) => Int = {

f

}

println(hightFun3(f)(100,200))

println(hightFun3((a,b) =>{a+b})(200,200))

//以上这句话还可以写成这样

//如果函数的参数在方法体中只使用了一次 那么可以写成_表示

println(hightFun3(_+_)(200,200))

  1. 柯里化函数

l 高阶函数的简化


/**

* 柯里化函数

*/

def fun7(a :Int,b:Int)(c:Int,d:Int) = {

a+b+c+d

}

println(fun7(1,2)(3,4))

原文地址:https://www.cnblogs.com/xuange1/p/12257456.html

时间: 2024-10-11 17:51:30

寒假学习记录第三天的相关文章

程序员面试笔试宝典学习记录(三)(数据库相关知识)

关系数据库系统与文件数据库系统的区别如下: (a)关系数据库系统的主要特征是数据的结构化,而文件数据库系统是数据的非结构化. (b)关系数据库系统中,用户看到的逻辑结构是二维表,而文件数据库系统中,基本元素是文件. (c)文件数据库系统可以实现多媒体文件管理,支持C/S工作模式. acid,指数据库事务正确执行的四个基本要素的缩写.包含:原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability). 数据查询:select sele

hadoop学习记录(三)HBase基本概念

这一次开始学习HBase数据库. 我用的是VMWare + ubuntu16.04 +Hbase1.1.5 +hadoop2.6.0的组合. 经过亲自安装验证,版本间没有发生冲突,可以进行学习和开发. 具体的安装过程参照了厦门大学数据实验室的安装教程,个人感觉这里面的安装步骤非常详细,非常少适合新人上手,只要懂得基本的java和linux基础即可. 下面是厦大数据实验室的链接:http://dblab.xmu.edu.cn/blog/588-2/#more-588 Hbase即hadoop da

【JSP】JSP基础学习记录(三)—— JSP的9个内置对象

本节说一下JSP中的9个内置对象.这9个内置对象都是Servlet API接口的实例,只是JSP规范对他们进行了默认初始化(由JSP页面对应Servlet的_jspService()方法来创建这些实例).也就是说,他们已经是对象,可以直接使用. application:javax.servlet.ServletContext的实例,该实例代表JSP所属的Web应用本身,可用于JSP页面,或者在Servlet只见交换信息.常用的方法有getAttribute(String attName).set

《Javascript高级程序设计》学习记录(三)

JS创建对象的几种方式(一)工厂模式  所谓的工厂方式就是构造一个普通的函数,在函数里面构建一个包含所有信息的对象并且返回,然后在创建对象的时候使用该函数并且传入相对应的参数即可  示例代码:    function createObject(name ,age,job){            var o = new Object();            o.name = name;            o.age = age;            o.job = job;      

PHP学习记录(三)

一.字符串方法: 1.去除空格:trim( $str ):去除两端空格. ltrim():去除左端空格: rtrim():去除右端空格. 2.获取字符串长度:strlen( $str ):获取英文字符串的长度. mb_strlen( ):获取中文字符串的长度. 3.字符串截取:substr( $str , 截取位置 , 截取个数 ). mb_substr():中文字符串的截取. 4.查找字符串:strpos( $str , 要查找的字符串 [,开始查找的位置] ),返回所在位置的下标. 5.字符

DeepLearning工具Theano学习记录(三) CNN卷积神经网络

代码参考:http://deeplearning.net/tutorial/lenet.html#lenet 代码学习:http://blog.csdn.net/u012162613/article/details/43225445 本节实验代码下载:Github 2015/4/9 Experiment 1:  使用Tutorial推荐的CNN结构实验 learning_rate=0.1 n_cv= 20   # 第一层卷积核20 n_vc=50    #第二层卷积核50 n_epochs=20

BigData 学习记录(三)

master/slave主从结构: HDFS是一个 master/slave的架构.HDFS只有一个NameNode,即master.master负责管理文件系统命名空间和client对文件的访问.此外,HDFS有很多DataNode,通常一个机器节点一个DataNode,管理这个节点上的存储.HDFS对外提供一个文件系统名字空间允许用户把数据存为文件的格式.文件拆分成若干个block,这些block存放在DataNode节点上.NameNode操作名字空间比如:打开,关闭,重命名文件目录.Da

python学习记录(三)

0827--https://www.cnblogs.com/fnng/archive/2013/02/24/2924283.html 通用序列操作 索引 序列中的所有元素都是有编号的--从0开始递增.这些元素可以通过编号分别访问. >>> test = 'testdemo' >>> test[0] 't' >>> test[4] 'd' 使用负数索引时,Python会从最后一个元素开始计数,注意:最后一个元素的位置编号是-1 >>>

react学习记录(三)——状态、属性、生命周期

react的状态state React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM) class Clock extends React.Component { constructor(props) { super(props); this.state = {date: new Date()}; } componentDidMount() { this.timerID = setInterval( () => this.tick(), 1000