第4章:控制流对比
作为 Java 开发者,你已经熟悉了 Java 的控制流结构。Python 的控制流结构与 Java 有很多相似之处,但也有一些重要的区别。本章将详细对比两种语言的控制流结构。
4.1 if 语句
Java if 语句
if (condition) {
// 代码块
} else if (anotherCondition) {
// 代码块
} else {
// 代码块
}
Python if 语句
if condition:
# 代码块
elif another_condition:
# 代码块
else:
# 代码块
对比:
| 特性 | Java | Python |
|---|---|---|
| 条件表达式 | 必须用括号包围 | 不需要括号 |
| 代码块 | 使用大括号 {} | 使用缩进 |
| else if | 使用 else if 关键字 | 使用 elif 关键字 |
| 三元运算符 | condition ? value1 : value2 | value1 if condition else value2 |
Python if 语句示例:
# 基本 if 语句
age = 18
if age >= 18:
print("成年人")
else:
print("未成年人")
# if-elif-else 语句
grade = 85
if grade >= 90:
print("优秀")
elif grade >= 80:
print("良好")
elif grade >= 60:
print("及格")
else:
print("不及格")
# 三元运算符
status = "成年人" if age >= 18 else "未成年人"
print(status)
# 嵌套 if 语句
if age >= 18:
if age >= 60:
print("老年人")
else:
print("成年人")
else:
print("未成年人")
4.2 循环结构
Java 循环
for循环:用于已知次数的循环while循环:用于未知次数的循环do-while循环:至少执行一次的循环
Python 循环
for循环:用于遍历可迭代对象while循环:用于未知次数的循环- 没有
do-while循环
对比:
| 循环类型 | Java | Python |
|---|---|---|
| for 循环 | for (int i = 0; i < 10; i++) | for i in range(10) |
| 增强 for 循环 | for (String s : list) | for s in list |
| while 循环 | 相同语法 | 相同语法 |
| do-while 循环 | 有 | 无 |
| 循环控制 | break, continue | break, continue |
for 循环
Java for 循环:
// 基本 for 循环
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
// 增强 for 循环
String[] fruits = {"apple", "banana", "cherry"};
for (String fruit : fruits) {
System.out.println(fruit);
}
Python for 循环:
# 基本 for 循环(使用 range)
for i in range(10):
print(i)
# 遍历列表
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
# 遍历字符串
for char in "hello":
print(char)
# 遍历字典
person = {"name": "Alice", "age": 25, "city": "New York"}
for key in person:
print(key, person[key])
for key, value in person.items():
print(key, value)
# 带索引的遍历
for index, fruit in enumerate(fruits):
print(index, fruit)
while 循环
Java while 循环:
int i = 0;
while (i < 10) {
System.out.println(i);
i++;
}
// do-while 循环
int j = 0;
do {
System.out.println(j);
j++;
} while (j < 10);
Python while 循环:
# while 循环
i = 0
while i < 10:
print(i)
i += 1
# 模拟 do-while 循环
j = 0
while True:
print(j)
j += 1
if j >= 10:
break
4.3 循环控制语句
Java 循环控制
break:跳出当前循环continue:跳过当前循环的剩余部分,继续下一次循环return:从方法中返回
Python 循环控制
break:跳出当前循环continue:跳过当前循环的剩余部分,继续下一次循环return:从函数中返回else子句:循环正常结束时执行
对比:
| 控制语句 | Java | Python |
|---|---|---|
| break | 相同 | 相同 |
| continue | 相同 | 相同 |
| return | 相同 | 相同 |
| 循环 else | 无 | 有 |
Python 循环 else 示例:
# for 循环 with else
for i in range(5):
print(i)
else:
print("循环正常结束")
# while 循环 with else
i = 0
while i < 5:
print(i)
i += 1
else:
print("循环正常结束")
# 循环被 break 中断,else 不执行
for i in range(5):
if i == 3:
break
print(i)
else:
print("循环正常结束") # 不会执行
4.4 switch 语句
Java switch 语句
int day = 3;
String dayName;
switch (day) {
case 1:
dayName = "Monday";
break;
case 2:
dayName = "Tuesday";
break;
case 3:
dayName = "Wednesday";
break;
default:
dayName = "Invalid day";
}
System.out.println(dayName);
Python 中的替代方案
Python 3.10+ 引入了 match 语句,之前的版本可以使用字典或 if-elif 链。
Python 3.10+ match 语句:
day = 3
match day:
case 1:
day_name = "Monday"
case 2:
day_name = "Tuesday"
case 3:
day_name = "Wednesday"
case _:
day_name = "Invalid day"
print(day_name)
Python 字典替代方案:
day = 3
day_names = {
1: "Monday",
2: "Tuesday",
3: "Wednesday"
}
day_name = day_names.get(day, "Invalid day")
print(day_name)
Python if-elif 链:
day = 3
if day == 1:
day_name = "Monday"
elif day == 2:
day_name = "Tuesday"
elif day == 3:
day_name = "Wednesday"
else:
day_name = "Invalid day"
print(day_name)
4.5 异常处理中的控制流
Java 异常处理
try {
// 可能抛出异常的代码
} catch (Exception e) {
// 异常处理
} finally {
// 无论是否异常都会执行的代码
}
Python 异常处理
try:
# 可能抛出异常的代码
except Exception as e:
# 异常处理
finally:
# 无论是否异常都会执行的代码
对比:
| 特性 | Java | Python |
|---|---|---|
| try 块 | 相同 | 相同 |
| catch 块 | catch (Exception e) | except Exception as e |
| finally 块 | 相同 | 相同 |
| 多个 catch | 多个 catch 块 | 多个 except 块 |
| 异常类型 | 检查型和非检查型 | 都是运行时异常 |
| raise 异常 | throw new Exception() | raise Exception() |
Python 异常处理示例:
try:
x = int(input("Enter a number: "))
y = 10 / x
print(f"Result: {y}")
except ValueError:
print("Please enter a valid number")
except ZeroDivisionError:
print("Cannot divide by zero")
except Exception as e:
print(f"An error occurred: {e}")
finally:
print("Execution completed")
4.6 条件表达式和布尔运算
Java 条件表达式
// 三元运算符
int max = (a > b) ? a : b;
// 逻辑运算
boolean result = (a > 0) && (b < 10);
Python 条件表达式
# 三元运算符
max_value = a if a > b else b
# 逻辑运算
result = (a > 0) and (b < 10)
# 更灵活的布尔运算
# Python 支持短路求值
result = a > 0 and b < 10 and c != 0
# 链式比较
x = 5
print(1 < x < 10) # True
4.7 列表推导式和生成器表达式
Python 提供了列表推导式和生成器表达式,这是 Java 中没有的特性。
列表推导式:
# 基本列表推导式
squares = [x**2 for x in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 带条件的列表推导式
even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(even_squares) # [0, 4, 16, 36, 64]
# 嵌套列表推导式
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
print(flattened) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
生成器表达式:
# 生成器表达式(使用圆括号)
squares_gen = (x**2 for x in range(10))
for square in squares_gen:
print(square)
# 生成器表达式更节省内存
# 适合处理大量数据
4.8 常见控制流模式
Java 常见模式
- 计数循环:
for (int i = 0; i < n; i++) - 遍历数组/集合:增强 for 循环
- 无限循环:
while (true) - 条件分支:if-else 链
Python 常见模式
- 计数循环:
for i in range(n) - 遍历可迭代对象:
for item in iterable - 无限循环:
while True - 条件分支:if-elif-else 链
- 列表推导式:
[expression for item in iterable if condition] - 字典推导式:
{key: value for item in iterable}
4.9 练习
- if 语句练习:编写程序,根据用户输入的分数,输出对应的等级(优秀、良好、及格、不及格)
- for 循环练习:编写程序,打印 1 到 100 之间的所有偶数
- while 循环练习:编写程序,计算 1 到 100 的和
- 循环控制练习:编写程序,找到第一个大于 1000 的斐波那契数
- 列表推导式练习:使用列表推导式生成 1 到 100 之间的所有质数
- 异常处理练习:编写程序,处理用户输入的非数字情况
4.10 小结
- Python 的 if 语句使用
elif而不是else if - Python 的 for 循环更灵活,直接遍历可迭代对象
- Python 没有 do-while 循环,但可以用 while True 模拟
- Python 的循环支持 else 子句,在循环正常结束时执行
- Python 3.10+ 引入了 match 语句,类似 Java 的 switch
- Python 支持列表推导式和生成器表达式,更简洁高效
- Python 的布尔运算更灵活,支持链式比较
- Python 的异常处理语法与 Java 类似,但更简洁
通过本章的学习,你已经了解了 Java 和 Python 在控制流结构上的主要区别。接下来,我们将学习 Python 的函数与方法。