@bifronte
учусь

Как вернуть значение из функции?

Здравствуйте! Мне нужно вернуть три переменные из функции. Проблема в том что одна из них находиться в цикле for, а две другие нет. Одним return не получается. Хотел поинтересоваться есть ли какой то выход? Или стоит попробовать занести их в класс и потом взять от туда? Заметил что переменные gray и img тоже стоят в цикле но возвращаются нормально, почему так?

def detect(gray, img):
    num_img = np.zeros(img.shape[:2], 'uint8')
    result_face = faces.detectMultiScale(gray, 1.3, 5)
    for (x, y, w, h) in result_face:
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
        rect = cv2.rectangle(num_img.copy(), (x, y), (x + w, y + h), 255, -1)

        num_img = cv2.bitwise_and(gray, gray, mask=rect)
        clahe = cv2.createCLAHE(clipLimit=6, tileGridSize=(60, 60))
        lab_img = cv2.cvtColor(num_img, cv2.COLOR_GRAY2BGR)
        lab = cv2.cvtColor(lab_img, cv2.COLOR_BGR2LAB)
        l, a, b = cv2.split(lab)
        l2 = clahe.apply(l)
        lab = cv2.merge((l2, a, b))
        lab_gray = cv2.cvtColor(lab, cv2.COLOR_LAB2BGR)

        result_smile = smile.detectMultiScale(lab_gray, 1.2, 100)
        for (sx, sy, sw, sh) in result_smile:
            cv2.rectangle(img, (sx, sy), (sx + sw, sy + sh), (255, 0, 0), 2)

        return lab_gray
    return img, gray
  • Вопрос задан
  • 168 просмотров
Решения вопроса 2
Maksim_64
@Maksim_64
Data Analyst
Когда требуется вернуть несколько значений то их собирают в коллекцию например список, кортеж и возвращают. Например return img, gray перед возвращением будет создан объект кортеж и затем возвращен туда откуда была вызвана функция.
инструкция return означает выход из функции, при условии что функция не рекурсивная (там return может останавливать рекурсию, но не обязательно выходить из функции). Твоя функция обычная и в ней есть два return

То есть по идее ты хочешь сделать два альтернативных условия выхода из функции при этом в ней нет не каких условий. Он дойдет доreturn lab_gray при чем первый раз он и цикл то не выполнит весь если там больше одного элемента вернет значение и выйдет из функции. При условии что объект по которому ты итерируешься не пуст, иначе он пропустит цикл и вернет return img, gray

lab_gray у тебя инициализируется внутри цикла то есть ты можешь потенциально вернуть только последнее состояние. Насчет img, gray ты передал их параметрами и они доступны в локальной области видимости функции.

Сама конструкция твоей функции выглядит бессмысленной, так что изучай python. Просто простой python.
Ответ написан
Mike_Ro
@Mike_Ro Куратор тега Python
Python, JS, WordPress, SEO, Bots, Adversting
bifronte,
Мне нужно вернуть три переменные из функции. Проблема в том что одна из них находиться в цикле for, а две другие нет.

Я не хочу делать два альтернативных выхода

Если я правильно понял задачу, то:
1. Объявляем все возвращаемые данные заранее (те 3 переменные) с дефолтным значением, напр: var1, var2, var3: '', '', ''
2. Изменяем данные из п1. по необходимости в процессе выполнения функции.
3. Возвращаем данные из п1 в виде словаря: {'data1': var1, 'data2': var2, 'data3': var3}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы