大数据之脚踏实地学13--Scala控制流

Posted 数据分析1480

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据之脚踏实地学13--Scala控制流相关的知识,希望对你有一定的参考价值。

还没关注?

快动动手指!

往期回顾




Scala中的输入与输出

在Scala中经常会涉及到变量值的输入和输出,输入是指通过键盘将数据信息传送到Scala环境的内存中,输出则是指将内存中的数据返回到指定的地方(如电脑屏幕、本地文件或数据库等)。
两种输入方法

  • 通过等号赋值的方法,向变量中传递值

  • 调用scala.io.StdIn包中的read类函数,在屏幕中完成数据的输入

举例

import scala.io.StdIn._  // 下划线代表StdIn包内的所有函数
object InPut {  
    def main(args: Array[String]): Unit = {
        // 方法一:等号赋值法
        val name : String = "刘顺祥"

        // 方法二:函数输入法
        println("请输入您的年龄:")
        val age = readInt()  // 输入不同数据类型的值,所使用的函数不一样

        println("亲爱的" + name + "先生,您的年龄为" + age + "岁")
    }
}

两种输出方法

  • 直接调用变量名的名称,但该方法只能在交互的REPL中执行

  • 借助于打印函数,该方法又可以衍生出三种用法,即:

a) println,结合加号(+),将多个内容进行连接并打印输出
b) println,传入表达式(表达式中所涉及的变量必须以美元符号作前缀),
其中表达式须用大括号框起来,同时需要在被打印对象的最前面加上字母s 
c) printf,格式化输出,类似于Python的用法

举例

object OutPut {
    def main(args : Array[String]) : Unit = {
        val name = "刘顺祥"
        val balance = 6.52

        // 加号(+)拼接法
        println("亲爱的" + name + "先生,您的话费余额为" + balance + "元。")
        // s表达式法
        println(s"亲爱的${name}先生,您的话费余额为${balance}元")
        // 格式化输出法 
        printf("亲爱的%s先生,您的话费余额为%.2f元\n", name, balance)
    }
}

需要注意的是,在Scala中,打印函数println和print的区别在于前者打印完会自动换行,而后者却不能换行,如需换行必须在打印内容的结尾添加\n。

Scala中的控制流

在Scala编程中,会经常使用到控制流技术,基于该技术,可以轻松地解决很多重复性的工作。本文主要分享有关控制流中的if分支、for循环和while循环。
if分支
if分支主要包含三种,分别是单分支、双分支和多分支,语法如下:

// 单分支
if (condition) {
  expression
  }

// 双分支
if (condition) {
expression1
else {
expression2
}

// 多分支(以三支为例)
if (condition1) {
expression1
else if (condition2) {
expression2
else {
expression3
}

举例

import scala.io.StdIn

object IfBranch01 {
  def main(args: Array[String]): Unit = {
  // 判断用户是否登录成功
    println("请输入用户名:")
    val name = StdIn.readLine()
    println("请输入密码:")
    val passwd = StdIn.readLine()
    if (name == "scala" && passwd == "12345678") {
      println("登录成功!欢迎来到学习乐园")
    }

    // 判断学员是否通过科目二考试
    println("请输入您的考试成绩:")
    val score = StdIn.readInt()
    if (score >= 90) {
      println("恭喜您,考试合格!")
    } else {
      println("很遗憾,下次继续努力哦!")
    }

    // 根据用户的年龄,判断其所处的年龄段
    println("请输入您的年龄:")
    val age = StdIn.readInt()
    if (age < 18){
      println("未成年")
    } else if (age <= 45) {
      println("青壮年")
    } else if (age <= 65) {
      println("中老年")
    } else {
      println("老年")
    }
  }
}

我们再举一个嵌套的例子,假设某旅游区在设置票价时,按照如下规则:如果游客在旺季(3~10月份)来此地旅游,并且他是学生,则票价为80元,否则为150元;如果在淡季,学生票价为50元,否则为100元。该如何利用嵌套的if分支来完成呢?代码如下:

object IfBranch02 {
  def main(args: Array[String]): Unit = {
    println("请输入月份:")
    val month = StdIn.readInt()
    println("请问是否为学生:")
    val is_student = StdIn.readLine()
    if (month >= 3 && month <= 10){
      if (is_student == "否") {
        println("您的票价是150元")
      } else {
        println("您的票价是80元")
      }
    } else {
      if (is_student == "否") {
        println("您的票价是100元")
      } else {
        println("您的票价是50元")
      }
    }
  }
}

for循环
for循环在某个迭代对象已知的情况下,执行的的重复性操作。语法如下:

for (i <- iterable) {
      expression
    }

举例

object ForLoop {
    def main(args: Array[String]): Unit = {
    // 统计1...100的所有偶数中,是3的倍数的个数,以及这些数的总和
    var counts = 0
    var sum = 0
    for (i <- 2 to 100 by 2) {
      if (i % 3 == 0) {
        counts += 1
        sum += i
      }
    }
    printf("1...100的偶数中,是3的倍数的个数为%d个\n", counts)
    printf("这些数值的总和为%d\n", sum)

    // 打印99乘法口诀
    for (i <- 1 to 9) {
      for (j <- 1 to i) {
        print(j + "*" + i + "=" + (i*j) + "\t")
      }
      println()
    }

    // 将列表中的每个元素做平方除以5的操作,并将运算结果保存到变量res中
    val X = List(10,8,23,17,7)
    val res = for (i <- X) yield {
      (i * i)/5.0
    }
    println("res = " + res)

   }
}

while循环
在前文介绍了for循环的使用,除此while循环也可以实现重复性操作。所不同的是,for循环主要解决已知可迭代对象的循环问题,而while循环则主要针对未知迭代对象的循环问题,语法如下:

// while循环的语法
初始化计数器
  while (condition) {
    expression
    计数器叠加
    }

// do...while的语法
初始化计数器
  do {
    expression
    计数器叠加
    }
   while (condition)

举例

import scala.io.StdIn
import scala.util.control.Breaks._

object WhileLoop {
    def main(args: Array[String]): Unit = {
    // 计算1...100的和
    var i = 1
    var sum = 0
    while (i <= 100) {
      sum += i
      i += 1
    }
    println("1...100的总和为:" + sum)

    // 用户登录邮箱,一共5次机会,如果输错则继续等待输入,并返回剩余登录次数
    breakable{
      var counts = 0
      while (true) {
        println("请输入用户名:")
        val user = StdIn.readLine()
        println("请输入密码:")
        val passwd = StdIn.readLine()

        if (user == "scala" && passwd == "123abc") {
          println("恭喜您,登录成功!")
          break()
        } else {
          if (counts < 4) {
            printf(s"输入的用户名或密码错误!您还剩${4 - counts}次输入机会!\n")
          } else {
            println("输入的用户名或密码错误!,请24小时之后再尝试!")
            break()
          }
        }
        counts += 1
      }
    }
  }
}

具有编程经验的你来说,通常在while循环中经常会用到break做强制退出,遗憾的是Scala中没有break关键词,只有break函数,该函数的目的是抛出异常,最终再由breakable函数处理。需要注意的是,break函数的调用需要导入import scala.util.control.Breaks._。

结语

每天进步一点点:数据分析1480

长按扫码关注我

以上是关于大数据之脚踏实地学13--Scala控制流的主要内容,如果未能解决你的问题,请参考以下文章

大数据之脚踏实地学15--Scala的数组操作

湖南美女学霸:专业第一保研清华,获国家级立项!

python中的3种控制流语句之while

大数据日志传输之Kafka实战教程

python学习之控制流1

每日一学数据仓库之全量表增量表拉链表流水表