广州番禺Python, Java小班周末班培训
第四期线下Java, Python小班周末班已经开课了,培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析, Java中高级工程师培训。授课详情请点击:http://chipscoco.com/?cate=6
6.1.1 理解条件控制
在日常生活中,我常喜欢说如果,“如果怎么样,那么就会怎么样”。“如果”表达的是一种假设情况,即在假设成立的情况下,会执行某种操作,在假设不成立的情况下,同样会执行某种操作。例如在以下的“如果”句式中:
如果明天天气晴朗,那我会去爬莲花山。
否则我会去街角的咖啡店喝一杯咖啡。
在以上句式中提出的假设为:
明天天气晴朗。
假设成立时所执行的操作:
爬莲花山。
假设不成立时所执行的操作:
喝咖啡。
这种以“如果”句式表达的一种逻辑结构,就是一种条件控制。条件控制的核心是先提出一个假设条件,如果条件成立就执行什么样的操作,如果条件不成立,就继续判断其它的条件。在编程语言中,也是通过“如果”来进行条件控制,其对应的关键词是“if”,if的中文释义正是“如果”。
6.1.2 if, else if, else
在Java中主要通过if, else if,else来进行条件控制。if的语法结构:
if (expression) { ; } else if (expression){ ; } else { ; }
if语句定义条件控制的主干,expression表达式,表达式的值须为布尔类型。如果表达式的值为真值,那么就执行相应的操作。else if用来定义分支条件,即在if语句中的条件不成立的情况下,继续判断else if语句中的条件是否成立。else表示if语句和else if语句中的条件都不成立的情况下,才执行的操作。在条件控制的语法结构中,必须有一个if,可以有多个else if,但最多只有1个else。
非法的条件控制结构:
if (expression){ ; } else if (expression){ ; } else { ; } else { ; }
在以上非法的条件控制结构中,存在多个else语句。else if语句必须在if语句的后面,else语句必须是控制结构中的最后一个语句。
非法的条件控制结构:
else if (expression){ ; } if (expression){ ; } else { ; } else if { ; }
存在多个if语句时,Python会将每一个if语句视为一个单独的条件控制结构:
if (expression){ // 这是一个单独的条件控制结构 } if (expression){ // 这是一个单独的条件控制结构 }
6.1.3 条件表达式
条件控制结构中的表达式的值必须为布尔类型,在5.5节学到了数据运算,其中关系运算和逻辑运算的输出都为布尔类型。
代码实例-判断随机数大小:
// 导入Random类来生成随机数 import java.util.Random; public class HelloJava{ public static void main(String[] args) { // 构造Random对象以获取随机数 Random random = new Random(); // 通过Random对象的nextInt方法来获取指定范围内的正随机数 // 获取[0,100)区间内的正随机数 int x = random.nextInt(100); int y = random.nextInt(100); System.out.println("x:"+x+" y:"+y); if (x > y) { System.out.println("x > y"); } else { System.out.println("x <= y"); } } }
在5.5节讲到了逻辑运算中的短路逻辑,短路逻辑是指进行逻辑运算时,一旦符合短路逻辑条件,就立即停止表达式后面的逻辑运算。举个简单的例子:
// 导入Random类来生成随机数 import java.util.Random; public class HelloJava{ public static void main(String[] args) { // 构造Random对象以获取随机数 Random random = new Random(); // 通过Random对象的nextInt方法来获取指定范围内的随机数 // 获取[0,100)之间的正随机数 int x = random.nextInt(100); int y = random.nextInt(100); // 如果x大于10,那么立即触发短路,不会再计算后面的表达式 if(x < 10 && x*y > 100) { System.out.println("y一定大于10"); }else if ( x >= 10) { System.out.println("y可能小于10"); }else { System.out.println("y一定小于10"); } } }
在以上代码中,if中的表达式为逻辑与运算,在逻辑与运算中只要一个为假,那么整个表达式的值就为假,所以当计算出x大于等于10时,就会触发短路,立即停止后面的逻辑运算,转而判断下一个分支条件。
6.1.4 条件控制可以嵌套
嵌套是指可以在条件控制结构里面再定义一层条件控制结构。
代码实例:
// 导入Random类来生成随机数 import java.util.Random; public class HelloJava{ public static void main(String[] args) { // 构造Random对象以获取随机数 Random random = new Random(); // 通过Random对象的nextInt方法来获取指定范围内的随机数 // 获取[0,100)之间的正随机数 int x = random.nextInt(100); int y = random.nextInt(100); // 判断x与y的积是否大于10 if(x*y > 100) { // 再嵌套一层if,来判断x是否小于10,如果x小于10,那么y一定大于10 if( x < 10){ System.out.println("y一定大于10"); } else { System.out.println("y可能大于10"); } } } }
if嵌套的深度不宜过深,通常保持在三层以内即可。层数过多会导致代码的可读性变差,代码逻辑难以理解,难以维护。
6.1.5 Java的三元运算
三元运算符是软件编程中的一种固定格式,在Java中,通过?:操作符来实现三元运算。三元运算的语法格式:
expression ? expression1: expression2
三元运算符的执行逻辑为:如果条件表达式expression的值为真,就返回表达式expression1的值,否则返回表达式expression2的值。使用三元运算符在特定场景下可以简化if语句的使用。未使用三元运算符的代码实例-计算两个随机数中的最大值:
// 导入Random类来生成随机数 import java.util.Random; public class HelloJava{ public static void main(String[] args) { // 构造Random对象以获取随机数 Random random = new Random(); // 通过Random对象的nextInt方法来获取指定范围内的随机数 // 获取[0,100)之间的正随机数 int x = random.nextInt(100); int y = random.nextInt(100); // 先假定x为最大值 int max = x; if(x < y) { // 如果x比y小,那么最大值一定是y max = y; } System.out.println("最大值是:"+max); } }
使用三元运算的代码实例-计算两个随机数中的最大值:
// 导入Random类来生成随机数 import java.util.Random; public class HelloJava{ public static void main(String[] args) { // 构造Random对象以获取随机数 Random random = new Random(); // 通过Random对象的nextInt方法来获取指定范围内的随机数 // 获取[0,100)之间的正随机数 int x = random.nextInt(100); int y = random.nextInt(100); // 如果x大于y,那么最大值就是x,否则是y int max = x > y ? x:y; System.out.println("最大值是:"+max); } }
这两则代码实例实现的是同样的效果,但使用三目运算符的代码看起来更简洁。在条件分支比较多的情况下,不适合使用三目运算符,读者需根据实际中的情况来灵活使用。
6.1.6 switch-case语句
switch -case也叫做开关语句,与if一样用作条件控制:根据不同的条件,执行不同的操作。switch-case的语法格式:
switch( expression ){ case constExpression: ; break; case constExpression: ; break; default: ; break; }
switch语句中的expression表达式必须输出整型,case语句中的constExpression表示常量表达式。Java在执行switch-case语句时,会按从上到下的顺序,将expression的值与case中的常量表达式进行匹配,直到匹配成功。
break语句用来停止继续往下进行匹配,即,如果不执行break,Java会继续判断下一个case中的常量表达式是否与expression的值匹配。
default用来定义所有case都不匹配的情况下才执行的操作。现在来写一个简单的程序,根据数字的奇偶性来做开关,一旦为偶数就输出芝麻开门,为奇数则输出芝麻关门,都不匹配就输出芝麻丢了:
import java.util.Random; public class HelloJava{ public static void main(String[] args) { Random random = new Random(); // 获取[0,10)之间的正随机数 int x = random.nextInt(10); switch( x % 2){ // 先计算x%2表达式的值,然后与case中的常量进行匹配 case 0: System.out.println("芝麻开门"); // 执行break会中止与下面case的匹配 break; case 1: System.out.println("芝麻关门"); break; default: System.out.println("芝麻丢了"); // 思考题:芝麻会丢吗? break; } } }
6.1.7 课后习题
(1) 谈谈你对条件控制的理解。
(2) 条件控制的核心是什么?
(3) 假设有三个随机数:x,y,z,请编写条件控制语句来输出变量中的最大值和最小值。
(4) 假设有四个随机数:x,y,z,k,请编写条件控制语句来输出变量中的次大值和次小值。
(5) 将问题(4)和问题(5)中的程序通过三元运算符进行实现
(6) 将6.1.6节中的程序改成用if结构来实现。