Для цикла, заканчивающегося рано во вложенных ifs и функции из-за возврата - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь решить следующий практический вопрос:

"Представьте, что вы пишете программное обеспечение для системы инвентаризации для магазин. Часть программного обеспечения должна проверить, чтобы увидеть, если введено коды продуктов действительны.

Код продукта действителен, если выполнены все следующие условия правда:

  • Длина кода продукта кратна 4. Это может длиной 4, 8, 12, 16, 20 и т. д.
  • Каждый символ в коде продукта является заглавным символ или цифра. Нет строчных букв или знаков препинания оценки разрешены.
  • Последовательность символов "A1" появляется где-то в код продукта.

Написать функцию с именем valid_product_code. valid_product_code должен иметь один параметр, строку. Должен вернуть True, если строка является допустимым кодом продукта, и False, если это не так. "

def valid_product_code(code):
    if len(code)%4 == 0:
        if "A1" in code:
            if code.isalnum():
                for character in code:
                    #print(character) 
                    #print statement above when uncommented used to 
                    #check if the loop is actually running as intended
                    if character.isupper() or character.isdigit():
                        return True
                    else:
                        return False
            else:
                return False
        else:
            return False
    else:
        return False

В практическом вопросе было несколько тестовых строк, из которых они включали следующее:

print(valid_product_code("A12B44BP"))
print(valid_product_code("BFDSAUSA98932RWEFOEWA9FEAA1DSFSF"))
print(valid_product_code("A1BBD5"))
print(valid_product_code("BDD5664S"))
print(valid_product_code("66aBSaA1fdsv"))

Мой код работал для первых четырех примеров, в результате чего True, True, False, False, но в то время как последний должен быть False, я получил True. После попытки некоторой отладки (отсюда print(character) в цикле for и изменения операторов return True и return False на print(True) и print(False) соответственно) операторы print, которые я использовал для проверки, указывали, что строчные буквы все имел значения False, тогда как цифры и заглавные буквы имели значения True, как и предполагалось.

У меня не было проблем с 3 внешними операторами if, но как только мне нужно было изолировать строчные буквы, я подумал, что цикла for-each будет достаточно, но тот факт, что это функция означает, что return завершает мою функцию преждевременно и не позволяя мне фактически указать, что присутствие даже единственной строчной буквы во всей строке должно отобразить значение всей строки как False. Я чувствую, что чего-то не хватает, например, может быть, я помещаю свои return утверждения в неправильное место, или я просто неправильно подошел к этому вопросу?

Пожалуйста, помогите и спасибо заранее!

1 Ответ

0 голосов
/ 13 января 2019

Ваш внутренний цикл не реализован правильно. В настоящий момент if character.isupper() or character.isdigit(): вернет True, как только обнаружит первые 6.

Вы должны проверить для каждого элемента. Это можно сделать следующим образом. Я выделяю измененные строки комментарием #

def valid_product_code(code):
    if len(code)%4 == 0:
        if "A1" in code:
            if code.isalnum():
                for character in code:
                    if not (character.isupper() or character.isdigit()): # <---
                        return False # <----
                return True # <---
            else:
                return False
        else:
            return False
    else:
        return False

print(valid_product_code("A12B44BP"))
print(valid_product_code("BFDSAUSA98932RWEFOEWA9FEAA1DSFSF"))
print(valid_product_code("A1BBD5"))
print(valid_product_code("BDD5664S"))
print(valid_product_code("66aBSaA1fdsv"))

True
True
False
False
False

В качестве альтернативы , вы можете объединить ваши операторы if, чтобы сделать код более компактным, как

def valid_product_code(code):
    if len(code)%4 == 0 and "A1" in code and code.isalnum():
                for character in code:
                    if not (character.isupper() or character.isdigit()):
                        return False
                return True
    else:
        return False
...