Python 循环控制语句

10 天前

Python 循环控制语句

Python 循环控制语句

1. continue - 跳过本次循环

作用:跳过当前迭代的剩余代码,直接进入下一次循环

基本示例

for i in range(5):
    if i == 2:
        continue  # 跳过 i=2 这次循环
    print(i)

# 输出: 0, 1, 3, 4 (跳过了2)

在你的代码中

for bus_str, qubits in bus_qubits_map.items():
    if self._check_skip_allocation(qubits):
        pyqlog.info(f"Bus {bus_str}: Skip allocation")
        continue  # 跳过这个bus的分配,直接处理下一个bus
    
    # 下面的分配代码不会执行
    probe_power_list = []
    # ... 后续分配逻辑

执行流程

  • 如果条件满足 → 打印日志 → continue → 跳到 for 开始处理下一个 bus
  • 如果条件不满足 → 继续执行下面的分配代码

2. break - 完全退出循环

作用:立即终止整个循环,不再执行任何迭代

基本示例

for i in range(10):
    if i == 5:
        break  # 遇到5就停止整个循环
    print(i)

# 输出: 0, 1, 2, 3, 4 (到5就停止了)

实际应用场景

# 查找第一个满足条件的元素
for qubit in qubits:
    if qubit.probe_power > -20:
        print(f"找到: {qubit.name}")
        break  # 找到就停止,不再继续找
    print(f"检查: {qubit.name}")

# 如果第2个qubit满足条件,后面的qubit都不会检查

3. continue vs break 对比

# continue: 跳过本次,继续下一次
for i in range(5):
    if i == 2:
        continue
    print(i)
# 输出: 0, 1, 3, 4

# break: 彻底结束循环
for i in range(5):
    if i == 2:
        break
    print(i)
# 输出: 0, 1
语句 作用 循环是否继续
continue 跳过本次迭代的剩余代码 ✅ 继续下一次迭代
break 终止整个循环 ❌ 立即退出

4. 嵌套循环中的表现

continue 只影响最内层循环

for i in range(3):
    for j in range(3):
        if j == 1:
            continue  # 只跳过内层的 j=1
        print(f"i={i}, j={j}")

# 输出:
# i=0, j=0
# i=0, j=2
# i=1, j=0
# i=1, j=2
# i=2, j=0
# i=2, j=2

break 只退出最内层循环

for i in range(3):
    for j in range(3):
        if j == 1:
            break  # 只退出内层循环
        print(f"i={i}, j={j}")
    print(f"外层 i={i} 继续")

# 输出:
# i=0, j=0
# 外层 i=0 继续
# i=1, j=0
# 外层 i=1 继续
# i=2, j=0
# 外层 i=2 继续

5. 其他跳出循环的方式

5.1 return - 退出整个函数

def find_qubit(qubits, target_power):
    for qubit in qubits:
        if qubit.probe_power == target_power:
            return qubit  # 找到就立即返回,函数结束
    return None  # 没找到

# return 会:
# 1. 退出循环
# 2. 退出函数
# 3. 返回值

5.2 异常处理

try:
    for i in range(100):
        if i == 10:
            raise StopIteration  # 抛出异常来停止
        print(i)
except StopIteration:
    print("循环被异常终止")

5.3 循环标志变量

found = False
for bus_str, qubits in bus_qubits_map.items():
    for qubit in qubits:
        if qubit.probe_power > threshold:
            found = True
            break  # 退出内层循环
    if found:
        break  # 退出外层循环

5.4 else 子句(特殊用法)

for i in range(5):
    if i == 10:
        break
    print(i)
else:
    # 只有循环正常结束(没有break)才会执行
    print("循环正常完成")

# 输出: 0, 1, 2, 3, 4, "循环正常完成"

6. 在你的代码中的最佳实践

def _divide_same_bus_read_amp(self):
    bus_qubits_map = defaultdict(list)
    for qubit in self.run_options.pass_unit_objs:
        bus_qubits_map[str(qubit.inst.bus)].append(qubit)

    for bus_str, qubits in bus_qubits_map.items():
        # 早期退出模式 - 使用 continue
        if self._check_skip_allocation(qubits):
            pyqlog.info(f"Bus {bus_str}: Skip allocation")
            continue  # ✅ 清晰表达"跳过这个bus"
        
        # 只有不满足条件的bus才会执行下面的代码
        # ... 复杂的分配逻辑

为什么用 continue 而不是 break

  • continue:处理完这个bus,继续处理其他bus
  • break:只处理第一个不满足条件的bus,后面的都不处理了

7. 性能提示

避免不必要的循环

# ❌ 不好的写法
skip = False
if condition:
    skip = True

if not skip:
    # 大量代码...

# ✅ 好的写法
if condition:
    continue  # 或 return

# 大量代码...

合理使用可以提高可读性

# ❌ 难读
for item in items:
    if not should_skip(item):
        if is_valid(item):
            if has_permission(item):
                process(item)

# ✅ 清晰
for item in items:
    if should_skip(item):
        continue
    if not is_valid(item):
        continue
    if not has_permission(item):
        continue
    
    process(item)  # 主要逻辑

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...