Skip to content

Python vs. JavaScript: 控制流对比指南 (分支与循环)

本文档旨在为熟悉其中一种语言的开发者详细梳理 Python 和 JavaScript 在分支(条件判断)和循环(迭代)语句上的语法和设计哲学差异。

参考资料:


核心语法差异速览

特性 (Feature)PythonJavaScript
条件括号不需要 ()必须使用 ()
代码块冒号 : 配合强制缩进花括号 {}
多路分支关键字elifelse if
集合遍历循环for item in iterable:for (let item of iterable) (for values)
对象属性遍历循环for key in dict:for (let key in object) (for keys/properties)
循环后 else支持 (for/while...else)不支持
三元运算符val_true if condition else val_falsecondition ? val_true : val_false

1. 分支语句 (Conditional Statements)

分支语句允许程序根据不同的条件执行不同的代码路径。

if...else 结构

这是最基础的条件判断。

Python:

python
x = 10
if x > 5:
    print("x is greater than 5") # 依赖冒号和缩进
else:
    print("x is not greater than 5")

JavaScript:

javascript
let x = 10;
if (x > 5) {
  console.log("x is greater than 5"); // 依赖括号和花括号
} else {
  console.log("x is not greater than 5");
}

if...elif...else 多路分支

当有多个互斥的条件需要判断时使用。

Python: 使用 elif 关键字,保持代码的垂直对齐。

python
grade = 85
if grade >= 90:
    print("A")
elif grade >= 80: # 注意是 elif
    print("B")
elif grade >= 70:
    print("C")
else:
    print("D")

JavaScript: 使用 else if 关键字,可能会导致代码块的嵌套。

javascript
let grade = 85;
if (grade >= 90) {
  console.log("A");
} else if (grade >= 80) { // 注意是 else if
  console.log("B");
} else if (grade >= 70) {
  console.log("C");
} else {
  console.log("D");
}

三元运算符 (Ternary Operator)

用于在一行内完成简单的条件赋值。

Python: 语法更接近自然语言,将条件放在中间。

python
age = 20
status = "adult" if age >= 18 else "minor"
print(status) # -> "adult"

JavaScript: 沿用 C 风格的 ? : 语法。

javascript
let age = 20;
let status = age >= 18 ? "adult" : "minor";
console.log(status); // -> "adult"

2. 循环语句 (Looping Statements)

循环用于重复执行一段代码。

while 循环

当循环条件为真时,重复执行代码块。两者语法差异与 if 语句类似。

Python:

python
count = 0
while count < 3:
    print(count)
    count += 1

JavaScript:

javascript
let count = 0;
while (count < 3) {
  console.log(count);
  count++;
}

for 循环 - 遍历集合

这是两种语言差异最显著的地方之一。

Python: Python 使用统一的 for...in... 语法来遍历任何可迭代对象(列表、元组、字典、集合、字符串等)。

python
# 遍历列表
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print(fruit)

# 遍历字典 (默认遍历键)
my_dict = {"a": 1, "b": 2}
for key in my_dict:
    print(f"Key: {key}, Value: {my_dict[key]}")

# 更优雅地遍历字典的键值对
for key, value in my_dict.items():
    print(f"Key: {key}, Value: {value}")

JavaScript: JavaScript 提供了两种不同的 for 循环来应对不同场景。

  1. for...of (推荐用于遍历值): 这是 Python for...in 最直接的对应物,用于遍历可迭代对象(如数组、字符串、Set)的

    javascript
    // 遍历数组
    const fruits = ["apple", "banana", "cherry"];
    for (const fruit of fruits) {
      console.log(fruit);
    }
  2. for...in (用于遍历对象的属性): 此循环用于遍历一个对象的(属性名)。不推荐用它来遍历数组,因为它会遍历原型链上的属性,且不保证顺序。

    javascript
    // 遍历对象
    const myObject = { a: 1, b: 2 };
    for (const key in myObject) {
      console.log(`Key: ${key}, Value: ${myObject[key]}`);
    }

for 循环 - 按范围/索引迭代

Python: Python 没有 C 风格的 for 循环,而是使用 range() 函数生成一个数字序列,然后用 for...in 遍历它。

python
# 循环 5 次 (0 到 4)
for i in range(5):
    print(i)

