一、基本循環結構對比
Rust 循環類型
// 1. loop - 無限循環
let mut count = 0;
loop {count += 1;if count >= 5 {break;}
}// 2. while - 條件循環
let mut number = 3;
while number != 0 {println!("{}!", number);number -= 1;
}// 3. for - 迭代循環
for i in 0..5 { // 范圍 0-4println!("i = {}", i);
}
Python 循環類型
# 1. while - 條件循環
count = 0
while count < 5:print(count)count += 1# 2. for - 迭代循環
for i in range(5): # 范圍 0-4print(f"i = {i}")# 3. 沒有專門的無限循環語法,但可以用 while True
while True:break # 立即退出
二、范圍迭代對比
Rust 范圍迭代
// 基本范圍
for i in 0..5 { // 0, 1, 2, 3, 4println!("{}", i);
}for i in 0..=5 { // 0, 1, 2, 3, 4, 5println!("{}", i);
}// 反向迭代
for i in (0..5).rev() { // 4, 3, 2, 1, 0println!("{}", i);
}// 帶步長
for i in (0..10).step_by(2) { // 0, 2, 4, 6, 8println!("{}", i);
}
Python 范圍迭代
# 基本范圍
for i in range(5): // 0, 1, 2, 3, 4print(i)for i in range(0, 6): // 0, 1, 2, 3, 4, 5print(i)# 反向迭代
for i in range(4, -1, -1): // 4, 3, 2, 1, 0print(i)# 帶步長
for i in range(0, 10, 2): // 0, 2, 4, 6, 8print(i)
三、集合迭代對比
Rust 集合迭代
let numbers = vec![1, 2, 3, 4, 5];// 值迭代(移動所有權)
for num in numbers { // numbers 所有權被移動println!("{}", num);
}
// println!("{:?}", numbers); // 錯誤!numbers 已移動// 引用迭代
let numbers2 = vec![1, 2, 3, 4, 5];
for num in &numbers2 { // 借用println!("{}", num);
}
println!("{:?}", numbers2); // 正常// 可變引用迭代
let mut numbers3 = vec![1, 2, 3];
for num in &mut numbers3 { // 可變借用*num *= 2;
}
println!("{:?}", numbers3); // [2, 4, 6]// 索引和值
for (index, value) in numbers2.iter().enumerate() {println!("Index: {}, Value: {}", index, value);
}
Python 集合迭代
numbers = [1, 2, 3, 4, 5]# 值迭代
for num in numbers:print(num)
print(numbers) # 列表仍然可用# 索引和值
for index, value in enumerate(numbers):print(f"Index: {index}, Value: {value}")# 字典迭代
person = {"name": "Alice", "age": 25}
for key, value in person.items():print(f"{key}: {value}")# 同時迭代多個序列
names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]
for name, age in zip(names, ages):print(f"{name} is {age} years old")
四、循環控制語句對比
break 語句對比
Rust break 語句
// 基本 break - 退出當前循環
for i in 0..10 {if i == 5 {break; // 退出循環}println!("{}", i); // 輸出 0, 1, 2, 3, 4
}// break 返回值(Rust 特有)
let result = loop {let mut input = String::new();std::io::stdin().read_line(&mut input).unwrap();if input.trim() == "quit" {break "User quit"; // 返回字符串}println!("You entered: {}", input.trim());
};
println!("Result: {}", result);// 標簽 break - 退出指定循環(Rust 特有)
'outer: for i in 0..3 {'inner: for j in 0..3 {if i * j == 4 {break 'outer; // 跳出外層循環}println!("i={}, j={}", i, j);}
}
Python break 語句
# break - 退出循環
for i in range(10):if i == 5:break # 退出循環print(i)# 沒有 break 返回值功能
# 但可以用變量在循環外存儲結果
result = None
while True:user_input = input("Enter something: ")if user_input == "quit":result = "User quit"breakprint(f"You entered: {user_input}")
print(f"Result: {result}")# Python 沒有標簽 break,但可以用標志變量
break_outer = False
for i in range(3):for j in range(3):if i == 1 and j == 1:break_outer = Truebreak # 退出內層循環print(f"i={i}, j={j}")if break_outer:break # 退出外層循環
continue 語句對比
Rust continue 語句
// continue - 跳過當前迭代
for i in 0..5 {if i % 2 == 0 {continue; // 跳過偶數}println!("{}", i); // 只打印 1, 3
}// 標簽 continue - 跳到指定循環的下一次迭代(Rust 特有)
'outer: for i in 0..3 {'inner: for j in 0..3 {if j == 1 {continue 'outer; // 直接跳到外層循環的下一次}println!("i={}, j={}", i, j);}
}
Python continue 語句
# continue - 跳過當前迭代
for i in range(5):if i % 2 == 0:continue # 跳過偶數print(i) # 只打印 1, 3# Python 沒有標簽 continue,但可以用嵌套函數或其他邏輯
def process_number(i):for j in range(3):if j == 1:return # 相當于 continue outerprint(f"i={i}, j={j}")for i in range(3):process_number(i)
Python 特有的 else 子句
Python for-else 語句
# for-else: 循環正常完成時執行 else
numbers = [1, 2, 3, 4, 5]
for num in numbers:if num == 6:print("找到6!")break
else:print("沒有找到6!") # 會執行,因為循環正常結束# for-else 在找到元素時退出
for num in numbers:if num == 3:print("找到3!")break
else:print("沒有找到3!") # 不會執行,因為break退出了# 實用場景:檢查是否找到元素
def find_number(target, numbers):for num in numbers:if num == target:print(f"找到 {target}!")breakelse:print(f"沒有找到 {target}!")find_number(3, [1, 2, 3, 4]) # 找到 3!
find_number(6, [1, 2, 3, 4]) # 沒有找到 6!
Python while-else 語句
# while-else: 循環條件為假時執行 else
count = 0
while count < 3:print(f"Count: {count}")count += 1
else:print("循環正常結束!") # 會執行# while-else 在 break 時跳過 else
count = 0
while count < 3:if count == 1:print("提前退出!")breakprint(f"Count: {count}")count += 1
else:print("這不會執行!") # 不會執行
五、迭代器和生成器對比
Rust 迭代器
// 鏈式迭代器操作
let numbers = vec![1, 2, 3, 4, 5];let result: Vec<i32> = numbers.iter().map(|x| x * 2) // 每個元素乘2.filter(|x| x > &5) // 過濾大于5的元素.take(2) // 取前2個.cloned() // 解引用.collect(); // 收集為Vecprintln!("{:?}", result); // [6, 8]// 自定義迭代器
struct Counter {count: u32,
}impl Counter {fn new() -> Counter {Counter { count: 0 }}
}impl Iterator for Counter {type Item = u32;fn next(&mut self) -> Option<Self::Item> {if self.count < 5 {self.count += 1;Some(self.count)} else {None}}
}for num in Counter::new() {println!("{}", num); // 1, 2, 3, 4, 5
}
Python 迭代器和生成器
# 生成器表達式
numbers = [1, 2, 3, 4, 5]
result = list(x * 2 for x in numbers if x * 2 > 5)[:2]
print(result) # [6, 8]# 生成器函數
def counter():count = 0while count < 5:count += 1yield countfor num in counter():print(num) # 1, 2, 3, 4, 5# 內置迭代器函數
numbers = [1, 2, 3, 4, 5]
doubled = map(lambda x: x * 2, numbers)
filtered = filter(lambda x: x > 5, doubled)
result = list(filtered)[:2]
print(result) # [6, 8]
六、性能優化對比
Rust 性能優化
// 使用迭代器避免邊界檢查
let numbers = vec![1, 2, 3, 4, 5];// 傳統for循環(有邊界檢查)
for i in 0..numbers.len() {println!("{}", numbers[i]); // 運行時邊界檢查
}// 迭代器(無邊界檢查)
for num in &numbers {println!("{}", num); // 安全且高效
}// 使用 while let 處理迭代器
let mut iter = numbers.iter();
while let Some(num) = iter.next() {println!("{}", num);
}
Python 性能優化
# 使用列表推導式
numbers = [1, 2, 3, 4, 5]# 傳統循環
result = []
for x in numbers:if x % 2 == 0:result.append(x * 2)
print(result)# 列表推導式(更快)
result = [x * 2 for x in numbers if x % 2 == 0]
print(result)# 使用內置函數
numbers = [1, 2, 3, 4, 5]
result = list(map(lambda x: x * 2, filter(lambda x: x % 2 == 0, numbers)))
print(result)
七、錯誤處理模式
Rust 循環中的錯誤處理
// Result 處理
let results = vec![Ok(1), Err("error"), Ok(3)];for result in results {match result {Ok(value) => println!("Success: {}", value),Err(error) => println!("Error: {}", error),}
}// 使用 ? 操作符傳播錯誤
fn process_numbers(numbers: &[i32]) -> Result<(), &'static str> {for &num in numbers {if num < 0 {return Err("Negative number found");}println!("Processing: {}", num);}Ok(())
}
Python 循環中的錯誤處理
# try-except 在循環中
numbers = [1, -2, 3, 4, 5]for num in numbers:try:if num < 0:raise ValueError("Negative number")print(f"Processing: {num}")except ValueError as e:print(f"Error: {e}")# break # 可以選擇退出循環# 使用 else 子句處理無錯誤情況
for i in range(3):try:result = 10 / i # i=0 時會除零錯誤except ZeroDivisionError:print("除零錯誤,跳過")continueelse:print(f"結果: {result}") # 只在無異常時執行
八、實用模式對比
Rust 實用模式
// 查找元素
let numbers = vec![1, 2, 3, 4, 5];
if let Some(found) = numbers.iter().find(|&&x| x == 3) {println!("Found: {}", found);
}// 所有元素滿足條件
let all_positive = numbers.iter().all(|&x| x > 0);
println!("All positive: {}", all_positive);// 任何元素滿足條件
let has_even = numbers.iter().any(|&x| x % 2 == 0);
println!("Has even: {}", has_even);// 折疊/reduce
let sum: i32 = numbers.iter().sum();
let product = numbers.iter().fold(1, |acc, &x| acc * x);
println!("Sum: {}, Product: {}", sum, product);
Python 實用模式
# 查找元素
numbers = [1, 2, 3, 4, 5]
found = next((x for x in numbers if x == 3), None)
if found is not None:print(f"Found: {found}")# 所有元素滿足條件
all_positive = all(x > 0 for x in numbers)
print(f"All positive: {all_positive}")# 任何元素滿足條件
has_even = any(x % 2 == 0 for x in numbers)
print(f"Has even: {has_even}")# 折疊/reduce
from functools import reduce
sum_result = sum(numbers)
product = reduce(lambda acc, x: acc * x, numbers, 1)
print(f"Sum: {sum_result}, Product: {product}")
九、綜合使用示例
Rust 循環控制綜合示例
// 查找第一個滿足條件的元素
let numbers = vec![1, 2, 3, 4, 5];
let mut found = None;'search: for &num in &numbers {if num > 3 {found = Some(num);break 'search; // 找到后立即退出}
}match found {Some(n) => println!("找到第一個大于3的數: {}", n),None => println!("沒有找到大于3的數"),
}// 使用 loop + break 實現重試機制
let mut attempts = 0;
let result = loop {attempts += 1;if attempts > 3 {break Err("超過最大重試次數");}// 模擬可能失敗的操作let success = attempts == 2;if success {break Ok("操作成功");}println!("第{}次嘗試失敗", attempts);
};
Python 循環控制綜合示例
# 使用 for-else 實現查找
numbers = [1, 2, 3, 4, 5]for num in numbers:if num > 3:print(f"找到第一個大于3的數: {num}")break
else:print("沒有找到大于3的數")# 使用 for-else 實現重試機制
max_attempts = 3
for attempt in range(1, max_attempts + 1):# 模擬可能失敗的操作success = attempt == 2if success:print(f"第{attempt}次嘗試成功!")breakprint(f"第{attempt}次嘗試失敗")
else:print("所有嘗試都失敗了!")
十、總結對比
特性 | Rust 🦀 | Python 🐍 |
---|---|---|
循環類型 | loop , while , for | while , for |
無限循環 | loop {} | while True: |
范圍語法 | 0..5 , 0..=5 | range(5) , range(0, 6) |
break 返回值 | 支持 | 不支持 |
標簽控制 | 支持 break/continue | 不支持 |
else 子句 | 無 | 有(for-else, while-else) |
所有權 | 嚴格的所有權規則 | 無所有權概念 |
迭代器 | 零成本抽象,編譯時優化 | 運行時生成器 |
性能 | 接近原生性能 | 有解釋器開銷 |
錯誤處理 | Result 類型,編譯時檢查 | try-except ,運行時 |
靈活性 | 相對嚴格,類型安全 | 非常靈活,動態類型 |
關鍵差異總結:
- Rust 有專門的
loop
關鍵字,Python 用while True
- Rust 的 break 可以返回值,Python 的 break 不能
- Rust 支持標簽 break/continue,Python 不支持
- Python 有獨特的 else 子句,Rust 沒有對應功能
- Rust 的范圍包含/排除語法更直觀
- Rust 的迭代器是零成本抽象,Python 的生成器更靈活
- Rust 嚴格處理所有權,Python 無此概念
- Rust 編譯時優化循環,Python 運行時解釋
選擇建議:
- 選擇 Rust:需要高性能、內存安全、系統級編程、精細循環控制
- 選擇 Python:需要快速開發、腳本編寫、數據處理、靈活的條件判斷
適用場景:
- Rust:系統編程、高性能應用、需要內存安全的場景
- Python:數據分析、機器學習、Web開發、快速原型開發