Цикл for-else в Python
В Python,forу цикла может бытьelseветвь else, которая является синтаксисом, специфичным для Python, в отличие от большинства других языков программирования.
for-elseСтруктура: когда цикл завершается нормально (т. е. неbreakпрерывается с помощью break), выполняетсяelseкод в ветви else.
Значение слова: elseelse означает "другое"; здесь оно означает "обработка после нормального завершения цикла".
Базовый синтаксис и параметры
Формат синтаксиса
for 变量 in 可迭代对象:
循环体
else:
循环正常结束时的处理
Логика выполнения
- Нормальное завершение: после того как цикл переберёт все элементы, выполняется ветвь else.
- Завершение с помощью break: если цикл прерывается с помощью break, ветвь else не выполняется.
- Аварийное завершение: если в цикле возникает исключение, else также не выполняется.
Примеры
Пример 1: базовое использование - выполнение при неудачном поиске
Пример
numbers = [1, 3, 5, 7, 9]
for num in numbers:
if num % 2 == 0:
print(f"Найдено чётное число: {num}")
break
else:
print("Чётное число не найдено")
print("---")
# Случай, когда список содержит чётное число
numbers = [1, 3, 6, 7, 9]
for num in numbers:
if num % 2 == 0:
print(f"Найдено чётное число: {num}")
break
else:
print("Чётное число не найдено")
Ожидаемый вывод:
未找到偶数 --- 找到偶数: 6
Пояснение к коду:
- Первый пример: после перебора всего списка (без выполнения break) выполняется else.
- Второй пример: после нахождения чётного числа выполняется break, пропуская else.
Пример 2: Типичное применение — поиск простых чисел
Пример
def is_prime(n):
if n <= 1:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
print(f"{n} не является простым числом, оно делится на {i}")
return False
else:
# Цикл завершается нормально, значит, делитель не найден
print(f"{n} является простым числом")
return True
#
is_prime(7) # Вывод: 7 является простым числом
is_prime(10) # Вывод: 10 не является простым числом, оно делится на 2
Ожидаемый вывод:
7 是质数 10 不是质数,能被 2 整除
Это одно из самых классических применений for-else: после завершения обхода поиска, если цель не найдена, выполняется else.
Пример 3: Сравнение с break
Пример
fruits = ["яблоко", "банан", "апельсин", "grape"]
# Использование for-else
print("=== Использование for-else ===")
for fruit in fruits:
if fruit == "апельсин":
print(f"Найдено: {fruit}")
break
print(f"Проверка: {fruit}")
else:
print("Цель не найдена")
print("\n"=== Без использования break ===")
# Другой способ (без использования else)
found = False
for fruit in fruits:
if fruit == "апельсин":
print(f"Найдено: {fruit}")
found = True
break
print(f"Проверка: {fruit}")
if not found:
print("Цель не найдена")
Ожидаемый вывод:
=== 使用 for-else === 检查: apple 检查: banana 找到: orange === 不使用 else === 检查: apple 检查: banana 找到: orange
Синтаксис for-else более краток и не требует дополнительной переменной-флага.
Пример 4: Обработка завершения цикла
Пример
scores = [85, 90, 78, 92, 88]
# Проверить, есть ли неудовлетворительные оценки
print("=== Проверить, есть ли неудовлетворительные оценки ===")
for score in scores:
if score < 60:
print(f"Найдена неудовлетворительная оценка: {score}")
break
print(f"{score} баллов, сдано")
else:
print("Все оценки зачтены")
# Другой сценарий: выполнить очистку после завершения всей обработки
print("\n"=== Очистка после завершения обработки ===")
files = ["a.txt", "b.txt", "c.txt"]
for file in files:
print(f"Обработка файла: {file}")
else:
print("Все файлы обработаны, выполняю очистку")
print("--- Очистка завершена ---")
Ожидаемый вывод:
=== 检查是否有不及格 === 85 分,合格 90 分,合格 78 分,合格 92 分,合格 88 分,合格 所有成绩都及格 === 处理完成后清理 === 处理文件: a.txt 处理文件: b.txt 处理文件: c.txt 所有文件处理完成,执行清理工作 --- 清理完成 ---
for-else также можно использовать в сценариях, где вы "выполняете очистку после завершения".
Пример 5: Практическое применение - Проверка входа
Пример
def try_login(username, password):
valid_users = {
"admin": "123456",
"user": "password",
"guest": "guest"
}
print(f"Попытка входа: {username}")
for user, pwd in valid_users.items():
if user == username and pwd == password:
print("Вход выполнен успешно!")
return True
else:
# После перебора всех пользователей совпадений не найдено
print("Неверное имя пользователя или пароль")
return False
#
try_login("admin", "123456") # Вывод: Вход выполнен успешно
print("---")
try_login("admin", "wrong") # Вывод: Неверное имя пользователя или пароль
Ожидаемый вывод:
尝试登录: admin 登录成功! --- 尝试登录: admin 用户名或密码错误
for-else очень полезен в сценариях обхода и поиска, четко выражая логику "не найдено".
Примечания
elseelse неifчасть if, а скорееforчасть for.- Не
elseиifпутайте for-else с if-else. - Этот синтаксис уникален для Python; в других языках его нет.
Другие расширения
Операторы цикла Python3