跳到主要内容

第4章:控制流对比

作为 Java 开发者,你已经熟悉了 Java 的控制流结构。Python 的控制流结构与 Java 有很多相似之处,但也有一些重要的区别。本章将详细对比两种语言的控制流结构。

4.1 if 语句

Java if 语句

if (condition) {
// 代码块
} else if (anotherCondition) {
// 代码块
} else {
// 代码块
}

Python if 语句

if condition:
# 代码块
elif another_condition:
# 代码块
else:
# 代码块

对比

特性JavaPython
条件表达式必须用括号包围不需要括号
代码块使用大括号 {}使用缩进
else if使用 else if 关键字使用 elif 关键字
三元运算符condition ? value1 : value2value1 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 循环

对比

循环类型JavaPython
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, continuebreak, 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 子句:循环正常结束时执行

对比

控制语句JavaPython
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:
# 无论是否异常都会执行的代码

对比

特性JavaPython
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 练习

  1. if 语句练习:编写程序,根据用户输入的分数,输出对应的等级(优秀、良好、及格、不及格)
  2. for 循环练习:编写程序,打印 1 到 100 之间的所有偶数
  3. while 循环练习:编写程序,计算 1 到 100 的和
  4. 循环控制练习:编写程序,找到第一个大于 1000 的斐波那契数
  5. 列表推导式练习:使用列表推导式生成 1 到 100 之间的所有质数
  6. 异常处理练习:编写程序,处理用户输入的非数字情况

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 的函数与方法。