# 从 2 到 5 (不包括 6)
for i in range(2, 6):
    print(i)

JavaScript: 使用经典的、从 C 语言继承的 for 循环语法。

javascript
// 循环 5 次 (0 到 4)
for (let i = 0; i < 5; i++) {
  console.log(i);
}

// 从 2 到 5
for (let i = 2; i <= 5; i++) {
  console.log(i);
}

3. 循环控制与特殊语法

breakcontinue

这两个关键字在 Python 和 JavaScript 中的功能和用法完全相同

  • break: 立即终止并退出整个循环。
  • continue: 立即结束当前这次迭代,并进入下一次迭代。
python
# Python 示例
for i in range(5):
    if i == 3:
        break # 当 i=3 时退出循环
    print(i) # 输出 0, 1, 2
javascript
// JavaScript 示例
for (let i = 0; i < 5; i++) {
  if (i === 2) {
    continue; // 当 i=2 时跳过本次迭代
  }
  console.log(i); // 输出 0, 1, 3, 4
}

循环的 else 子句 (Python 独有)

这是一个非常独特且强大的 Python 特性,JavaScript 中没有对应物。forwhile 循环可以带有一个 else 子句,该子句在循环正常执行完毕(即没有被 break 语句中断)时执行。

这在实现"搜索"逻辑时特别有用:如果找到了就 break,如果循环跑完了都没找到,else 部分就会执行。

python
# 示例:在一个列表中查找一个数字
my_list = [1, 2, 3, 4, 5]
num_to_find = 6

for num in my_list:
    if num == num_to_find:
        print(f"找到了数字: {num_to_find}")
        break
else:
    # 只有当上面的 for 循环没有被 break 时才会执行
    print(f"列表中没有找到数字: {num_to_find}")

# 输出: "列表中没有找到数字: 6"

核心对比

  • 语法简洁性: Python 通过强制缩进和省略括号,使得代码在视觉上更简洁、更少符号噪音。
  • 设计哲学: Python 倾向于提供一种统一、通用的工具(如 for...in 遍历一切),而 JavaScript 则提供了更多特定场景下的工具(for...of vs for...in vs C-style for)。
  • 独有特性: Python 的循环 else 子句为特定算法模式提供了优雅的语法糖,体现了其"电量充足"(Batteries Included)的设计理念。

4. Python 的缩进规则:代码块的基石

与 JavaScript 使用花括号 {} 来定义代码块不同,Python 使用缩进来达到同样的目的。这是 Python 最具标志性的特征之一,也是初学者最需要适应的地方。

核心规则

  1. 代码块的开始: 一个新的代码块通常在一个以冒号 (:) 结尾的语句之后开始,例如 if, elif, else, for, while, def, class
  2. 统一的缩进层级: 同一个代码块内的所有语句行都必须有相同数量的前导空白(即相同的缩进级别)。
  3. 缩进的媒介: 可以使用空格或制表符 (Tab) 进行缩进,但绝对不能混用。在一个项目中坚持使用同一种风格至关重要。
  4. PEP 8 规范: Python 官方的风格指南 (PEP 8) 强烈推荐使用 4个空格 作为一级缩进。绝大多数 Python 开发者和工具都遵循此规范。
  5. 代码块的结束: 当一行代码的缩进恢复到上一级时,表示当前的代码块已经结束。

示例解析

下面的代码展示了多层嵌套下的缩进规则:

python
for i in range(5):
    print(f"外层循环, i = {i}") # 第一层缩进 (4个空格)
    
    if i % 2 == 0:
        print(f"  i ({i}) 是一个偶数") # 第二层缩进 (8个空格)
        
        if i == 0:
            print("    i 是 0") # 第三层缩进 (12个空格)
            
        print("  偶数判断结束") # 回到第二层缩进
        
    print(f"i={i} 的处理结束") # 回到第一层缩进

print("循环结束") # 顶层代码,无缩进

与 JavaScript 的根本区别

  • Python: 空白 (whitespace) 是有语法意义的。错误的缩进会导致 IndentationError,程序无法运行。
  • JavaScript: 空白没有语法意义,仅用于提升代码的可读性。代码块完全由 {} 界定,缩进风格不影响程序的执行。