← Назад к вопросам

Какие знаешь типы циклов, кроме For?

1.2 Junior🔥 71 комментариев
#Java#Python

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Типы циклов в программировании

В автоматизации тестирования и разработке на Python (как основном языке для QA Automation) я активно использую несколько типов циклов, каждый из которых имеет свою специфику применения. Помимо классического for, существуют другие фундаментальные конструкции.

Основные типы циклов

1. Цикл While

Это условный цикл, который выполняется до тех пор, пока заданное условие истинно (True). Он идеально подходит для ситуаций, когда количество итераций заранее неизвестно.

# Пример: Ожидание появления элемента на странице в Selenium
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time

timeout = 10
polling_interval = 0.5
start_time = time.time()

while time.time() - start_time < timeout:
    try:
        element = driver.find_element(By.ID, "dynamic-element")
        if element.is_displayed():
            print("Элемент найден!")
            break
    except:
        pass
    time.sleep(polling_interval)
else:
    print("Элемент не появился за отведенное время")

Ключевые особенности while:

  • Проверка условия происходит перед каждой итерацией
  • Риск бесконечного цикла при некорректном условии
  • Часто используется с break для досрочного выхода

2. Цикл Do-While (в языках, где он поддерживается)

В Python нет встроенного цикла do-while, но его логику можно реализовать. Этот цикл гарантирует как минимум однократное выполнение тела цикла, так как условие проверяется после итерации.

# Эмуляция do-while в Python
max_attempts = 3
attempt = 0

while True:
    attempt += 1
    print(f"Попытка выполнить операцию: {attempt}")
    # Код операции, например, подключение к базе данных
    success = perform_operation()
    
    if success or attempt >= max_attempts:
        break

3. Итерационные циклы For-Each

В Python классический for фактически является for-each циклом, работающим с итераторами. Это принципиальное отличие от for в C-подобных языках.

# For-each для работы с коллекциями
test_results = [
    {"test_case": "login_test", "status": "passed"},
    {"test_case": "checkout_test", "status": "failed"},
    {"test_case": "search_test", "status": "passed"}
]

# Итерация по коллекции объектов
for result in test_results:
    if result["status"] == "failed":
        print(f"Требуется анализ падения: {result['test_case']}")
        log_failure_details(result)

4. Рекурсия как альтернатива циклам

Хотя технически это не цикл, рекурсия решает аналогичные задачи через вызов функции самой себя.

# Пример: Рекурсивный обход директории для поиска тестовых файлов
import os

def find_test_files(directory, extension=".py"):
    test_files = []
    for item in os.listdir(directory):
        path = os.path.join(directory, item)
        if os.path.isdir(path):
            # Рекурсивный вызов для поддиректорий
            test_files.extend(find_test_files(path, extension))
        elif item.endswith(extension) and "test" in item.lower():
            test_files.append(path)
    return test_files

# Использование
test_files_list = find_test_files("/project/tests")

Сравнительная таблица применения циклов в автоматизации

ЦиклОсновное применение в QA AutomationПреимуществаРиски
WhileОжидание элементов, опрос статусов, работа с очередямиГибкость, не требует знания количества итерацийБесконечный цикл при ошибке в условии
For (foreach)Обработка коллекций, параметризация тестов, чтение данныхЧитаемость, безопасность, работа с итераторамиОграничен коллекциями/итерируемыми объектами
РекурсияОбход деревьев (DOM, файловая система), сложные алгоритмыЭлегантность для рекурсивных структурРиск переполнения стека, сложность отладки

Практическое применение в тестировании

В автоматизации тестирования я выбираю тип цикла исходя из задачи:

  • For - для параметризированных тестов, обработки тестовых данных из CSV/JSON
  • While - для реализации ожиданий (explicit waits), мониторинга состояния системы
  • Рекурсия - для парсинга сложных JSON-ответов API, обхода древовидных структур
# Комбинированный пример: обработка результатов API-тестов
api_responses = get_test_results_from_api()

for response in api_responses:
    attempt = 0
    max_retries = 3
    
    while attempt < max_retries:
        if validate_response(response):
            log_success(response)
            break
        else:
            attempt += 1
            response = retry_request(response["id"])
    else:
        log_persistent_failure(response)

Понимание особенностей каждого типа циклов позволяет писать более эффективный, надежный и поддерживаемый код для автоматизации тестирования, что критически важно для построения стабильных тестовых фреймворков.