寒假学习日报(十六)

  今天的阅读任务放在睡前去做,因此在写这篇博客的时候我还没有完成阅读任务。

  Scala:

  今天主要是学习了关于变量的一些知识,在视频的讲解下简单了解Scala对变量的设定。

首先是一些零碎的知识点:

package com.chapter01.vars

object VarDemo01 {
  def main(args: Array[String]): Unit = {
    var age: Int = 10
    var sal: Double = 10.9
    var name: String = "QUX"
    var isPass: Boolean = true
    //scala中小数默认为Double类型,整数默认为Int,定义为Float类型末尾必须有f
    var score: Float = 73.8f
    println(s"$age $isPass")
  }
}
package com.chapter01.vars

object VarDemo02 {
  def main(args: Array[String]): Unit = {
    //类型推导
    var num = 10 //num为Int类型
    //证明方式1:IDEA的提示
    println(num)
    //证明方式2:isInstanceOf判断类型
    println(num.isInstanceOf[Int])

    //Scala是强数据类型语言,一旦确定类型之后就不能修改
    //num = 1.1会报错

    //var修饰的变量可修改,val不可修改,val反编译时等同于加了final
    //val无线程安全问题,效率高,推荐使用,若需要改变变量,则改用var
    var age = 20
    age = 21  //OK
    val a = 10
    //a = 11报错

    val dog = new Dog
    //dog = new Dog报错,因为是val类型不能再分配。

    //但由于Dog内的属性是var类型,是可以更改的:
    dog.age = 10
    dog.age = 20
    dog.name = "Tony"
    dog.name = "Sum"
  }
}
class Dog{
  //声明一个属性,给定默认值,默认值为_
  var age: Int = _
  var name: String = _
}
package com.chapter01.vars

object VarDemo03 {
  def main(args: Array[String]): Unit = {
    //声明变量时必须要初始化,不可省略,默认值可以为_
    //Scala中数据类型都是对象
    var num1: Int = 10
    //Int是一个类,它的实例就可以使用很多方法
    println(num1.toDouble + "	" + num1.toString + 100.toFloat) //类型强转方法
    //Scala中如果一个方法没有形参,则可以省略括号
    sayHi
    sayHi()
  }

  def sayHi(): Unit = {
    println("say hi")
  }
}

 可以看到Scala对变量的设定与Java有一定的差别,为了能够结合函数式编程,Scala在数据类型的设定上要更加繁琐一些:

Scala根类型称为Any,其下分为两个类型:值类型AnyVal(Byte,Int,Long,Float,Double,StringOps,Char,Unit,Boolean等)引用类型AnyRef。引用类型下又分为三大类:

Scala collections:Scala下的集合,Scala对集合的应用可以说是用到了极致,而且是在java基础上进行了扩展

all java classes:传统java类

Other Scala classes:自定义类

此外,Scala下还有两个底层类:NullNothingNull是AnyRef的子类,Nothing是所有类的子类(AnyVal+AnyRef)。这么设计的好处,以Nothing为例,它是最底层的类,所以可以赋给任何一个变量,也可以被任何一个函数使用。最简单的例子:抛出异常(throw)就可以通过Nothing完成:

package com.chapter01.datatype

object TypeDemo01 {
  def main(args: Array[String]): Unit = {
    println(sayHello)
    //类型转换使用(低精度转换)
    var num1 = 1.6  //Double类型
    var num2 = 3.6f //Float类型
    num2 = num1.toFloat //将Double类型转换成Float类型
  }

  //假设开发中有一个方法就会异常中断,此时可以返回Nothing
  //使用Nothing返回时说明该方法没有正常的返回值
  def sayHello: Nothing = { //此处Nothing改成Unit也成立
    throw new Exception("出现ERROR")
  }
}

 使用Nothing去抛异常的话,就不用顾忌在抛的过程中类型的问题,因为Nothing可以赋给任何变量。

  OpenCV

 第一步图片读取是没有问题的:

#使用opencv读取图片与展示
import cv2
img = cv2.imread('image0.jpg',1)#第一个参数是图片名称,第二个参数指定显示类型,0为灰色,1为彩色
cv2.imshow('image',img)#第一个参数是窗体名称,第二个是图片内容
cv2.waitKey(0)

 第二步图片写入,一开始出现了“内核正忙”的错误,停滞了十多分钟。

#图片写入
import cv2
img = cv2.imread('image0.jpg',1)
cv2.imwrite('image1.png',img)

后来报出了Python程序停止运行,再次重启之后又好了:

 

 具体原因还在查询,个人感觉跟图片大小有关系。。。。

原文地址:https://www.cnblogs.com/20183711PYD/p/14327215.html