Scala 学习杂记

Java 中 静态成员是对应类的,所以既可以通过对象名,也可以通过类名访问,但不能访问非静态方法或变量;位于“数据区”,无论多少个对象该变量在内存中都只有一份;

Java中非静态成员是对应对象的,每个对象都会有一个,所以只能通过对象名引用;位于“堆空间”,每new一个对象创建一份,因此有多少个对象该变量在内存就有多少份;

scala中没有静态方法和属性,全部由singleton object(单例对象)来替代;


******************************

java的interface只定义方法名称和参数列表,不能定义方法体; 实现接口用implement;trait可以看作有方法实现和字段的interface;代表一类事物的特性

Scala 中trait则可以定义方法体,即 可以包含方法的接口;实现trait 用extends;scala可以在一个class实例化的时候混合进一个trait, 并通过用with 对其进行包装;

*********************************

val evenNumbers = List(2, 4, 6, 8, 10)

evenNumbers.foldLeft(0) { (a: Int, b:Int) => a + b }

可以利用 Scala 的参数类型推测功能 将上面操作简化为:evenNumbers.foldLeft(0) { (a, b) => a + b }  甚至可以简化为 evenNumbers.foldLeft(0) { _ + _ }


********************************************

模式匹配的基本思想就是试图对一个值进行多种模式的匹配,并且在匹配的同时将匹配值拆分成若干子项,最后对匹配值与其子项执行某些代码;

case classes

  1. 编译器为case class生成一个同名的对象构造器(Factory Method),也就是你可以使用 Var(“x”) 来创建一个类的实例,而无需使用new Var(“x”).-->可以省略 new 关键字
  2. Scala prefixes all the parameters with val,
  3. A companion object is created with the appropriate apply method
  4. The compiler adds a method called unapply
  5. Scala编译器为case class的构造函数的参数创建以参数名为名称的属性,比如Val的类的参数name:String 可以直接通过 .name访问;.-->即自动添加  getter 方法
  6. 编译器为case class 构造了更自然的toString,hashCode和equals实现,它们会递归打印,比较case class的参数属性;-->这些实现可以按照值区别类实例是否相等,从而方便进行 模式匹配
  7. Scala编译器为case class添加了一个Copy方法,这个copy方法可以用来构造类对象的一个可以修改的拷贝。这对于使用已有的对象构造一个新实例非常方便,你只要修新创建实例的某些参数即可。
  8. eg

这个程序的目标是处理一些由整数常量、变量和加号组成的简单的算数表达式,例如1 + 2 和 (x + x ) + (7 + y )。

abstract class Tree

case class Sum(l: Tree, r: Tree) extends Tree

case class Var(n: String) extends Tree

case class Const(v: Int) extends Tree

我们实际上定义了三个条件类 Sum ,Var 和 Const 。表示我们算数表达式的数据类型.

下面给他们定义对应的操作。我们将会首先编写一个在上下文中下计算表达式的函数。这里的上下文指的是变量与值的绑定关系。例如表达式x+1在x=5上下文中应该得出结果6。

type Environment = String => Int

现在我们可以开始定义求值函数了。

def eval(t: Tree, env: Environment): Int = t match {

      case Sum(l, r) => eval(l, env) + eval(r, env)

      case Var(n)     => env(n)

      case Const(v)   => v

}

********************************************

Scala的Option类型可以避免这种情况,因此Scala应用推荐使用Option类型来代表一些可选值。使用Option类型,读者一眼就可以看出这种类型的值可能为None。

在写模式匹配时,为保证可选项覆盖了全部的可能性,这时可以为基类添加上Sealed关键字,这样你就只需要关心已经定义的子类,如果可选项不去全,编译器会自动警告。


**********************************************

case class 的优点

  1. match是表达式,不是语句,所以是有返回值的,
  2. 在模式中使用变量可能会与常量冲突,因此变量要以小写字母开始。如果有常量是小写字母开头的,那么需要用反引号将常量名包起来

case class 的用处:

  1. 用于替换 tuples
    1. val p = ("qh",20) // p._1 = "qh", p._2 = 20;好处是简洁,但无意义
    2. case class person(name:String, age:Int)
      val p = person("qh",20) // p.name = "qh", p.age = 20; 好处是有名字,自说明,可读性强


内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值